Интернационализация (i18n) в Java: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Интернационализация (i18n) в Java: делаем приложение многоязычным

Интернационализация (часто сокращенно i18n — от слова internationalization, где 18 — количество букв между первой 'i' и последней 'n') — это процесс проектирования программного обеспечения таким образом, чтобы его можно было адаптировать к различным языкам и региональным особенностям без изменения исходного кода. В Java эта задача решается элегантно и мощно с помощью встроенных API: java.util.Locale, java.util.ResourceBundle и набора классов для форматирования.

В этой статье мы разберем, как реализовать поддержку нескольких языков в Java-приложении, используя стандартные средства. Вы узнаете, как создавать файлы локализации, динамически переключать язык и правильно форматировать числа, даты и валюты.

Основные компоненты i18n в Java

Java предоставляет три ключевых элемента для работы с интернационализацией:

  • Locale — объект, представляющий конкретный язык и регион (например, русский язык в России — ru_RU, английский в США — en_US).
  • ResourceBundle — класс для загрузки локализованных ресурсов (строк, сообщений, меток) из файлов .properties или классов.
  • Форматтеры — классы из пакета java.text (NumberFormat, DateFormat, MessageFormat) для правильного отображения чисел, дат и составных сообщений.

Шаг 1: Создание файлов ресурсов

Традиционный способ хранения локализованных строк — файлы .properties. Они создаются по следующему правилу:

Messages.properties          # Файл по умолчанию (обычно английский)
Messages_ru_RU.properties    # Для русского языка (Россия)
Messages_de_DE.properties    # Для немецкого (Германия)
Messages_fr.properties       # Для французского (без указания региона)

Пример содержимого файла Messages.properties (английский, по умолчанию):

welcome.message = Welcome to our application!
farewell.message = Goodbye!
date.format = dd/MM/yyyy

Пример содержимого файла Messages_ru_RU.properties (русский):

welcome.message = Добро пожаловать в наше приложение!
farewell.message = До свидания!
date.format = dd.MM.yyyy

Важно: файлы должны быть в кодировке ISO 8859-1 (Latin-1) или использовать Unicode-экранирование для символов, не входящих в эту кодировку. Для русских букв потребуется экранирование, например \u0414\u043E\u0431\u0440\u043E. Однако в современных средах разработки (IntelliJ IDEA, Eclipse) и при сборке с Maven/Gradle это часто автоматизировано.

Шаг 2: Загрузка ресурсов в коде

Для использования локализованных строк достаточно создать объект Locale и получить соответствующий ResourceBundle:

import java.util.Locale;
import java.util.ResourceBundle;

public class I18nDemo {
    public static void main(String[] args) {
        // Создаем локаль для русского языка
        Locale ruLocale = new Locale("ru", "RU");
        // Загружаем бандл (базовое имя файла - "Messages")
        ResourceBundle bundle = ResourceBundle.getBundle("Messages", ruLocale);

        // Получаем строки
        String welcome = bundle.getString("welcome.message");
        String farewell = bundle.getString("farewell.message");

        System.out.println(welcome); // Добро пожаловать в наше приложение!
        System.out.println(farewell); // До свидания!
    }
}

Если файл для конкретной локали не найден, Java автоматически использует файл по умолчанию (Messages.properties).

Шаг 3: Динамическое переключение языка

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

public class LanguageManager {
    private static ResourceBundle bundle;

    public static void setLocale(Locale locale) {
        bundle = ResourceBundle.getBundle("Messages", locale);
    }

    public static String getString(String key) {
        return bundle.getString(key);
    }
}

// Использование:
LanguageManager.setLocale(new Locale("de", "DE"));
System.out.println(LanguageManager.getString("welcome.message")); // Willkommen in unserer Anwendung!

Шаг 4: Форматирование чисел, дат и валют

Просто перевести строки недостаточно — даты и числа в разных странах выглядят по-разному. В США дата пишется как "12/31/2023", а в России — "31.12.2023". Java решает это с помощью форматтеров:

Рекомендаций