Интернационализация, также называемая 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 |