Мультиязычное приложение Spring Boot

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

· 2 мин.
Мультиязычное приложение Spring Boot

В проекте “Уведомление о событиях в Gitlab” я сделал мультиязычность. Проект работает без фронта, поэтому говорить будем о мультиязычности на уровне сервера.

Интернационализация – это отличный способ увеличить число пользователей приложения.

Создание сообщений

Запишем сообщения, которые будем отправлять пользователю.

Сообщения на английском языке будут храниться в файле с именем messages_en.properties, который положим в папку src/main/resources/.

Добавим следующие сообщения:

hello=Hi, {0}
how_are_you=Good

Для некоторых сообщений определены заполнители, такие как {0}. Эти заполнители будут изменены спрингом на наши параметры. Например, так можно подставить имя пользователя в приветственном сообщении.

Поддержка других языков

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

Имена этих файлов должны начинаться с messages, за которыми следует подчеркивание и ISO-код выбранного языка. При желании можно добавить еще один символ подчеркивания, за которым следует код ISO определенного региона. Этот шаблон позволяет отправлять сообщения на нескольких языках и их вариантах.

В этой статье мы создадим файл с именем messages_ru.properties в папке src/main/resources/ для поддержки пользователей из России (RU):

hello=Привет, {0}
how_are_you=Хорошо

Получаем сообщения на языке пользователя

Получить сообщение на нужном языке поможет MessageSource. Его можно внедрить средствами Spring.

Рассмотрим получение сообщений на примере телеграм бота.

Некоторые моменты будут непонятны, из-за специфики библиотеки для создания ботов. Поэтому обратите внимание на вызов messageSource в 11 и 20 строке.

@Configuration
public class TelegramBotConfig {

    // ... ... ... ... ...

    @Bean
    public AnswerProcessing helloMessage(MessageSource messageSource, AnswerText howAreYou) {
        return AnswerProcessing
                .builder()
                .processingData(message -> BoxAnswer.of(
                        messageSource.getMessage("hello", Collections.singleton(message.getText()).toArray(), Locale.forLanguageTag("en")))
                )
                .nextUnit(howAreYou)
                .build();
    }

    @Bean
    public AnswerText howAreYou(MessageSource messageSource) {
        return AnswerText.of(
                messageSource.getMessage("how_are_you", null, Locale.forLanguageTag("en"))
        );
    }

    // ... ... ... ... ...

}

Вот это место отвечает за возврат ответа на нужном языке. Так же в метод передаются параметры, чтобы заменить {0}.

messageSource.getMessage(
    "hello",
    Collections.singleton(message.getText()).toArray(),
    Locale.forLanguageTag("en"))
)
  • Первый аргумент – метка из проперти файла.
  • Второй аргумент – массив параметров для замены. Object[].
  • Третий аргумент – локализация.

Параметры для замены являются необязательными, но вместо них придется передавать null.

messageSource.getMessage("how_are_you", null, Locale.forLanguageTag("en"))

Посмотрим на результат в телеграм боте.

Теперь вы можете покорять остальной мир с вашим приложением 😄