Интернационализация (i18n) с i18next и react-i18next
Интернационализация (i18n) может быть одной из функций, которые вам нужны сегодня. Благодаря i18next
задача локализации вашего приложения может быть решена легко. В этой статье я покажу вам, как локализовать приложение React, используя i18next
и react-i18next
.
О чем будет рассказано в этой статье?
- Запустите и используйте функцию перевода.
- Обработка выбора языка пользователем.
- Управляйте файлами перевода.
- Сохраните языковой ключ в Cookie.
Я сосредоточусь на том, как интернационализация реализована в приложении React. В этом руководстве я использую новое приложение React, созданное с помощью Create React App и Ant Design для компонентов. Вы можете создать свое приложение React по своему усмотрению.
Чего мы хотим достичь?
1. Запустите и используйте функцию перевода.
Установите i18next
и react-i18next
.
npm install i18next react-i18next --save // or yarn add i18next react-i18next
Создайте i18n.js
файл для размещения ваших конфигураций. Вот пример содержимого файла i18n.js
.
resources
: данные локали (перевода).lng
: исходный используемый язык.fallbackLng
: язык, который будет использоваться, если некоторые переводы не определены.
Импортируйте его в свой index.js
файл.
Теперь вы можете использовать его в своих компонентах. Мы будем использовать ловушку useTranslation
, предоставленную react-i18next
.
Функция перевода (t
) принимает ключ перевода, определенный в resources
, например: t("title")
(или с, если у вас есть вложенный объект перевода: t("content.description")
).
Вот и все. Теперь, если вы обновите страницу в браузере, текст заголовка должен быть «Земля».
2. Обработка выбора языка пользователем.
Теперь давайте сделаем так, чтобы наше приложение могло принимать выбор пользователей. Мы будем использовать экземпляр i18n
, предоставленный ловушкой useTranslation
. Затем создайте функцию для обновления языка.
Мы используем i18n.changeLanguage
метод, который принимает языковой ключ. Доступные языковые ключи определены в resources
(en
, de
, fr
или id
). Вернитесь в браузер, теперь вы можете изменить язык и сразу увидеть результат.
Примечание: я использую Ant Design для компонента Radio
. Вы можете использовать HTML-тег select, радио-тег ввода или собственный компонент для своего приложения.
3. Управляйте файлами переводов.
Все переводы помещаются в i18n.js
файл. Если ваше приложение растет, то этот файл будет труднее поддерживать. Чтобы решить эту проблему, мы можем переместить каждый перевод в отдельные файлы JSON. Затем наше приложение загрузит эти файлы JSON по мере необходимости.
Мы будем использовать i18next-http-backend
для загрузки ресурсов с внутреннего сервера. Он использует XMLHttpRequest или API выборки для получения файлов ресурсов.
Установить i18next-http-backend
:
npm installi18next-http-backend
--save // or yarn addi18next-http-backend
Создайте папку locales
в папке public
. Затем создайте папки для каждого языкового ключа. В каждую папку добавьте translation.json
файл. Структура папок должна выглядеть так:
Скопируйте данные перевода из resources
в соответствующие файлы, например:
/* en/translation.json */ { "title": "Earth", "content": { "description": "Earth is the third planet...", "source": "Source: " } }
Обновите свой i18n.js
файл:
Как я сказал ранее, i18next-http-backend
загружает файлы ресурсов с помощью XMLHttpRequest, что означает, что процесс является асинхронным. Может быть время, когда файлы ресурсов еще не готовы. Чтобы справиться с этим, мы можем использовать Suspense
из React
, чтобы обернуть наш компонент. Вы можете поместить его в index.js
, чтобы обернуть все компоненты:
Теперь вы вернетесь в свой браузер и посмотрите, работает ли он должным образом.
4. Сохраните ключ языка в Cookie.
Вы заметите, что если вы обновите браузер или закроете, а затем снова откроете его, язык вернется к английскому (en
). Это потому, что мы все еще жестко запрограммировали его в i18n.js
. У нас нет более постоянного места для хранения.
Я буду использовать Cookie (с js-cookie
) для хранения кода языка. Вы можете выбрать другие способы, такие как локальное хранилище или даже на вашем внутреннем сервере.
Обновите i18n.js
, чтобы теперь lng
использовал языковой ключ из файла cookie.
Я также добавил код резервного языка с использованием короткого замыкания, если значение locale
из Cookie равно undefined
.
Не забудьте обновить нашу changeLanguage
функцию, чтобы можно было сохранить выбранный ключ для Cookie. Просто добавьте приведенный ниже код после строки i18n.changeLanguage(code);
. Но не забудьте сначала импортировать Cookies
.
Cookies.set("locale", code);
Это все. Вы реализовали интернационализацию в своем приложении React.
Заключение
i18next
и react-i18next
- отличные инструменты, которые помогают нам реализовать интернационализацию в нашем приложении React. Они просты и удобны в использовании. Полное руководство можно найти на странице документации.
Пример кода можно найти на GitHub.
Спасибо.