Использование класса IME

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Класс IME позволяет манипулировать редактором методов ввода (IME) в проигрывателе Flash Player или Adobe AIR.

С помощью ActionScript можно определить следующее:

  • установлен ли редактор IME на компьютере пользователя ( Capabilities.hasIME );

  • включен или отключен редактор IME на компьютере пользователя ( IME.enabled );

  • текущий режим преобразования в редакторе IME ( IME.conversionMode ).

Можно связать поле вводимого текста с определенным контекстом редактора IME. Переключаясь между полями ввода, можно также переключать редактор IME между хираганой (японский), полноширинными цифрами, полуширинными цифрами, прямым вводом и т.д.

Редакторы IME дают пользователям возможность вводить тексты с многобайтовыми символами, отличными от ASCII, на таких языках, как китайский, японский и корейский.

Дополнительные сведения о работе с редактором IME см. в документации по операционной системе, для которой разрабатывается приложение. Дополнительные ресурсы доступны на следующих веб-сайтах:

Примечание. Если редактор IME не активен на компьютере пользователя, то обращения к методам или свойствам IME, отличным от Capabilities.hasIME , будут завершаться ошибками. Как только редактор IME будет активирован вручную, последующие обращения ActionScript к методам и свойствам IME будут срабатывать ожидаемым образом. Например, если используется редактор IME для ввода японских иероглифов, его необходимо активировать перед тем, как вызывать методы и свойства класса IME.

Проверка доступности редактора IME

Перед тем как вызывать методы и свойства класса IME, необходимо всегда проверять, установлен ли на клиентском компьютере редактор IME и включен ли он. Следующий код демонстрирует, как можно убедиться, что пользователь установил и активировал редактор IME, прежде чем вызывать методы.

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

Предыдущий код сначала проверяет, установлен ли редактор IME, с помощью свойства Capabilities.hasIME . Если это свойство имеет значение true , то код проверяет, включен ли редактор IME в данный момент, с помощью свойства IME.enabled .

Определение текущего режима преобразования в редакторе IME

В процессе создания многоязычных приложений может потребоваться определить, какой режим преобразования в данный момент активен в редакторе IME. Следующий код демонстрирует, как можно проверить, установлен ли редактор IME и, если да, какой режим преобразования активен в данный момент.

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

Предыдущий код сначала проверяет, установлен ли редактор IME. Затем он проверяет текущий режим преобразования IME сравнивая свойство IME.conversionMode с константами класса IMEConversionMode.

Установка режима преобразования в редакторе IME

В процессе изменения режима преобразования в клиентском редакторе IME необходимо поместить код в блок try..catch , так как установка режима преобразования с помощью свойства conversionMode может вызвать ошибку, если редактор IME не сможет перейти в заданный режим. Следующий код демонстрирует использование блока try..catch при определении свойства 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; 
    } 
}

Предыдущий код сначала создает текстовое поле с целью отображения сообщения о состоянии для пользователя. После этого, если редактор IME установлен, код включает его и устанавливает режим корейского языка. Если в системе пользователя не установлен редактор IME, проигрыватель Flash Player или AIR выдает ошибку, которую перехватывает блок try..catch . Блок try..catch отображает сообщение об ошибке в текстовом поле, созданном ранее.

Отключение редактора IME для определенных текстовых полей

В некоторых случаях требуется отличать редактор IME пользователя для полей ввода. Например, если есть текстовое поле, принимающее только цифры, нежелательно, чтобы редактор IME вмешивался и замедлял ввод данных.

В следующем примере показано, как можно прослушивать события FocusEvent.FOCUS_IN и FocusEvent.FOCUS_OUT и выключать редактор IME требуемым образом.

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

В этом примере создается два текстовых поля ввода, phoneTxt и nameTxt , а затем добавляется два прослушивателя событий для поля phoneTxt . Когда пользователь переводит фокус на текстовое поле phoneTxt , отправляется событие FocusEvent.FOCUS_IN , и редактор IME отключается. Когда текстовое поле phoneTxt теряет фокус, отправляется событие FocusEvent.FOCUS_OUT , и редактор IME включается снова.

Прослушивание событий композиции IME

События композиции IME отправляются в момент задания строки композиции. Например, если пользователь включил и активировал редактор IME и вводит строку на японском, событие IMEEvent.IME_COMPOSITION будет отправлено, как только он выберет строку композиции. Чтобы прослушивать событие IMEEvent.IME_COMPOSITION , необходимо добавить прослушиватель событий для статического свойства ime в классе System ( flash.system.System.ime.addEventListener(...) ), как показано в следующем примере.

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

Предыдущий код создает два текстовых поля и добавляет их в список отображения. Первое текстовое поле, inputTxt , является полем ввода, в которое пользователь может ввести японский текст. Второе текстовое поле, outputTxt , является динамическим текстовым полем, в котором отображаются сообщения об ошибке и дублируется японская строка, введенная пользователем в поле inputTxt .