Международное руководство по степпингу Spring Boot

Spring Boot

Интернационализация, также называемая i18n, почему она так называется? Поскольку интернационализированный английский — это интернационализация, между i и n 18 букв, поэтому он называется i18n. Если наше приложение интернационализировано, то его можно легко переключать в разных языковых средах.Наиболее распространенным является переключение между китайским и английским языком.Функция интернационализации также довольно распространена.

В Spring интернационализация поддерживается через AcceptHeaderLocaleResolver, и разработчики могут использовать функцию интернационализации непосредственно в проекте посредством простой настройки.

Эта поддержка была еще более упрощена в Spring Boot. В Spring Boot мы также можем легко реализовать функцию интернационализации, написав всего несколько строк кода. Далее Сонг Гэ расскажет вам о функциях глобализации в Spring Boot.

Прежде всего, мне нужно объяснить вам, что интернационализация в проекте часто требует поддержки с разных сторон, таких как интернационализация бэкенда и фронтэнда, только работая вместе, мы можем по-настоящему реализовать функцию интернационализации. В этой статье я сначала представлю интернационализацию в Spring Boot с моими друзьями, а затем мы представим интернационализацию Vue, Наконец, я применю комбинацию этих двух к нашему проекту vhr, поэтому может быть три статьи до и после, Эта статья является первой.

1. Основное использование

Spring Boot и Spring находятся в одной строке. Для поддержки интернационализации по умолчанию используется синтаксический анализатор AcceptHeaderLocaleResolver. Этот синтаксический анализатор по умолчанию использует поле Accept-Language заголовка запроса, чтобы определить среду, к которой принадлежит текущий запрос, и затем дает соответствующий ответ.

Поэтому при интернационализации в Spring Boot мы можем запустить ее напрямую без настройки.

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

  • Наш файл сообщения создается непосредственно в каталоге ресурсов. IDEA добавит пакет ресурсов при его отображении. Вам не нужно об этом беспокоиться. Не создавайте этот каталог вручную.
  • messages.properties Это конфигурация по умолчанию, остальные конфигурации для разных локалей, en_US — английский (США), zh_CN — упрощенный китайский, а zh_TW — традиционный китайский (полная таблица языковых сокращений есть в приложении в конце этой статьи).

После создания четырех файлов первый по умолчанию можно оставить пустым, а остальные три заполнить следующим содержимым:

messages_zh_CN.properties

user.name=江南一点雨

messages_zh_TW.properties

user.name=江南壹點雨

messages_en_US.properties

user.name=javaboy

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

MessageSource, который необходимо настроить в Spring, теперь не нужно настраивать, и Spring Boot пройдетorg.springframework.boot.autoconfigure.context.MessageSourceAutoConfigurationАвтоматически помогите нам настроить экземпляр MessageSource.

Создайте HelloController со следующим содержимым:

@RestController
public class HelloController {
    @Autowired
    MessageSource messageSource;
    @GetMapping("/hello")
    public String hello() {
        return messageSource.getMessage("user.name", null, LocaleContextHolder.getLocale());
    }
}

В HelloController мы можем напрямую внедрить экземпляр MessageSource, а затем вызвать метод getMessage в экземпляре, чтобы получить значение переменной.Первый параметр — это ключ переменной, которую нужно получить, а второй параметр — если есть заполнитель в значении, его можно получить здесь из параметров Pass, а третий параметр может передавать экземпляр Locale, который эквивалентен текущему языковому стандарту.

Далее мы можем напрямую вызвать этот интерфейс.

По умолчанию при вызове интерфейса текущая среда настраивается через Accept-Language заголовка запроса.Я использую POSTMAN для тестирования здесь, и результаты следующие:

Как видите, я установил Accept-Language в zh-CN в заголовке запроса, поэтому я получаю упрощенный китайский; если я устанавливаю zh-TW, я получаю традиционный китайский:

Это легко?

2. Пользовательский переключатель

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

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        interceptor.setParamName("lang");
        registry.addInterceptor(interceptor);
    }
    @Bean
    LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
        return localeResolver;
    }
}

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

Кроме того, мы также настроили перехватчик, который перехватывает параметр, ключ которого в запросе lang (locale, если не настроен), и этот параметр указывает текущую информацию об окружении.

Что ж, после завершения настройки запустите проект и получите к нему доступ следующим образом:

Мы указываем текущую информацию об окружении, добавляя lang к запросу. Эту спецификацию нужно сделать только один раз, то есть, когда сессия остается неизменной, следующий запрос не должен приносить параметр lang, а сервер уже знает текущую информацию об окружении.

3. Другая настройка

По умолчанию наш файл конфигурации находится в каталоге ресурсов, если вы хотите его настроить, вы также можете определить его в каталоге resources/i18n:

Однако при таком способе определения система не знает, куда загрузить конфигурационный файл, в это время требуется дополнительная настройка в application.properties (обратите внимание, что это относительный путь):

spring.messages.basename=i18n/messages

Кроме того, существуют некоторые конфигурации формата кодирования и т. д., а именно:

spring.messages.cache-duration=3600
spring.messages.encoding=UTF-8
spring.messages.fallback-to-system-locale=true

spring.messages.cache-duration указывает время истечения кэша файла сообщений.Если он не настроен, кэш всегда будет действительным.

Свойство spring.messages.fallback-to-system-locale немного волшебно. Я не могу найти внятного ответа в Интернете. Позже я некоторое время просматривал исходный код, чтобы найти подсказку.

Эффект от этого свойстваorg.springframework.context.support.AbstractResourceBasedMessageSource#getDefaultLocaleМетод вступает в силу:

protected Locale getDefaultLocale() {
	if (this.defaultLocale != null) {
		return this.defaultLocale;
	}
	if (this.fallbackToSystemLocale) {
		return Locale.getDefault();
	}
	return null;
}

Из этого кода видно, что когда файл ресурсов, соответствующий текущей системе, не может быть найден, если свойство имеет значение true, по умолчанию будет выполняться поиск файла ресурсов, соответствующего текущей системе, в противном случае будет возвращено значение null, и после возврата null, в конечном итоге он вызовет системный файл messages.properties по умолчанию.

4. Приложение

Я поискал список языковых сокращений и поделился им с друзьями:

язык короткое имя
Упрощенный китайский (Китай) zh_CN
Традиционный китайский (Тайвань, Китай) zh_TW
Традиционный китайский (Гонконг, Китай) zh_HK
Английский (Гонконг, Китай) en_HK
Английский (США) en_US
английский (Великобритания) en_GB
Английский (мировой) en_WW
Английский (Канада) en_CA
Английский (Австралия) en_AU
английский (Ирландия) en_IE
Английский (Финляндия) en_FI
Финский (Финляндия) fi_FI
Английский (Дания) en_DK
датский (Дания) da_DK
Английский (Израиль) en_IL
иврит (Израиль) he_IL
Английский (Южная Африка) en_ZA
Английский (Индия) en_IN
Английский (Норвегия) en_NO
Английский (Сингапур) en_SG
Английский (Новая Зеландия) en_NZ
Английский (Индонезия) en_ID
Английский (Филиппины) en_PH
Английский (Таиланд) en_TH
Английский (Малайзия) en_MY
английский (арабский) en_XA
Корейский (Южная Корея) ko_KR
Японский (Япония) ja_JP
Голландский (Нидерланды) nl_NL
голландский (Бельгия) nl_BE
Португальский (Португалия) pt_PT
Португальский (Бразилия) pt_BR
французский (Франция) fr_FR
Французский (Люксембург) fr_LU
французский (Швейцария) fr_CH
французский (Бельгия) fr_BE
французский (Канада) fr_CA
испанский (Латинская Америка) es_LA
испанский (Испания) es_ES
Испанский (Аргентина) es_AR
испанский (США) es_US
испанский (Мексика) es_MX
испанский (Колумбия) es_CO
Испанский (Пуэрто-Рико) es_PR
немецкий (Германия) de_DE
немецкий (Австрия) de_AT
немецкий (Швейцария) de_CH
Русский (Россия) ru_RU
итальянский (Италия) it_IT
Греческий (Греция) el_GR
норвежский (Норвегия) no_NO
Венгерский (Венгрия) hu_HU
Турецкий (Турция) tr_TR
Чехия (Чехия) cs_CZ
словенский sl_SL
польский (Польша) pl_PL
Шведский (Швеция) sv_SE
испанский (Чили) es_CL