Javascript IE11-使用navigator.Language进行语言检测不工作
我在React应用程序中运行了一个函数来检测用户的浏览器语言,然后更新站点的语言首选项,并将站点作为en-GB(默认)、en-US或zh-Hans服务。该脚本仅在检测到某些en-US或zh-Hans变体时更新站点的语言 导致错误的函数是: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
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
。