Jandcode поддерживает локализацию приложений, основанную на переводе строковых констант.
Идея в том, что все строковые ресурсы проекта, которые в будующем потребуется перевести,
пишутся в проекте на одном языке (в текущей реализации - на русском). В исходных
текстах такие строки оборачиваются в вызов метода UtLang.t (для java, groovy, gsp, javascript).
// обычная строка
System.out("Привет!");
// переводимая строка
System.out(UtLang.t("Привет!"));
С помощью средств, предоставляемых утилитой jc, переводимые строки можно извлечь
в специальные файлы, перевести и таким образом обеспечить поддержку нового языка.
Строки, для которых не был предоставлен перевод, будут представлены оригинальным
текстом на языке по умолчанию (в текущей реализации - на русском).
В project.jc нужно подключить модуль поддержки локализации:
include "localize-project"
После подключения будут доступны новые команды:
lang-check
lang-grab
lang-update
Запускаем:
jc lang-check
Эта команда анализирует исходные тексты и выявляет строки, которые никак не помечены
для локализации в исходниках. Все строки собираются в файл temp\lang-check.txt.
Для каждой строки указывается сама строка и место в файле, в котором она обнаружена.
Каждую константу, требующую перевода, необходимо обернуть в вызов функции UtLang.t.
Например было:
String s = "Привет"; // java
var s = "Привет"; // javascript
Должно стать:
String s = UtLang.t("Привет"); //java
var s = UtLang.t("Привет"); //javascript
Если строка описана как константа, то переводит ее нужно в месте использования!
class Test {
public static String AA = "Привет"; //NLS
void getAA() {
return UtLang.t(AA);
}
}
Константы, требующие перевода, но не заключенные в вызов UtLang.t, можно
пометить коментарием //NLS. Коментарий должен быть указан либо на той же
строке, что и константа, либо перед ней:
//NLS
String s = "Привет";
String s2 = "Привет"; //NLS
Константы, не требующие перевода, нужно пометить коментарием //NON-NLS.
Коментарий должен быть указан либо на той же строке, что и константа, либо перед ней:
//NON-NLS
String s = "Привет";
String s2 = "Привет"; //NON-NLS
Констаны, собранные через «+» нужно объеденить и использовать формат строки из
метода MessageFormat.format:
// было
String s = "Обработатано " + n + " файлов";
// нужно
String s = UtLang.t("Обработано {0} файлов", n);
После того, как все нужные строки помечены в исходниках, можно собрать их. Для этого предназначена команда:
jc lang-grab
Команда пересоздает файл lang-data.xml в корневом пакете модуля. Файл выглядет так:
<?xml version="1.0" encoding="utf-8"?>
<root>
<i>
<s>Добавить</s>
</i>
<i>
<s>Закрыть</s>
</i>
<i>
<s>Назад</s>
</i>
</root>
После того, как все нужные строки собраны, можно формировать файлы для перевода.
Для этого скопируйте файл lang-data.xml в тот же каталог с именем lang-data-XX.xml,
где вместо XX поставьте код языка, для которого этот файл (например lang-data-en.xml).
После этого выполните команду:
jc lang-update
Получим такой файл:
<?xml version="1.0" encoding="utf-8"?>
<root>
<i translated="false">
<s>Добавить</s>
<t></t>
</i>
<i translated="false">
<s>Закрыть</s>
<t></t>
</i>
<i translated="false">
<s>Назад</s>
<t></t>
</i>
</root>
Редактируем файл lang-data-en.xml, в теги t записываем перевод. Снова запускаем
jc lang-update (для убирания пометок о непереведенны строках).
Если в файле lang-data.xml появятся новые строки, то после выполнения jc lang-update,
эти новые строки попадут во все файлы перевода.