SpringBoot реализует интернационализированную функцию i18n

Java

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

импорт зависимостей

Нет необходимости вводить другую специальную конфигурацию в веб-проект Spring Boot, а необходимые базовые компоненты уже включены в веб-стартер по умолчанию. Соответствующая конфигурация pom зависимостей выглядит следующим образом:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

Международная структура проекта

Проект здесь в основном для внешнего интерфейса API, то есть проект, который разделяет фронт и бэкенд. Основное внимание уделяется конфигурации интернационализации в фоновом режиме и тому, как получить соответствующий интернационализированный контент копии в соответствии с ключом использования интерфейса.

Сначала посмотрите на структуру каталогов проекта в целом:

image

Настроить парсер

После введения соответствующих зависимостей выше он сначала используется для инициализации класса LocaleResolver, который является распознавателем по умолчанию и используется для установки международного языка по умолчанию для текущего сеанса.

/**
 * 配置国际化语言
 *
 **/
@Configuration
public class LocaleConfig {

    /**
     * 默认解析器 其中locale表示默认语言
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.CHINA);
        return localeResolver;
    }
}

Здесь класс конфигурации создается с помощью аннотации @Configuration, а созданный SessionLocaleResolver внедряется в класс конфигурации с помощью метода аннотации @Bean.

Настроить перехватчик

В парсере также требуется перехватчик для получения языковых параметров запроса, а LocaleChangeInterceptor по умолчанию используется в качестве перехватчика для указания имени параметра для переключения интернационализированного языка. Например, когда запрошенный URL-адрес содержит ?lang=zh_CN, это означает чтение интернационализированного файла messages_zh_CN.properties.

/**
 * Web相关配置
 **/
@Configuration
public class WebConfig implements WebMvcConfigurer {

    /**
     * 默认拦截器 其中lang表示切换语言的参数名
     *
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
        localeInterceptor.setParamName("lang");
        registry.addInterceptor(localeInterceptor);
    }
}

Здесь инициализация перехватчика и настройка соответствующих параметров завершается реализацией метода addInterceptors интерфейса WebMvcConfigurer.

файл интернационализации

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

В Spring Boot именем файла интернационализации по умолчанию являются сообщения, и здесь мы используем сообщения для определения файла интернационализации.

Определите по очереди messages.properties, messages_en_US.properties, messages_zh_CN.properties, messages_zh_TW.properties.

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

Содержимое трех файлов:

username=zhangsan

username=张三

username=張三

Здесь по-прежнему уделяется большое внимание размещению файлов интернационализации.Если вы используете путь поиска Spring Boot по умолчанию, вы можете поместить его непосредственно в каталог ресурсов верхнего уровня.

Но если вы хотите поместить его в другие каталоги, например в каталог Statistics/i18n/, вам необходимо настроить следующее в application.properties:

spring.messages.basename=statistics/i18n/messages

Обратите внимание, что перед ним нет косой черты, указывающей на относительный путь. Имя файла — messages, и нет необходимости добавлять суффикс свойств. Любой, кто использовал Spring Boot, знает, что он справится с этим за нас.

Инструменты

Если страница получает интернационализированный контент, то фоновая операция уже завершена, и передняя часть должна выполнить соответствующую обработку и отображение js. Если мы предоставляем здесь только API, для интернационализации некоторого контента в API нам все равно нужно получить соответствующее значение по ключу.

Здесь вам нужен класс инструмента для обработки:

/**
 * 国际化工具类
 **/
@Component
public class MessageUtils {

    private static MessageSource messageSource;

    public MessageUtils(MessageSource messageSource) {
        MessageUtils.messageSource = messageSource;
    }

    /**
     * 获取单个国际化翻译值
     */
    public static String get(String msgKey) {
        try {
            return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
        } catch (Exception e) {
            return msgKey;
        }
    }

}

В основном для внедрения MessageSource инструмент создается через @Component.

конкретное использование

После подготовки вышеуказанного содержимого вы можете использовать его на уровне контроллера.Давайте посмотрим непосредственно на код.

@RestController
@RequestMapping("/i18n")
public class I18nController {

    @RequestMapping("/user")
    public String getUserName() {
        return MessageUtils.get("username");
    }
}

Метод обработки запроса определяется напрямую, и соответствующее значение интернационализации получается с помощью ключа в методе.

Запрашиваемый формат URL:http://localhost:8080/i18n/user?lang=zh_TW

Теперь на странице будет отображаться:

張三

Это означает, что интернационализированный контент можно использовать в обычном режиме.

Наконец, обратите внимание на общедоступную учетную запись WeChat «Program New Vision», ответьте «009» и получите полный исходный код.


--- Программа Новые Горизонты: Захватывающие и растущие нельзя пропустить

程序新视界-微信公众号