Справочный центр

Подготовка к локализации приложений Java

Как подготовить к локализации проект, разработанный в среде Java
При проектировании и разработке приложения с учетом его последующей локализации нужно следовать правилам, указанным ниже
Локаль приложения

Локаль приложения можно получить через метод java.util.Locale.getDefault(). Локаль по умолчанию соответствует локали системы. Чтобы указать локаль приложения можно использовать атрибуты user.language, user.country, user.variant
java -Duser.country=RU -Duser.language=ru
ResourceBundle

Для получения локализованных строк в Java используется java.util.ResourceBundle. Пары ключ-значение для перевода находятся в *.properties файлах. При этом в названии файла присутствует локаль, для которой указаны значения в файле.

Для получения локализованного значения по ключу нужно создать ResourceBundle, используя метод java.util.ResourceBundle.getBundle(java.lang.String, java.util.Locale) или одну из ее перегрузок. После этого можно получать значения по ключу через метод java.util.ResourceBundle.getString().
Пример
Структура проекта:
└──src
   └── main
       └── java
           └── ru
               └── myproject
                   └── Application.java
       └── resources
В папке resources создаем группу переводов messages:
└──src
   └── resources
       └── messages.properties
       └── messages_en.properties
       └── messages_fr.properties
       └── messages_fr_CA.properties
Важно отметить приоритеты, по которым будет осуществляться поиск значения для ключа. Сначала ищется ключ для полного значения локали (содержащий все атрибуты локали), затем по уменьшению параметров локали, далее - файл с системной локалью, и затем файл без локали. То есть для локали fr_CA_UNIX в приложении, , запущенном под русской локалью, будет осуществлен поиск в следующем порядке:
messages_fr_CA_UNIX messages_fr_CA messages_fr messages_ru_RU messages_ru messages


В файлах с переводами указываем пары ключ-значение:
messages.properties
hello.world=Привет, мир!
messages_en.properties
hello.world=Hello world!
messages_fr.properties
hello.world=Bonjour le monde!
Используем ResourceBundle в приложении:
ru.myproject.Application
package ru.myproject;

public class Application {
    public static void main(String[] args){
      ResourceBundle bundleDefault = ResourceBundle.getBundle("messages");
      ResourceBundle bundleEn = ResourceBundle.getBundle("messages", Locale.ENGLISH);
      ResourceBundle bundleCanada = ResourceBundle.getBundle("messages", Locale.CANADA_FRENCH);

      System.out.println(bundleDefault.getString("hello.world"));
      System.out.println(bundleEn.getString("hello.world"));
      System.out.println(bundleCanada.getString("hello.world"));
    }
}
Запускаем наше приложение в русской локали:
java -Duser.country=RU -Duser.language=ru ru.myproject.Application

Привет, мир!
Hello world!
Bonjour le monde!
Если запустить приложение в английской локали, получим:
java -Duser.language=en ru.myproject.Application

Hello world!
Hello world!
Bonjour le monde!
Для удобства локализации можно использовать нашу онлайн-систему alingvo. Преимущество системы в том, что вы можете автоматически загружать файлы *.properties в систему, использовать машинный перевод или подключить переводчика, автоматически получить переведенные файлы.

Как загружать файлы вручную и автоматически можно прочитать тут.

После перевода файлы раскладываются по нужным проектам (сборкам), это также можно сделать вручную или автоматически.

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