Uso da classe IME
Flash Player 9 e posterior, Adobe AIR 1.0 e posterior
A classe IME permite manipular o IME do sistema operacional de dentro do Flash Player ou do Adobe AIR.
Usando o ActionScript, é possível determinar o seguinte:
Se um IME está instalado no computador do usuário (Capabilities.hasIME)
Se o IME está ativado ou desativado no computador do usuário (IME.enabled)
O modo de conversão do IME atual está usando (IME.conversionMode)
É possível associar um campo de texto de entrada a um contexto de IME específico. Ao alternar entre campos de texto, também é possível alternar o IME entre Hiragana (japonês), números de largura total, números de meia largura, entrada direta e assim por diante.
Um IME permite que os usuários digitem caracteres de texto não-ASCII em idiomas com vários bytes, como chinês, japonês e coreano.
Para obter mais informações sobre como trabalhar com IMEs, consulte a documentação do sistema operacional no qual você está desenvolvendo o aplicativo. Para obter recursos adicionais, consulte os seguintes sites:
Nota: Se o IME não estiver ativo no computador do usuário, chamadas para métodos ou propriedades do IME, que não sejam Capabilities.hasIME, falharão. Depois de ativar manualmente o IME, chamadas subseqüentes do ActionScript para métodos e propriedades do IME funcionarão conforme o esperado. Por exemplo, se estiver usando um IME japonês, você deverá ativá-lo para poder chamar qualquer método ou propriedade do IME.
Verificação da instalação e ativação do IME
Antes de chamar qualquer um dos métodos ou propriedades do IME, você deve sempre verificar se o computador do usuário tem um IME instalado e ativado. O código a seguir ilustra como verificar se o usuário tem um IME instalado e ativo antes de chamar qualquer método:
if (Capabilities.hasIME)
{
if (IME.enabled)
{
trace("IME is installed and enabled.");
}
else
{
trace("IME is installed but not enabled. Please enable your IME and try again.");
}
}
else
{
trace("IME is not installed. Please install an IME and try again.");
}
O código anterior primeiro verifica se o usuário tem um IME instalado usando a propriedade Capabilities.hasIME. Se essa propriedade estiver definida como true, o código verificará se o IME do usuário está ativado usando a propriedade IME.enabled.
Determinação de qual modo de conversão do IME está ativado
Ao criar aplicativos multilíngüe, talvez seja necessário determinar qual modo de conversão está ativo para o usuário. O código a seguir demonstra como verificar se o usuário tem um IME instalado e, nesse caso, qual modo de conversão do IME está ativo no momento:
if (Capabilities.hasIME)
{
switch (IME.conversionMode)
{
case IMEConversionMode.ALPHANUMERIC_FULL:
tf.text = "Current conversion mode is alphanumeric (full-width).";
break;
case IMEConversionMode.ALPHANUMERIC_HALF:
tf.text = "Current conversion mode is alphanumeric (half-width).";
break;
case IMEConversionMode.CHINESE:
tf.text = "Current conversion mode is Chinese.";
break;
case IMEConversionMode.JAPANESE_HIRAGANA:
tf.text = "Current conversion mode is Japananese Hiragana.";
break;
case IMEConversionMode.JAPANESE_KATAKANA_FULL:
tf.text = "Current conversion mode is Japanese Katakana (full-width).";
break;
case IMEConversionMode.JAPANESE_KATAKANA_HALF:
tf.text = "Current conversion mode is Japanese Katakana (half-width).";
break;
case IMEConversionMode.KOREAN:
tf.text = "Current conversion mode is Korean.";
break;
default:
tf.text = "Current conversion mode is " + IME.conversionMode + ".";
break;
}
}
else
{
tf.text = "Please install an IME and try again.";
}
O código anterior primeiro verifica se o usuário tem um IME instalado. Em seguida, ele verifica qual modo de conversão o IME atual está usando, comparando a propriedade IME.conversionMode com cada uma das constantes na classe IMEConversionMode.
Configuração do modo de conversão do IME
Quando você altera o modo de conversão do IME do usuário, é necessário verificar se o código está inserido em um bloco try..catch, porque a configuração de um modo de conversão usando a propriedade conversionMode poderá emitir um erro, se o IME não puder definir o modo de conversão. O código a seguir demonstra como usar um bloco try..catch ao definir a propriedade IME.conversionMode:
var statusText:TextField = new TextField;
statusText.autoSize = TextFieldAutoSize.LEFT;
addChild(statusText);
if (Capabilities.hasIME)
{
try
{
IME.enabled = true;
IME.conversionMode = IMEConversionMode.KOREAN;
statusText.text = "Conversion mode is " + IME.conversionMode + ".";
}
catch (error:Error)
{
statusText.text = "Unable to set conversion mode.\n" + error.message;
}
}
O código anterior primeiro cria um campo de texto que é usado para exibir uma mensagem de status para o usuário. Em seguida, se o IME estiver instalado, o código ativará o IME e definirá o modo de conversão como coreano. Se o computador do usuário não tiver um IME coreano instalado, o Flash Player ou o AIR emitirá um erro que será capturado pelo bloco try..catch. O bloco try..catch exibe a mensagem de erro no campo de texto criado anteriormente.
Desativação do IME para determinados campos de texto
Em alguns casos, convém desativar o IME do usuário enquanto ele digita caracteres. Por exemplo, se você tiver um campo de texto que aceita apenas entrada numérica, é conveniente ativar o IME e diminuir a velocidade da entrada de dados.
O exemplo a seguir demonstra como é possível ouvir os eventos FocusEvent.FOCUS_IN e FocusEvent.FOCUS_OUT e desativar o IME do usuário de maneira correspondente:
var phoneTxt:TextField = new TextField();
var nameTxt:TextField = new TextField();
phoneTxt.type = TextFieldType.INPUT;
phoneTxt.addEventListener(FocusEvent.FOCUS_IN, focusInHandler);
phoneTxt.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler);
phoneTxt.restrict = "0-9";
phoneTxt.width = 100;
phoneTxt.height = 18;
phoneTxt.background = true;
phoneTxt.border = true;
addChild(phoneTxt);
nameField.type = TextFieldType.INPUT;
nameField.x = 120;
nameField.width = 100;
nameField.height = 18;
nameField.background = true;
nameField.border = true;
addChild(nameField);
function focusInHandler(event:FocusEvent):void
{
if (Capabilities.hasIME)
{
IME.enabled = false;
}
}
function focusOutHandler(event:FocusEvent):void
{
if (Capabilities.hasIME)
{
IME.enabled = true;
}
}
Esse exemplo cria dois campos de texto de entrada, phoneTxt e nameTxt e, em seguida, adiciona dois ouvintes de eventos ao campo de texto phoneTxt. Quando o usuário define o foco para o campo de texto phoneTxtum evento FocusEvent.FOCUS_IN é despachado e o IME é desativado. Quando o campo de texto phoneTxt perde o foco, o evento FocusEvent.FOCUS_OUT é despachado para reativar o IME.
Ouvir eventos de composição do IME
Os eventos de composição do IME são despachados quando uma string de composição está sendo definida. Por exemplo, se o usuário tiver o IME habilitado e ativo e digitar uma string em japonês, o evento IMEEvent.IME_COMPOSITION despachará assim que o usuário selecionar a string da composição. Para ouvir o evento IMEEvent.IME_COMPOSITION, é necessário adicionar um ouvinte de eventos à propriedade estática ime na classe System (flash.system.System.ime.addEventListener(...)), conforme mostrado no exemplo a seguir:
var inputTxt:TextField;
var outputTxt:TextField;
inputTxt = new TextField();
inputTxt.type = TextFieldType.INPUT;
inputTxt.width = 200;
inputTxt.height = 18;
inputTxt.border = true;
inputTxt.background = true;
addChild(inputTxt);
outputTxt = new TextField();
outputTxt.autoSize = TextFieldAutoSize.LEFT;
outputTxt.y = 20;
addChild(outputTxt);
if (Capabilities.hasIME)
{
IME.enabled = true;
try
{
IME.conversionMode = IMEConversionMode.JAPANESE_HIRAGANA;
}
catch (error:Error)
{
outputTxt.text = "Unable to change IME.";
}
System.ime.addEventListener(IMEEvent.IME_COMPOSITION, imeCompositionHandler);
}
else
{
outputTxt.text = "Please install IME and try again.";
}
function imeCompositionHandler(event:IMEEvent):void
{
outputTxt.text = "you typed: " + event.text;
}
O código anterior cria dois campos de texto e os adiciona à lista de exibição. O primeiro campo de texto, inputTxt, é um campo de texto de entrada que permite que o usuário digite texto japonês. O segundo campo de texto, outputTxt, é um campo de texto dinâmico que exibe mensagens de erro para o usuário ou ecoa a string em japonês que o usuário digita no campo de texto inputTxt.