SpringBoot Multilingual – Интернационализация – i18n
SpringBoot Multilingual – Интернационализация – i18n

Содержание на этой странице

SpringBoot также поддерживает несколько языков. Для достижения многоязычности мы фокусируемся на 3 объектах

  • Интерфейс LocaleResolver
  • Объект локали
  • Объект MessageSource

Краткое описание: Интерфейс Класс реализации LocaleResolver получает Объект локали,Объект локали сообщает MessageSource, из какого файла конфигурации получать сообщения!

3 важные вещи, которые нужно знать о многоязычии

LocaleResolverпредставлять

LocaleResolver да Spring Framework Интерфейс используется для анализа региональной информации (локали), запрошенной клиентом, то есть для определения языка пользователя и предпочтений страны/региона. Его основная функция соответствии с Запрошеноинформация Определите, какой язык и локаль следует использовать для отображения пользовательского интерфейса.。

На просторечии это да: проанализировать, какой объект локали использовать. Spring также включает в себя некоторые

  1. AcceptHeaderLocaleResolver
    • в соответствии с HTTP заголовок запроса Accept-Language Информация заголовка для анализа Locale。它会尝试从Запрошено头部информация Получите настройки предпочтительного языка клиента в。
  2. CookieLocaleResolver
    • в соответствии конкретный cookie хранится в Locale информация для анализа. Если пользователь когда-либо выбирал языковые предпочтения, эта информация сохраняется. cookie , чтобы последующие запросы могли поддерживать согласованные языковые настройки.
  3. SessionLocaleResolver
    • в соответствии с Текущая сессия пользователя (сессия)хранится в Locale информацияанализировать。это соответствует потребностямсуществовать Приложение, которое поддерживает согласованные языковые настройки во время пользовательских сеансов.。
  4. FixedLocaleResolver
    • фиксированный LocaleResolver Реализация всегда возвращает предварительно определенный фиксированный Locale。этотсуществовать Может быть полезно при отладке и конкретных сценариях тестирования.。

Объект локали

Locale Объект представляет конкретный регион и языковую комбинацию. Обычно он представлен идентификатором языка, например enzh_CN)выражать,Spring Boot проходить LocaleResolver Проанализировано Locale Объект определяет, какой язык и формат приложение отображает в пользовательском интерфейсе.

На просторечии да: Дайте объекту MessageSource и скажите ему, какой язык использовать?

Объект MessageSource

MessageSource да Spring Framework Предоставленный международный интерфейс синтаксического анализатора сообщений отвечает за загрузку ресурсов сообщений в разных языковых средах. существовать Spring Boot , обычно используется ResourceBundleMessageSource или ReloadableResourceBundleMessageSource загрузить файл свойств(.properties файлы), содержащие тексты сообщений на разных языках. проходить MessageSource,Можетв соответствии с Locale Объект получает текст сообщения на соответствующем языке, тем самым реализуя многоязычную поддержку интерфейса приложения.

На просторечии да: MessageSource да используется для получения сообщений.

Практическое многоязычие

Создайте файл конфигурации языка.

Язык кода:javascript
копировать
размещение папки ресурсов
├── i18n
│ ├── msg.properties
│ ├── msg_en.properties
│ └── msg_zh.properties

msg.properties

Язык кода:javascript
копировать
INFO=моя конфигурация по умолчанию
NOT_NULL={0} не должно быть пустым.

msg_en.properties

Язык кода:javascript
копировать
INFO=моя английская конфигурация
NOT_NULL={0} не должно быть нулевым

msg_zh.properties

Язык кода:javascript
копировать
INFO=Моя дополнительная конфигурация
NOT_NULL={0} не должно быть пустым.

Добавьте файл конфигурации application.properties.

Цель да Разработать наш многоязычный пакетный путь

Язык кода:javascript
копировать
# Список базовых имен, начинающихся с запятой (по сути, полный путь к классам), каждое из которых соответствует соглашению ResourceBundle и легко поддерживает местоположения, основанные на косой черте. Если он не содержит квалификатор пакета (например, «org. mypackage"), который будет разрешен из корня пути к классам
spring.messages.basename=i18n.msg

Написание тестов кода

Язык кода:javascript
копировать
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Locale;

/**
 * @author : zanglikun
 * @date : 2024/6/15 22:29
 * @desc : Copyright © zanglikun.com
 */
@Api(tags = "многоязычный")
@RestController
@RequestMapping("/test/api/v1/")
public class I18nController {

    @Resource
    // Получить многоязычный объект
    private MessageSource messageSource;

    @Resource
    // Используйте этот объект для динамического анализа заголовков запросов. Accept-Language для достижения цели динамического переключения многоязычный
    private AcceptHeaderLocaleResolver localeResolver;


    @ApiOperation("Тестовое многоязычное сообщение")
    @GetMapping("/getI18n")
    public String testI18nMessage(HttpServletRequest request) {
        // Из источника Spring.messgae.basename=i18n.msg Зайдите в папку ресурса и сделайте фото файл i18n/msg.properties NOT_NULL информация
        String info = messageSource.getMessage("NOT_NULL", null, Locale.getDefault());

        // Получить динамический объект локали
        Locale dynamicLocale = localeResolver.resolveLocale(request);
        String[] args = new String[]{"id"};
        String dynamicInfo = messageSource.getMessage("NOT_NULL", args, dynamicLocale);
        return dynamicInfo;
    }
}

Тест запроса: изменить заголовок запроса: Accept-Language

en-US

Язык кода:javascript
копировать
curl --location --request GET 'http://127.0.0.1:8089/test/api/v1/getI18n' \
--header 'Accept: */*' \
--header 'Accept-Language: en-US' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)'

Вывод: идентификатор не равен нулю

zh-CN

Язык кода:javascript
копировать
curl --location --request GET 'http://127.0.0.1:8089/test/api/v1/getI18n' \
--header 'Accept: */*' \
--header 'Accept-Language: zh-CN' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)'

Вывод: идентификатор не должен быть пустым.

Вышеупомянутое — всего лишь пример: если вам нужно больше трюков,Например, когда существование генерирует исключение глобально,Вы можете существовать на глобальном перехватчике,使用этот个многоязычный Обрабатывайте ошибки, которые вы хотите вывести на внешний интерфейс.информация。

илисуществовать обрабатывает языковые теги, согласованные с интерфейсом,Может实现LocaleResolverполучить Объект локали!

После общения с друзьями Мибатиса. Заполняя заголовок запроса, я обнаружил, что кто-то говорит даж-cn, а кто-то даж_ч.

существовать Accept-Language HTTP в голове,Формат языкового тега указан в RFC 5646.,Это стандартный формат языковых тегов.,Используется для указания языковых предпочтений пользователя. RFC 5646 В стандарте указано, что языковые теги состоят из основного кода языка (например, zh для китайского языка) и необязательный код страны (например, CN представляет Китай) состоит из,Используйте дефис между двумя-отдельный,нравиться zh-CN

Что касается zh_cn или других подобных формах, которые не соответствуют RFC 5646 Стандартный формат тега текущего языка. Настройки браузера существуют Accept-Language голова, за ней обычно следует RFC 5646 стандарты для создания языковых тегов, чтобы гарантировать, что согласование языка с сервером может проходить гладко, одновременно выражая языковые предпочтения пользователя как можно точнее.

Поэтому правильный способ использования zh-CN Этот формат представляет собой упрощенный китайский вместо да. zh_cn。Серверная часть должна следовать RFC 5646 Стандартный анализ Accept-Language заголовок, чтобы получить правильную информацию о языковых предпочтениях и предоставить пользователям соответствующий контент языковой версии по мере необходимости.

不过语言你Может参考:Наш общийISO639-1:https://www.andiamo.co.uk/resources/iso-language-codes/

Особые инструкции: Все вышеперечисленные статьи созданы автором после реальных операций. Пожалуйста,Пожалуйста, не воруйте напрямую!Не забудьте отметить оригинальную ссылку при перепечатке:www.zanglikun.com Сторонние платформы не будут своевременно обновлять последнее содержание этой статьи.。нравиться果发现本文资料不全,доступныйМой Java-блогпоиск:ключевое слово заголовка。以获取全部资料 ❤

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода