Содержание
Backend Java Developer
Backend Java Developer

В проекте “Уведомление о событиях в 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"))

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

Пример сообщений на русском языке
Пример сообщений на русском языке, используется локаль ru
Пример сообщений на английском языке
Пример сообщений на английском языке, используется локаль en

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

Комментарии