【问题标题】:How to get a locale stored in AsyncStorage with i18next?如何使用 i18next 获取存储在 AsyncStorage 中的语言环境?
【发布时间】:2021-07-01 18:59:37
【问题描述】:

我有一个适用于 react-native 应用程序的 i18next 设置。我唯一想念的是检索用户在 AsyncStorage 中保存的语言环境。

感谢18n.use(()=> "locale"),i18next 让您有机会在应用程序启动之前设置语言环境。只要函数不是异步的,它就可以正常工作。

问题是 AsyncStorage 是异步的,需要 await 关键字。如果我这样做,应用程序就会崩溃。到目前为止,我唯一的选择是不允许用户更改他的语言环境并始终使用他的设备。

有办法解决吗?这是我的代码(detectLocale() 中有问题的 async/await)。

const detectLocale =  async () => {
  const storedLocale = await AsyncStorage.getItem("my-locale");
  if (storedLocale) {
    return JSON.parse(storedLocale);
  }
  const mobileLocale =
    Platform.OS === "ios"
      ? NativeModules.SettingsManager.settings.AppleLocale ||
        NativeModules.SettingsManager.settings.AppleLanguages[0]
      : NativeModules.I18nManager.localeIdentifier;
  if (mobileLocale) {
    return mobileLocale.split("_")[0];
  }
  return languages.EN;
};

const languageDetector = {
  type: "languageDetector" as LanguageDetectorAsyncModule["type"],
  async: false,
  detect: detectLocale,
  init: () => {},
  cacheUserLanguage: () => {},
};

export default i18n
  .use(languageDetector)
  .use(initReactI18next)
  .init({
    resources,
    fallbackLng: languages.EN,
    keySeparator: ".",
    whitelist: [languages.EN, languages.FR],
    interpolation: { escapeValue: false },
  });

谢谢!

【问题讨论】:

    标签: react-native i18next asyncstorage react-i18next


    【解决方案1】:
    const detectLocale =  async (callback) => {
      const storedLocale = await AsyncStorage.getItem("my-locale");
      if (storedLocale) {
        return callback(JSON.parse(storedLocale));
      }
      const mobileLocale =
        Platform.OS === "ios"
          ? NativeModules.SettingsManager.settings.AppleLocale ||
            NativeModules.SettingsManager.settings.AppleLanguages[0]
          : NativeModules.I18nManager.localeIdentifier;
      if (mobileLocale) {
        return callback(mobileLocale.split("_")[0]);
      }
      return callback(languages.EN);
    };
    
    const languageDetector = {
      type: "languageDetector" as LanguageDetectorAsyncModule["type"],
      async: true,
      detect: detectLocale,
      init: () => {},
      cacheUserLanguage: () => {},
    };
    
    export default i18n
      .use(languageDetector)
      .use(initReactI18next)
      .init({
        resources,
        fallbackLng: languages.EN,
        keySeparator: ".",
        whitelist: [languages.EN, languages.FR],
        interpolation: { escapeValue: false },
      });
    

    【讨论】:

    • 您好,感谢您的建议。不幸的是,它没有按预期工作。如果我用Suspense 包裹我的,RN 不会再崩溃,但加载状态永远不会消失。我必须在编译后强制更改代码才能最终显示应用程序。
    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2020-01-10
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多