#reactjs #typescript #react-hooks #i18next #react-i18next
#reactjs #машинописный текст #реагирующие хуки #i18next #react-i18next
Вопрос:
Я пытаюсь реализовать react-i18next в моем приложении create-react-app с помощью перехватов useTranslation().
Однако в консоли режим отладки показывает
i18next::backendConnector: не удалось загрузить адрес выставления счетов в пространстве имен для языка en, не удалось выполнить синтаксический анализ /locales/en/BillingAddress.json в json
и
i18next::translator: отсутствует ключ в форме адреса выставления счета.email Адрес электронной почты клиента (по умолчанию)
i18next.ts
import {initReactI18next} from "react-i18next";
import i18next from "i18next";
import LanguageDetector from 'i18next-browser-languagedetector';
import Backend from 'i18next-xhr-backend';
import XHR from "i18next-xhr-backend";
i18next
// .use(Backend)
.use(LanguageDetector)
.use(XHR)
.use(initReactI18next) // passes i18n down to react-i18next
.init({
lng: "en",
fallbackLng: {
'en-US':['en'],
'zh-CN':['cn'],
default:['en']
},
debug: true,
ns: ['billingAddress'],
defaultNS: 'billingAddress',
// load: "currentOnly",
interpolation: {
escapeValue: false // react already safes from xss
},
keySeparator: false,
// backend: {
// loadPath: "/locales/{{lng}}/{{ns}}.json",
// crossDomain: true
// },
react: {
wait: true,
}
});
export default i18next;
Файлы
├── src
│ ├── i18next.ts
│ ├── locales
│ │ ├── cn
│ │ │ └── billingAddress.ts
│ │ └── en
│ │ └── billingAddress.ts
│ ├── index.tsx
версия
«реагировать»: «^ 16.8.4»,
«i18next»: «^ 15.0.7»,
мой файл перевода
export default{
"Form": {
"emailLabel": "customer Email",
"emailPlaceholder": "email@emial.com",
}
}
мой файл BillingAddress
const [t, i18n] = useTranslation();
const changeLanguage = (language: string) => (e: React.MouseEvent) => {
i18n.changeLanguage(language)
};
const someValues: billingAddress = {
emailLabel: t("Form.emailLabel","Customer Email")
}
return (
<div>
<button onClick={changeLanguage("en")}>English</button>
<OtherComponent value={someValues} />
</div>
)
Я совершенно не понимаю, как загрузить пространство имен сейчас…
есть идеи?
Заранее спасибо!
Комментарии:
1. Можете ли вы изменить расширение файлов перевода на json и следовать синтаксису json
2. привет @ShubhamKhatri Я перенес перевод на общедоступный и изменил расширение fille, кажется, ошибок подключения больше нет. Спасибо за это
Ответ №1:
Вы могли бы просто следовать приведенному здесь примеру: https://github.com/i18next/react-i18next/tree/master/example/react/public/locales
Используя серверную часть xhr, вам нужно предоставить действительные файлы JSON в качестве исходного кода — вот и все.
Комментарии:
1. Спасибо! Я думаю, что это работает. Еще один вопрос, есть ли какой-либо способ, которым
i18n.changeLanguage
функция могла бы передаватьen-us
как языковую строку, потому что я пытаюсь объединить ее с moment.js , но когда я вызываю,i18n.changeLanguage('en-us')
это не сработает, если не передатьen
.2. к вашему сведению: более новое руководство по react-i18next можно найти здесь: dev.to/adrai /… yhat использует i18next-http-серверную часть вместо i18next-xhr-серверной части
3. Также есть хорошее видео об i18next, вторая часть которого полностью посвящена react: youtu.be/SA_9i4TtxLQ