Uso de la clase IME

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

La clase IME permite manipular el IME del sistema operativo en Flash Player o Adobe AIR.

También se puede utilizar código ActionScript para determinar lo siguiente:

  • Si hay instalado un IME en el equipo del usuario ( Capabilities.hasIME ).

  • Si el IME está activado o desactivado en el equipo del usuario ( IME.enabled ).

  • El modo de conversión utilizado por el IME actual ( IME.conversionMode ).

Se puede asociar un campo de entrada de texto con un contexto de IME específico. Al cambiar de un campo de entrada a otro, también se puede cambiar el IME a Hiragana (Japonés), números de anchura completa, números de anchura media, entrada directa, etc..

Un IME permite al usuario introducir caracteres de texto en idiomas multibyte, como chino, japonés o coreano, con una codificación distinta de ASCII.

Para más información sobre los IME, consulte la documentación del sistema operativo para el que desarrolla la aplicación. Para ver recursos adicionales, consulte los siguientes sitios web:

Nota: si un IME no está activo en el ordenador del usuario, fallarán todas las llamadas a los métodos o propiedades IME que no sean Capabilities.hasIME . Tras activar manualmente un IME, las siguientes llamadas de ActionScript a métodos y propiedades IME funcionarán como se esperaba. Por ejemplo, si se utiliza un IME japonés, debe estar activado antes de llamar a cualquier método o propiedad del IME.

Comprobar si un IME está instalado y activado

Antes de llamar a cualquiera de los métodos o propiedades del IME, siempre se debe comprobar si en el equipo del usuario hay actualmente un IME instalado y activado. El código siguiente ilustra la manera de comprobar que el usuario tiene un IME instalado y activado antes de llamar a sus métodos:

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."); 
}

El código anterior comprueba primero si el usuario tiene un IME instalado mediante la propiedad Capabilities.hasIME . Si esta propiedad está establecida en true , el código consulta la propiedad IME.enabled para comprobar si el IME del usuario está activado actualmente.

Determinar el modo de conversión del IME activado actualmente

Al crear aplicaciones multilingües, es posible que sea necesario determinar el modo de conversión que el usuario tiene activo actualmente. El código siguiente ilustra la manera de comprobar si el usuario tiene un IME instalado y, en caso afirmativo, qué modo de conversión de IME está activo actualmente:

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."; 
}

El código anterior comprueba primero si el usuario tiene un IME instalado. A continuación comprueba el modo de conversión utilizado por el IME actual comparando el valor de la propiedad IME.conversionMode con cada una de las constantes de la clase IMEConversionMode.

Definición del modo de conversión del IME

Cuando se cambia el modo de conversión del IME del usuario, es necesario asegurarse de que el código está incluido en un bloque try..catch , ya que definir un modo de conversión utilizando la propiedad conversionMode puede generar un error si el IME no puede establecer el modo de conversión. El código siguiente muestra cómo utilizar un bloque try..catch al establecer la propiedad 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; 
    } 
}

El código anterior crea primero un campo de texto, que se utiliza para mostrar un mensaje de estado al usuario. A continuación, si el IME está instalado, el código lo activa y establece el modo de conversión en Coreano. Si el equipo del usuario no tiene un IME coreano instalado, Flash Player o AIR emite un error que es detectado por el bloque try..catch . El bloque try..catch muestra el mensaje de error en el campo de texto creado previamente.

Desactivar el IME para determinados campos de texto

En algunos casos, es posible que se desee desactivar el IME del usuario mientras este escribe caracteres. Por ejemplo, si hay un campo de texto que solo acepta entradas numéricas, es posible que no interese que aparezca el IME y ralentice la entrada de datos.

En el ejemplo siguiente se ilustra la manera de detectar eventos FocusEvent.FOCUS_IN y FocusEvent.FOCUS_OUT , y de desactivar el IME del usuario:

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; 
    } 
}

Este ejemplo crea dos campos de entrada de texto, phoneTxt y nameTxt , y después añade dos detectores de eventos al campo de texto phoneTxt . Cuando el usuario establece la selección en el campo de texto phoneTxt , se distribuye un evento FocusEvent.FOCUS_IN y se desactiva el IME. Cuando el campo de texto phoneTxt deja de estar seleccionado, se distribuye el evento FocusEvent.FOCUS_OUT para volver a activar el IME.

Detección de eventos de composición del IME

Cuando se establece una cadena de composición, se distribuyen eventos de composición del IME. Por ejemplo, si el usuario activa su IME y escribe una cadena en japonés, se distribuye el evento IMEEvent.IME_COMPOSITION en cuanto el usuario seleccione la cadena de composición. Para poder detectar el evento IMEEvent.IME_COMPOSITION , hay que añadir un detector de eventos a la propiedad estática ime de la clase System ( flash.system.System.ime.addEventListener(...) ), como se indica en el siguiente ejemplo:

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; 
}

El código anterior crea dos campos de texto y los añade a la lista de visualización. El primer campo de texto, inputTxt , es un campo de entrada de texto que permite al usuario escribir texto en japonés. El segundo campo de texto, outputTxt , es un campo de texto dinámico que muestra mensajes de error al usuario o reproduce la cadena en japonés que el usuario escribe en el campo de texto inputTxt .