我有一个网站(Flash)本地化成十几种语言,我想根据用户的浏览器设置自动定义一个默认值,以尽量减少访问内容的步骤。

仅供参考,由于代理限制,我不能使用服务器脚本,所以我猜JavaScript或ActionScript将适合解决这个问题。

问题:

“猜测”用户语言环境的最佳方法是什么? 是否有任何现有的简单类/函数可以帮助我(没有复杂的本地化包)?特别是以一种聪明的方式将所有可能的语言减少到更小的数量(我有的翻译)。 在什么情况下我可以相信这样的解决方案? 还有其他的解决方法或建议吗?


当前回答

结合浏览器用来存储用户语言的多种方式,你得到这个函数:

const getNavigatorLanguage = () => {
  if (navigator.languages && navigator.languages.length) {
    return navigator.languages[0];
  } else {
    return navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';
  }
}

我们首先检查导航器。语言数组的第一个元素。 然后我们得到任意一个导航器。userLanguage或navigator.language。 如果失败,我们得到navigator.browserLanguage。 最后,如果其他方法都失败,我们将其设置为“en”。


下面是性感的俏皮话:

const getNavigatorLanguage = () => (navigator.languages && navigator.languages.length) ? navigator.languages[0] : navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';

其他回答

在Chrome和Firefox 32+上,Navigator。Languages包含一个按照用户偏好顺序排列的区域设置数组,比navigator更准确。然而,为了使它向后兼容(已测试的Chrome / IE / Firefox / Safari),然后使用这个:

function getLang() {
  if (navigator.languages != undefined) 
    return navigator.languages[0]; 
  return navigator.language;
}

我对此做了一些研究,并在下表中总结了我的发现

所以推荐的解决方案是写一个服务器端脚本来解析Accept-Language报头,并将其传递给客户端来设置网站的语言。奇怪的是,为什么需要服务器来检测客户端的语言偏好,但这就是目前的情况。还有其他各种各样的黑客可以检测语言,但根据我的理解,阅读Accept-Language报头是推荐的解决方案。

你说你的网站有Flash,那么,作为另一种选择,你可以通过Flash .system. capabilities获得操作系统的语言。语言-参见如何确定浏览器内的操作系统语言,以猜测操作系统的区域设置。

您还可以尝试从文档中获取语言,这可能是您的第一个调用端口,然后返回到其他方法,因为人们经常希望他们的JS语言与文档语言匹配。

HTML5:

html querySelector(“”),该文件。“lang”getAttribute ()

遗留问题:

元文件。querySelector(“[http-equiv = content-language)。getAttribute(‘内容’)

没有真正的资源是100%可靠的,因为人们可能只是把它放在错误的语言中。

有一些语言检测库可以让您根据内容确定语言。

将其从JavaScript移植来检测浏览器语言偏好

https://stackoverflow.com/a/42649975/1548557

我刚想到这个。它结合了较新的JS解构语法和一些标准操作来检索语言和区域设置。

var [lang, locale] = (
    (
        (
            navigator.userLanguage || navigator.language
        ).replace(
            '-', '_'
        )
    ).toLowerCase()
).split('_');

希望它能帮助到别人

**更新:**我还建议测试这个,并结合其他答案,例如https://stackoverflow.com/a/52112155/1548557,这似乎是一个更健壮的方式来获得语言。我们也有零并集??所以||可能不是最好的方法。我想象这就像

var [lang, locale] = (
    (
        getBrowserLanguage()
            .replace('-', '_')
    ).toLowerCase()
).split('_');

请注意,我没有强制lang或locale的默认值,而您可以这样做。世界是如此以英语为中心,我选择英语,但我不觉得这对我编码的任何人都有好处。我也没有调用getBrowserLanguage getNavigatorLanguage,这是故意的。也许你用的是导航器,但将来可能会用到其他东西。这确实是一种偏好。无论如何,我希望这仍然有用。