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

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

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

Объём работы

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

  • Как минимум, вы переводите все сообщения и диалоги в пользовательском интерфейсе на целевые языки.
  • Вы также должны перевести 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);
Если у вас будет выводится ошибка связанная с тем что файл не найден, хотя он есть! То возможно вам следует указать в getBundle(«Bundle») в кавычках перед текстом Bundle название пакета ваших java классов в котором расположен .properties файл. Например что бы было так «MyGame.Bundle». Если после этого всё работает но текст не отображается, то по видимому проблема в шрифтах. Создайте растровый шрифт с символами используемого языка.

Язык, используемый в файлах 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");
  • Не трогайте сопоставления клавиш:
    inputManager.addMapping("Shoot", trigger);
    inputManager.addListener(actionListener, "Shoot");

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

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

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

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

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


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

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

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