Статьи

Улучшение поддержки i18n в FEST-Swing

FEST-Swing — это библиотека Java, выпущенная под лицензией Apache 2.0, которая обеспечивает свободный интерфейс для функционального тестирования Swing GUI. Под прикрытием он использует робота AWT для генерации собственных событий ввода, что является наиболее надежным способом имитации взаимодействия пользователя с приложением (IMHO). Например, следующий код:

loginDialog.textbox("username").enterText("hsolo");

введите текст «hsolo» в текстовое поле с именем «username» в диалоге входа. FEST-Swing фактически генерирует нажатия собственных клавиш при вводе такого текста. Чтобы добиться этого, нам нужно сопоставление между вводимым символом и кодом клавиши, которую нужно нажать, а также любые модификаторы (например, клавиша Shift). Эти сопоставления определены как реализации интерфейса KeyStrokeMappingProvider. Например, KeyStrokeMappingProvider_en определяет следующие сопоставления для английского языка:

mappings.add(mapping('a', VK_A, NO_MASK));
mappings.add(mapping('A', VK_A, SHIFT_MASK));

Эти сопоставления показывают, что символ «а» сопоставлен с клавишей «А» (VK_A) без модификаторов, а символ «А» сопоставлен с клавишами «А» и «Shift».

В версиях 1.1 и 1.2-alpha3 FEST-Swing пытается подобрать правильный KeyStrokeMappingProvider на основе языка локали по умолчанию (например, KeyStrokeMappingProvider_en для немецкого языка.) Если один из них не найден, он вернется к KeyStrokeMappingProvider_en.

Пользователи также могут указать свой собственный KeyStrokeMappingProvider следующим образом:

KeyStrokeMap.addKeyStrokesFrom(myOwnCoolMapping);

Эта проблема

Эта функция, хотя и довольно гибкая, вызывает некоторые проблемы:

  1. Отображение символов зависит не только от языка, но и от операционной системы.
  2. Пользователям нелегко создать собственный KeyStrokeMappingProvider для языков, не поддерживаемых в FEST-Swing.

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

Решение

Olivier DOREMIEUX, пользователь FEST-Swing, нашел блестящее решение для упомянутых выше проблем (будет включен в следующую версию, FEST-Swing 1.2rc — к концу апреля).

Он обнаружил, что сопоставления символов также зависят от операционной системы, а не только от локали. Теперь FEST-Swing попытается найти правильный KeyStrokeMappingProvider в зависимости от операционной системы и локали по умолчанию. Например, если операционная система Windows, а локаль — DE, FEST-Swing будет пытаться выполнить одно за другим, пока это не будет выполнено успешно:

  1. используйте семейство ОС, страну и язык: KeyStrokeProvider_win_de_de
  2. используйте семейство ОС и язык: KeyStrokeProvider_win_de
  3. используйте только язык: KeyStrokeProvider_de
  4. используйте значение по умолчанию: KeyStrokeProvider_en

Для второй проблемы Оливье предложил два решения:

  1. Разрешить пользователям указывать текстовый файл, содержащий сопоставления символов
  2. Предоставить инструмент для создания такого файла

В следующем выпуске (к концу апреля) FEST-Swing позволит пользователям анализировать текстовые файлы, содержащие сопоставления символов в формате [CHARACTER, KEY_CODE, MODIFIER_MAPPING], по одному сопоставлению в строке. Например:

a, A, NO_MASK
A, A, SHIFT_MASK

(обратите внимание, что для кода ключа не нужно использовать префикс «VK_»)

Чтобы использовать файл сопоставления, пользователям просто необходимо сделать следующее:

KeyStrokeMappingsParser parser = new KeyStrokeMappingsParser();
KeyStrokeProvider provider = parser.parse("myMappings.txt"); // there is also an overloaded version that takes a File
KeyStrokeMap.addKeyStrokesFrom(provider);

Чтобы упростить создание файлов сопоставления, я собрал небольшое приложение, которое записывает все введенные нажатия клавиш и сохраняет их в текстовом файле:

Это приложение в настоящее время доступно через Java Web Start . Для сохранения файлов сопоставлений требуется доступ к файловой системе.

Я ожидаю, что у меня будет установщик ко времени выпуска.

Спасибо Оливье!

Обратная связь всегда приветствуется ?

С http://alexruiz.developerblogs.com/?p=1102