【发布时间】:2018-01-31 10:53:20
【问题描述】:
我在 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)
我可以通过将代码修改为:
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,
language关键字错误,请改用browserLanguage和systemLanguage。
标签: javascript reactjs react-redux internet-explorer-11