Вопрос или проблема
Я использую i18n-react в своем приложении. В данный момент для разработки я запрашиваю переведенные файлы через API Weblate, но когда мы разворачиваем проект, мы используем локальные json файлы в utils/i18n для отображения перевода.
Мне интересно, могу ли я записывать эти переводы в json файлы, запрашивая их из Weblate? Я пробовал поиграться с saveMissing и saveMissingTo, но это, похоже, не делает то, что мне нужно.
import i18next from "i18next";
import I18NextHttpBackend from "i18next-http-backend";
import { initReactI18next } from "react-i18next";
import { getLanguageData } from "./languageData";
const languageData = getLanguageData();
i18next
.use(I18NextHttpBackend)
.use(initReactI18next)
.init({
fallbackLng: "ru",
lng: "en",
keySeparator: ".",
interpolation: {
escapeValue: false,
},
saveMissingTo: "all",
...languageData,
});
export default i18next;
А вот здесь я решаю, какие данные предоставить в зависимости от NODE_ENV:
import translationEN from "./en/en.json";
import translationRU from "./ru/ru.json";
const WEBLATE_URL = " https://weblate.hdcem.ru/api/";
const envMode = process.env.NODE_ENV;
const devLanguageData = {
backend: {
loadPath: `${WEBLATE_URL}translations/digital/zakaz/{{lng}}/file/`,
addPath: "src/utils/i18n/{{lng}}/{{lng}}.json",
customHeaders: {
Authorization: process.env.REACT_APP_WEBLATE_API_KEY,
},
},
};
const resources = {
resources: {
en: {
translation: translationEN,
},
ru: {
translation: translationRU,
},
},
};
export const getLanguageData = () => {
if (envMode === "development") return devLanguageData;
if (envMode === "production") return resources;
return resources;
};
Ответ или решение
Обновление файлов перевода i18n в приложении с использованием Weblate
В современном программировании важность многоязычной поддержки трудно переоценить. Используя библиотеку i18n-react
, вы можете эффективно управлять системой перевода в вашем приложении. В этом ответе мы рассмотрим, как обновлять файлы перевода в формате JSON, получая их из API Weblate, и как это сделать правильно при развертывании вашего проекта.
1. Понимание текущей конфигурации
Ваш текущий код уже включает в себя систему, использующую i18next
и i18next-http-backend
. При этом важный аспект заключается в том, что для разработки вы получаете переводы через API Weblate, а для продакшн версии — из локальных файлов JSON. Это оправданный подход, так как он позволяет тестировать разные языки в режиме реального времени.
Однако, если вам необходимо сохранять переводы, которые запрашиваются из Weblate, вам потребуется изменить конфигурацию i18next
.
2. Настройка сохранения переводов
Чтобы сохранять переводы, получаемые из API Weblate, в локальные JSON файлы, вам необходимо использовать опцию addPath
в конфигурации бэкенда. Убедитесь, что ваш addPath
указывает на правильный путь для записи файлов. Ваш код уже содержит addPath: "src/utils/i18n/{{lng}}/{{lng}}.json"
, что позволяет сохранять переводы.
Однако упомянутый вами saveMissing
и saveMissingTo
нуждаются в корректной настройке, чтобы переводы действительно сохранялись. Убедитесь, что:
saveMissingTo: "all"
установлен для сохранения всех отсутствующих переводов.- В вашем коде есть функция или механизм, который будет обрабатывать эти сохранения, например, сохранение файлов в локальную файловую систему после того, как получите переводы из Weblate.
Вот пример того, как вы можете расширить вашу конфигурацию, чтобы это работало:
const devLanguageData = {
backend: {
loadPath: `${WEBLATE_URL}translations/digital/zakaz/{{lng}}/file/`,
addPath: "src/utils/i18n/{{lng}}/{{lng}}.json",
customHeaders: {
Authorization: process.env.REACT_APP_WEBLATE_API_KEY,
},
},
saveMissing: true, // Включите сохранение отсутствующих переводов
};
3. Обработка сохранения файлов
Для того чтобы переводы действительно сохранялись в локальные JSON файлы, необходимо реализовать логику, которая будет реагировать на события сохранения после обновления переводов. К примеру, можно использовать встроенные функции i18next
для обработки события added
после того, как данные получены.
Вот пример, как вы могли бы это реализовать:
i18next.on('added', (lng, ns) => {
// Логика для сохранения перевода в файл
saveTranslationToFile(lng, ns);
});
const saveTranslationToFile = (language, namespace) => {
const translations = i18next.getResourceBundle(language, namespace);
const filePath = path.join(__dirname, `src/utils/i18n/${language}/${language}.json`);
fs.writeFileSync(filePath, JSON.stringify(translations, null, 2));
};
4. Проверьте работу на локальном сервере
После внесения изменений обязательно протестируйте работу приложения в локальном режиме (development). Убедитесь, что при запросе переводов из Weblate ваш код корректно сохраняет их в указанные JSON файлы, а затем корректно загружает их при развертывании.
Заключение
Использование i18next
вместе с Weblate предоставляет отличные возможности для управления переводами в ваших приложениях. Следуя описанным шагам, вы сможете настроить автоматизированное сохранение переводов в локальные файлы, что значительно упростит дальнейшую локализацию вашего продукта. Убедитесь, что ваша конфигурация корректно обрабатывает все сценарии использования и адаптирует переводы в соответствии с вашей бизнес-логикой.