#javascript #react-native #redux #internationalization
#javascript #react-native #redux #интернационализация
Вопрос:
Я использовал I18n.js библиотека в react native для успешного изменения языка в соответствии с выбранным по умолчанию в I18n.js файл.
Но проблема в том, что когда я использовал redux connect для выполнения изменения состояния, это выдает мне много ошибок! Я искал библиотеку под названием react-redux-i18n, но есть ли какой-либо способ решить эту проблему без использования дополнительных библиотек?
Мой I18n.js файл :
import I18n from "i18n-js";
import en from "./locales/en";
import tm from "./locales/tm";
import { connect } from 'react-redux';
I18n.fallbacks = true;
I18n.defaultLocale = this.props.selectedLang === "English" ? 'en' :'tm';
I18n.locale = this.props.selectedLang === "English" ? 'en' : 'tm';
I18n.translations = {
en,
tm
};
const mapStateToProps = (state) => {
return {
selectedLang: state.auth.selectedLanguage
}
}
export default connect(mapStateToProps)(I18n);
Как выполнить это переключение? Пожалуйста, помогите
Ответ №1:
У вас возникнет много проблем, если вы попытаетесь установить исходный язык с помощью redux. Я рекомендую вам использовать AsyncStorage
.
При переключении языка — сохраните выбранный язык и обновите i18n
:
handleChangeLanguage = async (lang) => {
await AsyncStorage.setItem('lang', lang);
const { i18n } = this.props;
i18n.changeLanguage(lang);
}
При начальной загрузке приложения проверьте AsyncStorage
на наличие предпочитаемого языка:
import i18n from 'i18next';
import { AsyncStorage } from 'react-native';
....
const languageDetector = {
type: 'languageDetector',
async: true,
detect: async (cb) => {
// Case 1: The user chose his preferred language setting.
const preferredLang = await AsyncStorage.getItem('lang');
if (preferredLang) {
return cb(preferredLang);
}
// Case 2: return the default language
return cb('en');
},
init: () => {},
cacheUserLanguage: () => {},
};
i18n
.use(languageDetector)
.init({
fallbackLng: 'en',
react: {
wait: true,
},
});
Комментарии:
1. Понятно, что, если пользователь захочет изменить язык внутри приложения? Нравится страница настроек -> изменить язык?
2. @DazzilePro,
handleChangeLanguage
из моего поста делает это -> он обновляет вновь выбранный язык вAsyncStorage
и обновляет текущуюi18n
конфигурацию. Итак, в следующий раз, когда пользователь откроет приложение, будет использоваться обновленный язык изAsyncStorage
3. Я понимаю, это сработает в следующий раз. Что, если требуется оперативное обновление, я перезагружаюсь или что-то еще, что изменит язык при их изменении, и нажмите на кнопку сохранить язык!
4. И я не использую ‘i18next’, просто использую чистый i18n.js
5. Я не знаком с вашей
pure i18n.js
логикой и не могу вам помочь: / Может быть, вам нужно повторно отобразить компонент? Но я рекомендую вам использовать react.i18next.com , это избавит вас от множества проблем, особенно со сложными переводами, такими как валюты, переменные в переводах и т. Д