首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用i18next-browser-languageDetector首次检测到一种语言?

是否可以使用i18next-browser-languageDetector首次检测到一种语言?
EN

Stack Overflow用户
提问于 2021-05-31 19:22:20
回答 2查看 380关注 0票数 0

我有一个反应应用程序,我已经翻译成几种语言,也包含一些日期格式化功能。例如,我想允许用户在12小时和24小时之间更改,但是当切换到德语时,自动将该选项更改为24小时(因为德国通常不使用12小时时间)。

我仍然希望这个选项能够被用户更改,我也不希望每次页面重新加载时都将其重置为24小时。

我正在使用i18nexti18next-browser-languageDetector来检测浏览器语言,目前我有一个绑定到i18next的事件,用于当用户手动更改语言时,以便按语言设置这些默认设置,这是非常有效的:

代码语言:javascript
复制
i18n.on('languageChanged', lang => {
  // Language specific options
  if (lang === 'de') {
    store.setTimeFormat('24h');
  }
  if (lang === 'en') {
    store.setTimeFormat('12h');
  }
});

现在,唯一的问题是,当第一次加载应用程序时,即当浏览器检测器第一次检测到用户的语言时,该函数不会触发。

如何确定i18next-browser-languageDetector最初检测到语言的时间,也就是说,不是从本地存储加载,而是查询字符串lng=de会触发它,以便我可以设置这些设置?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-31 21:11:35

我设法解决了这个问题,首先检查一种语言是否已经保存在本地存储中,将这个添加到i18next选项对象中,然后我可以稍后检查它来设置默认值。

代码语言:javascript
复制
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import Backend from 'i18next-http-backend';

// Check the localstorage before i18next can
const storedLang = localStorage.getItem('i18nextLng');

i18n
  .use(LanguageDetector)
  .use(Backend)
  .use(initReactI18next)
  .init({
    fallbackLng: 'en',
    interpolation: {
      escapeValue: false,
    },
    backend: {
      loadPath: '/i18n/{{lng}}/{{ns}}.json',
    },
    storedLang, // Add it here
  });

export default i18n;

然后,在我的组件中,我可以在函数中添加以下内容:

代码语言:javascript
复制
import { useTranslation } from 'react-i18next';
import { mySettingsStore } from 'stores';

const setDefaults = (lang, store) => {
  // Language specific options
  if (lang === 'de') {
    store.setTimeFormat('24h');
  }
  if (lang === 'en') {
    store.setTimeFormat('12h');
  }
  // etc...
};

const Component = () => {
  const store = mySettingsStore(); // zustand store
  const { i18n } = useTranslation();

  // If localstorage was empty: no language set
  if (!i18n.options.storedLang) {
    setDefaults(i18n.language, store);
    i18n.options.storedLang = i18n.language;
  }

  // Language changed manually
  i18n.on('languageChanged', lang => {
    setDefaults(lang, store);
  });

  return (...);
};

export default Component;

但是,如果语言是通过查询字符串设置的,例如https://my.app?lng=de,如果已经在本地存储中设置了语言,则此方法不会更新选项。这可以通过以相同的方式检查查询字符串参数来补救,但是如果使用更多的选项,例如会话存储、cookie等,则维护它可能很快变得麻烦。

票数 0
EN

Stack Overflow用户

发布于 2021-06-02 03:52:58

对于检测到的第一种语言,您可能希望尝试使用onInitialized event。然后检查i18next.languagei18next.languages,这取决于您的需要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67772792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档