#javascript #reactjs #internationalization
#javascript #reactjs #интернационализация
Вопрос:
В моем приложении есть два перевода с использованием i18n translator, и я безуспешно пытаюсь установить язык по умолчанию.
Предпочтительный язык (язык по умолчанию) будет установлен при регистрации и будет получен из базы данных.
Где я могу создать какую-то логику, которая сообщит i18n, какой язык поступает из серверной части?
Значение будет отображаться примерно так:
const defaultLang = currentUser.data.laiso //this will output a string eg. 'en'
Файл конфигурации i18n выглядит примерно так:
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
const Languages = ['en', 'de'];
i18n
.use(Backend)
.use(LanguageDetector)
.use(initReactI18next)
.init({
fallbackLng: 'en',
debug: true,
whitelist: Languages,
interpolation: {
escapeValue: false
}
});
export default i18n;
Должно быть что-то написано под .use(Backend)
?
Это первый раз, когда используется i18n, поэтому любые подсказки будут оценены.
Это мой компонент, в котором мне нужен перевод. В нем я попытался установить индекс i18n.languages
на основе предпочитаемого языка, но это не работает:
import React from 'react'
import { useTranslation } from 'react-i18next';
export default function Dashboard() {
//the logged user
const currentUser = AuthService.getCurrentUser();
//value from database
const defaultLang = currentUser.data.laiso //this will output a string eg. 'en'
//translation
const { t, i18n } = useTranslation();
function handleClick(lang) {
i18n.changeLanguage(lang);
}
const current = i18n.languages[defaultLang === 'en' ? 0 : 1]
return (
<>
<div className={styles.languageSelector}>
<a
onClick={ () => handleClick('en') }
style={{ fontWeight: current === "en" ? 800 : 400}}
>
EN
</a>
<a
onClick={ () => handleClick('de') }
style={{ fontWeight: current === "de" ? 800 : 400}}
>
DE
</a>
</div>
<div>{t('translated.stuff')}</div>
</>
)
}
Комментарии:
1. Возможно, вам потребуется реализовать пользовательский языковой детектор: i18next.com/misc/creating-own-plugins.html#languagedetector
Ответ №1:
вы можете сделать это, просто добавив lng: 'en'
inside .init()
.init({
fallbackLng: 'en',
lng: 'en', // default language
debug: true,
whitelist: Languages,
interpolation: {
escapeValue: false
}
});
Ответ №2:
Я думаю, вам нужен хук для повторного отображения страницы при изменении языка. Таким образом, вы могли бы добавить это в свой Dashboard.jsx:
React.useEffect(() => {
const handleLanguageChange = () => {
// Refresh your component, maybe use a hook for it.
};
i18next.on("languageChanged", handleLanguageChange);
return () => {
i18next.off("languageChanged", handleLanguageChange);
};
}, []);
А для логики обновления вы можете добавить счетчик, который увеличивается при изменении языка, этого должно быть достаточно, чтобы запустить повторный запуск компонента.
Комментарии:
1. Идея с useEffect была идеальной, даже если я не использовал i18next.on(…). Спасибо
Ответ №3:
Мне удалось решить эту проблему с помощью useEffect.
//set the language from database
useEffect(() => {
i18n.changeLanguage(currentUser.data.laiso);
}, []);
Вот и все,
спасибо