Using the IME class

Flash Player 9 and later, Adobe AIR 1.0 and later

The IME class lets you manipulate the operating system’s IME within Flash Player or Adobe AIR.

Using ActionScript, you can determine the following:

  • If an IME is installed on the user's computer (Capabilities.hasIME)

  • If the IME is enabled or disabled on the user’s computer (IME.enabled)

  • The conversion mode the current IME is using (IME.conversionMode)

You can associate an input text field with a particular IME context. When you switch between input fields, you can also switch the IME between Hiragana (Japanese), full-width numbers, half-width numbers, direct input, and so on.

An IME lets users type non-ASCII text characters in multibyte languages, such as Chinese, Japanese, and Korean.

For more information on working with IMEs, see the documentation for the operating system for which you are developing the application. For additional resources, see the following web sites:

Note: If an IME is not active on the user's computer, calls to IME methods or properties, other than Capabilities.hasIME, will fail. Once you manually activate an IME, subsequent ActionScript calls to IME methods and properties will work as expected. For example, if you are using a Japanese IME, you must activate it before you can call any IME method or property.

Checking if an IME is installed and enabled

Before you call any of the IME methods or properties, you should always check to see if the user’s computer currently has an IME installed and enabled. The following code illustrates how to check that the user has an IME both installed and active before you call any methods:

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

The previous code first checks to see if the user has an IME installed using the Capabilities.hasIME property. If this property is set to true, the code then checks whether the user’s IME is currently enabled, using the IME.enabled property.

Determining which IME conversion mode is currently enabled

When building multilingual applications, you may need to determine which conversion mode the user currently has active. The following code demonstrates how to check whether the user has an IME installed, and if so, which IME conversion mode is currently active:

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

The previous code first checks to see whether the user has an IME installed. Next it checks which conversion mode the current IME is using by comparing the IME.conversionMode property against each of the constants in the IMEConversionMode class.

Setting the IME conversion mode

When you change the conversion mode of the user’s IME, you need to make sure that the code is wrapped in a try..catch block, because setting a conversion mode using the conversionMode property can throw an error if the IME is unable to set the conversion mode. The following code demonstrates how to use a try..catch block when setting the IME.conversionMode property:

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

The previous code first creates a text field, which is used to display a status message to the user. Next, if the IME is installed, the code enables the IME and sets the conversion mode to Korean. If the user’s computer does not have a Korean IME installed, an error is thrown by Flash Player or AIR and is caught by the try..catch block. The try..catch block displays the error message in the previously created text field.

Disabling the IME for certain text fields

In some cases, you may want to disable the user’s IME while they type characters. For example, if you had a text field that only accepts numeric input, you may not want the IME to come up and slow down data entry.

The following example demonstrates how you can listen for the FocusEvent.FOCUS_IN and FocusEvent.FOCUS_OUT events and disable the user’s IME accordingly:

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

This example creates two input text fields, phoneTxt and nameTxt, and then adds two event listeners to the phoneTxt text field. When the user sets focus to the phoneTxt text field, a FocusEvent.FOCUS_IN event is dispatched and the IME is disabled. When the phoneTxt text field loses focus, the FocusEvent.FOCUS_OUT event is dispatched to re-enable the IME.

Listening for IME composition events

IME composition events are dispatched when a composition string is being set. For example, if the user has their IME enabled and active and types a string in Japanese, the IMEEvent.IME_COMPOSITION event would dispatch as soon as the user selects the composition string. In order to listen for the IMEEvent.IME_COMPOSITION event, you need to add an event listener to the static ime property in the System class (flash.system.System.ime.addEventListener(...)), as shown in the following example:

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

The previous code creates two text fields and adds them to the display list. The first text field, inputTxt, is an input text field that allows the user to enter Japanese text. The second text field, outputTxt, is a dynamic text field that displays error messages to the user, or echoes the Japanese string that the user types into the inputTxt text field.