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 subsequentes 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íngue, 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 phoneTxt um 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 .