Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество

Локализация JME 3 игры

Опубликованно: 03.05.2017, 12:28
Последняя редакция, Andry: 03.10.2017 12:40

Scope

Локализация приложения может означать несколько вещей:

  • Как минимум, вы переводите все сообщения и диалоги в пользовательском интерфейсе на целевые языки.
  • Вы также должны перевести read me, справочную и другую документацию.
  • Также перевод веб-контента, связанного с приложением, дает возможность пользователям из других стран узнать о вашей переведенной на их язык игре.
  • Если вы пройдете весь путь интернационализации, вы также «переведете метафоры в используемых изображениях или символах.
    Например. Для локализации языков справа налево вы также должны настроить весь поток пользовательского интерфейса (порядок меню и кнопок).

Есть инструменты, которые помогут вам локализовать графические интерфейсы Java Swing. Приложения jME3 обычно не имеют графического интерфейса Swing, поэтому эти инструменты не очень помогают. Просто придерживайтесь обычных правил Java об использовании Bundle Properties:

Подготовка локализации

jMonkeyEngine SDK поддерживает открытие и редактирование файлов Bundle.properties. Также обратите внимание на меню Сервис ▸ Интернационализация.

Чтобы подготовить приложение к локализации, сначала необходимо идентифицировать все жестко запрограммированные сообщения.

  1. Найдите каждую строку в своей игре jME3, где вы жестко закодировали строки сообщений, например.
    System.out.print("Hello World!");
    UiText.setText("Score: " + score);
  2. Создайте один файл с именем Bundle.properties в каждом каталоге, где есть Java-файл, содержащий сообщения.
  3. Для каждого жестко закодированного сообщения вы добавляете одну строку в файл Bundle.properties: сначала укажите уникальный ключ, который идентифицирует эту строку; затем знак равенства; и саму буквальную строку.
    greeting=Hello World!
    score.display=Score:
  4. В исходном коде замените каждое вхождение жестко закодированного сообщения соответствующим вызовом Resource Bundle на его уникальный ключ:
    System.out.print(ResourceBundle.getBundle("Bundle").getString("greeting"));
    UiText.setText(ResourceBundle.getBundle("Bundle").getString("score.display") + score);

Язык, используемый в файлах Bundle.properties, будет языком по умолчанию для вашей игры.

Перевод сообщений

Каждый дополнительный язык входит в набор файлов, помеченных (обычно) двухбуквенным суффиксом. Общие языковые стандарты de для немецкого, en для английского, fr для французского, ja для японского, pt для португальского ru для русского и.т.д.

Чтобы перевести сообщения на другой язык, например, немецкий:

  1. Сделайте копию файлов Bundle.properties.
  2. Назовите копию Bundle_de.properties для немецкого языка. Обратите внимание на добавленный суффикс _de.
  3. Переведите все строки (текст в правой части знака равенства) в Bundle_de.properties на немецкий язык.
    greeting=Hallo Welt!
    score.display=Spielstand:
    Не изменяйте ни одну из клавиш (текст слева от знака равенства)!
  4. Чтобы протестировать немецкую локализацию, запустите приложение из командной строки с помощью -Duser.language=de. Обратите внимание на параметр de.
    В SDK jMonkeyEngine этот параметр виртуальной машины задается в свойствах проекта в разделе «Выполнить». Здесь вы также можете сохранить индивидуальные конфигурации запуска для каждого языка, который вы хотите протестировать.

Для получения полного списка суффиксов языка используйте

System.out.println(Arrays.toString(Locale.getISOLanguages()));

Какие строки не нужно переводить

В файле Bundle.properties не указывайте строки, которые являются путями к asset, именами узлов или геометрии, input mappings или слоями материала.
  • Не трогайте слои материала:
    mat.setTexture("ColorMap", tex);
  • Не трогайте пути:
    teapot = assetManager.loadModel("Models/Teapot/Teapot.obj");
  • Не трогайте геометрии и имена узлов:
    Geometry thing=new Geometry("A thing", mesh);
    Node vehicle = new Node("Vehicle");
  • Не трогайте mappings:
    inputManager.addMapping("Shoot", trigger);
    inputManager.addListener(actionListener, "Shoot");

Только локализовывайте сообщения и текст пользовательского интерфейса!

Общие проблемы локализации

Типичные проблемы:

  • Локализованные строки могут иметь совсем другую длину и полностью нарушат ваш макет пользовательского интерфейса. ⇒ Проверять каждую локализацию.
  • Строки с переменным текстом или числами не работают одинаково на разных языках. ⇒ Либо работайте с грамматическими cases/numbers/gender для каждого языка, либо используйте gettext или ICU4J.
  • Локализатор видит только строки, без какого-либо контекста. Например. Означает ли «История поиска» отображение истории поисков или «поиск по истории»? ⇒ Используйте ярлыки с ключами. Тесно работайте с локализаторами, если они требуют дополнительной информации, и добавляйте эту информацию в комментарии к файлу перевода.
  • Сломанные международные символы ⇒ Убедитесь, что файлы сохранены с той же кодировкой символов, что и файлы шрифтов, которые вы используете. В наше время это обычно означает UTF-8, поскольку файлы шрифтов имеют тенденцию появляться для Unicode.
  • Отсутствующие международные символы ⇒ Убедитесь, что для каждого символа шрифта имеется символ на другом языке, то есть используйте достаточно полные файлы шрифтов, либо изменяйте перевод.

Дополнительная документация

http://java.sun.com/developer/technicalArticles/Intl/ResourceBundles/
http://sourceforge.net/apps/mediawiki/nifty-gui/index.php?title=Localisation


Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.