Как подключить redux с файлом I18n для переключения языка в соответствии с состоянием redux?

#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 , это избавит вас от множества проблем, особенно со сложными переводами, такими как валюты, переменные в переводах и т. Д