Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript IE11-使用navigator.Language进行语言检测不工作_Javascript_Reactjs_React Redux_Internet Explorer 11 - Fatal编程技术网

Javascript IE11-使用navigator.Language进行语言检测不工作

Javascript IE11-使用navigator.Language进行语言检测不工作,javascript,reactjs,react-redux,internet-explorer-11,Javascript,Reactjs,React Redux,Internet Explorer 11,我在React应用程序中运行了一个函数来检测用户的浏览器语言,然后更新站点的语言首选项,并将站点作为en-GB(默认)、en-US或zh-Hans服务。该脚本仅在检测到某些en-US或zh-Hans变体时更新站点的语言 导致错误的函数是: function* setLanguageFromBrowserSettings() { let lang = null; if ((navigator.languages[0] === "en-US") || (navigator.languages

我在React应用程序中运行了一个函数来检测用户的浏览器语言,然后更新站点的语言首选项,并将站点作为en-GB(默认)、en-US或zh-Hans服务。该脚本仅在检测到某些en-US或zh-Hans变体时更新站点的语言

导致错误的函数是:

function* setLanguageFromBrowserSettings() {
  let lang = null;
  if ((navigator.languages[0] === "en-US") || (navigator.languages[0] === "en")) {
    lang = "en-US";
    console.log("Language set to en-US");
  } else if ((navigator.languages[0] === "zh") || (navigator.languages[0] === "zh-CN") || (navigator.languages[0] === "zh-Hans")) {
    lang = "zh-Hans";
    console.log("Language set to zh-Hans");
  } else if ((navigator.language === "en-US") || (navigator.language === "en")) {
    lang = "en-US";
    console.log("Language set to en-US");
  } else if ((navigator.language === "zh") || (navigator.language === "zh-CN") || (navigator.language === "zh-Hans")) {
    lang = "zh-Hans";
    console.log("Language set to zh-Hans");
  }
  if (lang) {
    yield put({
      type: "Translations/SetLocale",
      payload: lang
    });
  }
}
错误消息是:

uncaught at anonymous at anonymous

 at anonymous

 TypeError: Unable to get property '0' of undefined or null reference

   at setLanguageFromBrowserSettings$ (http://10.0.0.80:3001/static/js/bundle.js:124136:11)

   at tryCatch (http://10.0.0.80:3001/static/js/bundle.js:85481:7)

   at invoke (http://10.0.0.80:3001/static/js/bundle.js:85715:9)

   at prototype[method] (http://10.0.0.80:3001/static/js/bundle.js:85533:9)

   at next (http://10.0.0.80:3001/static/js/bundle.js:83498:9)

   at proc (http://10.0.0.80:3001/static/js/bundle.js:83457:3)

   at resolveIterator (http://10.0.0.80:3001/static/js/bundle.js:83643:5)

   at runCallEffect (http://10.0.0.80:3001/static/js/bundle.js:83704:5)

   at runEffect (http://10.0.0.80:3001/static/js/bundle.js:83617:5)

   at next (http://10.0.0.80:3001/static/js/bundle.js:83502:9)

   at currCb (http://10.0.0.80:3001/static/js/bundle.js:83575:7)

   at end (http://10.0.0.80:3001/static/js/bundle.js:83543:18)

   at task.cont (http://10.0.0.80:3001/static/js/bundle.js:83286:11)
在IE11中,我可以通过将代码修改为:

function* setLanguageFromBrowserSettings() {
  let lang = "en-US";
  if (lang) {
    yield put({
      type: "Translations/SetLocale",
      payload: lang
    });
  }
}
这意味着问题出在这段代码中:

  if ((navigator.languages[0] === "en-US") || (navigator.languages[0] === "en")) {
    lang = "en-US";
    console.log("Language set to en-US");
  } else if ((navigator.languages[0] === "zh") || (navigator.languages[0] === "zh-CN") || (navigator.languages[0] === "zh-Hans")) {
    lang = "zh-Hans";
    console.log("Language set to zh-Hans");
  } else if ((navigator.language === "en-US") || (navigator.language === "en")) {
    lang = "en-US";
    console.log("Language set to en-US");
  } else if ((navigator.language === "zh") || (navigator.language === "zh-CN") || (navigator.language === "zh-Hans")) {
    lang = "zh-Hans";
    console.log("Language set to zh-Hans");
  }
上述功能在Chrome和Firefox中运行良好,但在IE(通常)中不起作用


有人知道是什么原因导致IE11中的上述代码块失败吗?非常感谢您的帮助。

IE在navigator对象中没有languages属性

它有userLanguage和Systemlanguage

请查收


因此,对于IE,您可能必须检查navigator.userLanguage和navigator.Systemlanguage

与IE11不具有navigator.languages属性访问权限相关的答案

需要修改代码(仍然可以进行重构!)以检查navigator.languages属性是否存在,然后测试语言,如果不满足条件则返回

function* setLanguageFromBrowserSettings() {
  if (!navigator.languages) {
    if ((navigator.language === "en-US") || (navigator.language === "en")) {
      console.log("Language set to en-US");
      yield put({
        type: "Translations/SetLocale",
        payload: "en-US"
      });
    } else if ((navigator.language === "zh") || (navigator.language === "zh-CN") || (navigator.language === "zh-Hans")) {
      console.log("Language set to zh-Hans");
      yield put({
        type: "Translations/SetLocale",
        payload: "zh-Hans"
      });
    }
    return 0;
  }
  if ((navigator.languages[0] === "en-US") || (navigator.languages[0] === "en")) {
    console.log("Language set to en-US");
    yield put({
      type: "Translations/SetLocale",
      payload: "en-US"
    });
  } else if ((navigator.languages[0] === "zh") || (navigator.languages[0] === "zh-CN") || (navigator.languages[0] === "zh-Hans")) {
    console.log("Language set to zh-Hans");
    yield put({
      type: "Translations/SetLocale",
      payload: "zh-Hans"
    });
  }
}

谢谢-你的回答帮助我解决了这个问题。代码失败是因为我正在检查不存在的内容-IE11确实可以访问navigator.language属性,这是我的IE11特定代码正在检查的内容,但由于尝试检查不存在的navigator.languages属性的值而失败。对于IE而言,
language
关键字错误,改用
browserLanguage
systemLanguage