用于检测浏览器语言偏好的 JavaScript [重复]

Posted

技术标签:

【中文标题】用于检测浏览器语言偏好的 JavaScript [重复]【英文标题】:JavaScript for detecting browser language preference [duplicate] 【发布时间】:2010-11-05 19:30:37 【问题描述】:

我一直在尝试使用 javascript 检测浏览器语言偏好。

如果我在Tools>Internet Options>General>Languages中设置IE浏览器语言,如何使用JavaScript读取这个值?

Firefox 也有同样的问题。我无法使用navigator.language 检测到tools>options>content>languages 的设置。

使用 navigator.userLanguage ,它会检测到通过 Start>ControlPanel>RegionalandLanguageOptions>Regional Options 标签页。

我已经用navigator.browserLanguagenavigator.systemLanguage 进行了测试,但都没有返回第一个设置的值(Tools>InternetOptions>General>Languages

我找到了一个link 详细讨论了这个问题,但问题仍然没有答案:(

【问题讨论】:

现在 (2020) 有一个实验性功能,所有浏览器都支持它返回一组语言偏好:navigator.languages //["en-US", "zh-CN", "ja-JP"] 【参考方案1】:

我认为这里的主要问题是浏览器设置实际上不会影响通过 javascript 获得的 navigator.language 属性。

它们确实影响的是 HTTP 'Accept-Language' 标头,但似乎该值根本无法通过 javascript 获得。 (可能是为什么@anddoutoi 说他找不到不涉及服务器端的参考。)

我编写了一个解决方法:我在http://ajaxhttpheaders.appspot.com 上敲了一个谷歌应用引擎脚本,它将通过 JSONP 返回 HTTP 请求标头。

(注意:只有在您没有可以为您执行此操作的后端时才可以使用此方法。通常,您不应调用页面中的第三方托管 javascript 文件,除非您有对主机的高度信任。)

我打算将它永久保留在那里,因此请随意在您的代码中使用它。

这里有一些示例代码(在 jQuery 中),您可以如何使用它

$.ajax( 
    url: "http://ajaxhttpheaders.appspot.com", 
    dataType: 'jsonp', 
    success: function(headers) 
        language = headers['Accept-Language'];
        nowDoSomethingWithIt(language);
    
);

希望有人觉得这很有用。

编辑:我在 github 上编写了一个包含此功能的小型 jQuery 插件:https://github.com/dansingerman/jQuery-Browser-Language

编辑 2:这里要求的是在 AppEngine 上运行的代码(真的超级简单):

class MainPage(webapp.RequestHandler):
    def get(self):
        headers = self.request.headers
        callback = self.request.get('callback')

        if callback:
          self.response.headers['Content-Type'] = 'application/javascript'
          self.response.out.write(callback + "(")
          self.response.out.write(headers)
          self.response.out.write(")")
        else:
          self.response.headers['Content-Type'] = 'text/plain'
          self.response.out.write("I need a callback=")

application = webapp.WSGIApplication(
                                     [('/', MainPage)],
                                     debug=False)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Edit3:已在此处开源应用引擎代码:https://github.com/dansingerman/app-engine-headers

【讨论】:

@msec 我已按要求发布了 Python appengine 脚本。请注意,如果服务器端可用,这在任何语言中都应该非常简单 - 该服务实际上只需要存在于那些没有(或不想拥有)服务器端组件的人。 嗨,丹,这个问题获得了 14k 的浏览量,而且还在增加 - 也许你想在 github 上发布你的脚本?问候,毫秒 是否还有其他可靠的网站可以返回 HTTP 请求标头,例如 Google?我想要做的是将用户重定向到他们的浏览器语言设置,我的网站是全球性的。所以我需要依赖全球可用且永久的网站。 @deckard ummm - 互联网全球性的。 appengine 脚本应该可以在 Internet 上的任何地方正常工作。但是 - 对于没有可用后端的开发人员来说,这确实是一种 hack - 它不应该在您可以控制后端的“真实”站点中使用。 @MatthewFlaschen 你说的很对(在我的辩护中,我在 2 年前大约 5 分钟内编写了脚本。)我会在有机会时修复它。【参考方案2】:
var language = window.navigator.userLanguage || window.navigator.language;
alert(language); //works IE/SAFARI/CHROME/FF

window.navigator.userLanguage 仅适用于 IE,它是 Windows 控制面板 - 区域选项 中设置的语言,而不是浏览器语言,但您可以假设用户使用的机器将窗口区域设置设置为法国可能是法国用户。

navigator.language 是 FireFox 和所有其他浏览器。

一些语言代码:'it' = 意大利,'en-US' = 英语美国等


正如下面的 cmets 中的 rcoupThe WebMacheter 所指出的,当用户在 IE 以外的浏览器中查看网站时,此解决方法不会让您区分英语方言.

window.navigator.language (Chrome/FF/Safari) 总是返回浏览器语言而不是浏览器的首选语言,但是:“说英语的人(gb、au、nz 等)有一个 en-us 是很常见的Firefox/Chrome/Safari 版本。”因此window.navigator.language 仍将返回en-US,即使用户首选语言是en-GB

【讨论】:

这是不正确的。在 Chrome 中调用 navigator.language 将返回 Chrome 显示的语言,NOT 用户的首选语言(即语言列表顶部的语言)。 @Anzeo:使用一种语言的用户访问您的网站的可能性很低,但安装了另一种语言的浏览器,后来他们还设置了另一种首选语言。正如其他人所说,没有像样的方法,我的回答是一个简单的简短解决方法,用于通常不会导致致命错误的任务。如果您必须绝对确定用户使用哪种语言,您可以随时通过在您的网站上添加选择列表并将其选择保存到 cookie 中来询问他。 @MarcoDemaio 说英语的人(gb、au、nz 等)拥有 Firefox/Chrome/Safari 的 en-us 版本是很常见的。有时存在 en-gb 构建,但它们并不流行,而且其他 en 变体肯定没有。 Chrome 拥有 window.navigator.languages 以及一系列用户首选语言。 @stunpix - Chrome 可能会自动将键盘布局添加到首选语言。但是您可以编辑此列表,window.navigator.languages 已从首选项中排序了语言列表:chrome://settings/languages【参考方案3】:

2014 年更新。

现在有一种方法可以使用 navigator.languages 在 Firefox 和 Chrome 中获取 Accept-Languages(适用于 Chrome >= 32 和 Firefox >= 32)

此外,这些年来 Firefox 中的 navigator.language 反映了最喜欢的内容语言,而不是 UI 语言。但是由于这个概念还没有被其他浏览器支持,所以它不是很有用。

因此,尽可能获得最受欢迎的内容语言,并使用 UI 语言作为后备:

navigator.languages
    ? navigator.languages[0]
    : (navigator.language || navigator.userLanguage)

【讨论】:

获取首选语言列表或回退到 UI 语言(均作为数组)的替代实现是:window.navigator.languages || [window.navigator.language || window.navigator.userLanguage] 使用navigator.languages[0] 获取语言是个坏主意。我系统的默认语言是俄语,navigator.language 返回正确的语言代码“ru”。但是navigator.languages 返回["en-US", "en", "ru", "uk"]。因此,获取索引为 0 的语言将为您提供“en-US”,这对我的系统不正确。请不要使用 navigator.languages 来检测当前系统的语言。 还有一件事:navigator.languages 表示按字母顺序(!)排序的可用于用户系统中文本输入的语言列表。它们没有按照用户的偏好排序。 @stunpix 这不是关于系统的语言,而是关于浏览器内的偏好。这可能与系统语言一致,也可能不一致,具体取决于安装的浏览器。我建议你看看你的浏览器的设置。 Firefox:首选项-内容-语言,Chrome:设置(高级)-语言 @stunpix 不,这是不正确的。数组中首选语言的顺序反映了用户设置的顺序:developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/…【参考方案4】:

我在Angular Translate module 中发现了这段代码来检测浏览器的语言,您可以找到源代码here。我稍微修改了代码,将 angular.isArray 替换为 Array.isArray 以使其独立于 Angular 库。

var getFirstBrowserLanguage = function () 
    var nav = window.navigator,
    browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
    i,
    language;

    // support for html 5.1 "navigator.languages"
    if (Array.isArray(nav.languages)) 
      for (i = 0; i < nav.languages.length; i++) 
        language = nav.languages[i];
        if (language && language.length) 
          return language;
        
      
    

    // support for other well known properties in browsers
    for (i = 0; i < browserLanguagePropertyKeys.length; i++) 
      language = nav[browserLanguagePropertyKeys[i]];
      if (language && language.length) 
        return language;
      
    

    return null;
  ;

console.log(getFirstBrowserLanguage());

【讨论】:

这似乎比其他 JS 答案更可靠,例如对 language.length 的检查意味着它将跳过语言数组中的空项(如果发生这种情况?) 为了在检测到 nav.languages 是一个数组时支持旧版浏览器,您应该使用:Object.prototype.toString.call(nav.languages) === '[object Array]' 澄清一下:旧浏览器 = ( IE EamonnM 对此代码的编辑可能更优化,请参阅:***.com/a/46514247/9314312【参考方案5】:

let lang = window.navigator.languages ? window.navigator.languages[0] : null;
    lang = lang || window.navigator.language || window.navigator.browserLanguage || window.navigator.userLanguage;

let shortLang = lang;
if (shortLang.indexOf('-') !== -1)
    shortLang = shortLang.split('-')[0];

if (shortLang.indexOf('_') !== -1)
    shortLang = shortLang.split('_')[0];

console.log(lang, shortLang);

我只需要主要组件来满足我的需要,但您可以轻松地使用完整的字符串。适用于最新的 Chrome、Firefox、Safari 和 IE10+。

【讨论】:

【参考方案6】:

var language = navigator.languages && navigator.languages[0] || // Chrome / Firefox
               navigator.language ||   // All browsers
               navigator.userLanguage; // IE <= 10

console.log(language);
https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/language

试用 PWA 模板https://github.com/StartPolymer/progressive-web-app-template

【讨论】:

只需运行你的脚本,得到en-US,在osX El Capitan 上用西班牙语,Chrome 用西班牙语设置,来自巴塞罗那.. 允许的语言列表,并选择第一个navigator.languages[0] , 不是用户使用的实际语言。【参考方案7】:

navigator.userLanguage 用于 IE

window.navigator.language 用于 firefox/opera/safari

【讨论】:

navigator.userLanguage 不会给他他想要的东西。来自 userLanguage-docs:此属性反映了控制面板区域选项中“您的语言环境(位置)”框中的设置,例如“英语(美国)”。 它实际上说它将返回“语言代码中列出的任何可能的返回值”。如“en”或“en-gb”msdn.microsoft.com/en-us/library/ie/ms533052.aspxmsdn.microsoft.com/en-us/library/ie/ms534713.aspx【参考方案8】:

我一直在使用 Hamid 的答案,但在语言数组类似于 ["en", "en-GB", "en-US", "fr-FR", "fr" 的情况下, "en-ZA"] 它将返回 "en",而 "en-GB" 将是更好的匹配。

我的更新(如下)将返回第一个长格式代码,例如"en-GB",否则它将返回第一个短代码,例如"en",否则返回 null。

function getFirstBrowserLanguage() 
        var nav = window.navigator,
            browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],
            i,
            language,
            len,
            shortLanguage = null;

        // support for HTML 5.1 "navigator.languages"
        if (Array.isArray(nav.languages)) 
            for (i = 0; i < nav.languages.length; i++) 
                language = nav.languages[i];
                len = language.length;
                if (!shortLanguage && len) 
                    shortLanguage = language;
                
                if (language && len>2) 
                    return language;
                
            
        

        // support for other well known properties in browsers
        for (i = 0; i < browserLanguagePropertyKeys.length; i++) 
            language = nav[browserLanguagePropertyKeys[i]];
            //skip this loop iteration if property is null/undefined.  IE11 fix.
            if (language == null)  continue;  
            len = language.length;
            if (!shortLanguage && len) 
                shortLanguage = language;
            
            if (language && len > 2) 
                return language;
            
        

        return shortLanguage;
    

console.log(getFirstBrowserLanguage());

更新: IE11 在某些属性未定义时出错。添加了一个检查以跳过这些属性。

【讨论】:

它适用于我测试过的所有浏览器——桌面和移动。您在使用哪个浏览器时遇到问题? 'browserLanguage', 'systemLanguage' 和, 'userLanguage' 不是 chrome 和 firefox 的属性.. 但所有浏览器中都存在'language'.. 我没有看到它会返回第一个回答问题的短代码..删除我以前的评论.. 这是一个常见问题,人们的偏好顺序为 ["en", "en-GB"],但又想要相反的偏好。我认为这些语言应该按照用户偏好的顺序排列。如果是 ["fr", "en-GB"],那不是偏爱法语吗? @Brent 说得好。这取决于你需要什么。对于 ["en", "en-GB"] 我想得到 "en-GB" 因为它是同一语言的更具体的版本。 ["fr", "en-GB"] 是不同的,因为它们是不同的语言,而 "fr" 可能是更好的结果。【参考方案9】:

没有合适的方法来获得该设置,至少不是独立于浏览器的东西。

但服务器有该信息,因为它是 HTTP 请求标头的一部分(Accept-Language 字段,请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4)

所以唯一可靠的方法是从服务器获取答案。您将需要在服务器上运行的东西(如 .asp、.jsp、.php、CGI),并且“东西”可以返回该信息。 这里有很好的例子:http://www.developershome.com/wap/detection/detection.asp?page=readHeader

【讨论】:

请记住,这并不是向用户提供“正确”语言的一种特别可靠的方式。许多用户会想要一个替代选项——不要让他们束手无策! 100% 同意。使用该信息是最好的猜测。如果你弄错了,你应该允许用户覆盖它。如果用户有可能返回,您可能会在 cookie 中记住该选择。如果网站需要身份验证,您可能会在用户个人资料中包含该信息。【参考方案10】:

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

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

希望对某人有所帮助

【讨论】:

【参考方案11】:

我找不到一个单一的参考表明它是可能的而不涉及服务器端。

MSDN 上:

导航器.browserLanguage 导航器.systemLanguage 导航器.userLanguage

来自浏览器语言:

在 Microsoft Internet Explorer 4.0 和 之前,browserLanguage 属性 反映安装的语言 浏览器的用户界面。例如, 如果你安装的是日文版 Windows Internet Explorer 在 英文操作系统, browserLanguage 应该是 ja。

在 Internet Explorer 5 及更高版本中, 但是, browserLanguage 属性 反映操作的语言 系统不管安装 Internet Explorer 的语言版本。 但是,如果 Microsoft Windows 2000 MultiLanguage 版本已安装, browserLanguage 属性表示 操作中设置的语言 系统的当前菜单和对话框,如 在区域选项中找到 控制面板。例如,如果您 安装日文版网络 Explorer 5 on an English (United 王国)操作系统, browserLanguage 将是 en-gb。如果你 安装 Windows 2000 多语言 版本并设置语言 法语菜单和对话框, browserLanguage 会是 fr,甚至 虽然你有日文版 Internet Explorer。

注意此属性不表示 语言设置的语言 语言首选项中的用户,位于 在 Internet 选项对话框中。

此外,browserLanguage 似乎已被弃用,因为 IE8 没有列出它

【讨论】:

+1,但是您在哪里读到 navigator.browserLanguage 已弃用?它没有写在您回答的 MSDN 文章的链接中,我只是在 IE11 中对其进行了测试,并且可以正常工作!我不再有 IE8,但我用 IE8 模拟器对其进行了测试,它可以工作(我知道 IE8 模拟器不是测试事物的最佳选择)。 嗯,是的,这看起来很奇怪。但我不知道5年前我是如何得出这个结论的>. @anddoutoi 它在 IE 8 中不可用,因为它是在 IE 9 中引入的,所以它与你的完全相反。【参考方案12】:

如果您只需要支持某些现代浏览器,那么您现在可以使用:

navigator.languages

按照用户指定的顺序返回用户语言偏好的数组。

截至目前(2014 年 9 月),这适用于: 铬 (v37), 火狐 (v32) 和 歌剧 (v24)

但不在: IE (v11)

【讨论】:

如果它对其他人有帮助,我原以为它可以在 ios 8 的 Safari 中使用,因为我认为它属于 modern 类别。我错了。【参考方案13】:

Javascript方式:

var language = window.navigator.userLanguage || window.navigator.language;//returns value like 'en-us'

如果你使用jQuery.i18n plugin,你可以使用:

jQuery.i18n.browserLang();//returns value like '"en-US"'

【讨论】:

【参考方案14】:

如果您正在开发 Chrome 应用程序/扩展程序,请使用 chrome.i18n API。

chrome.i18n.getAcceptLanguages(function(languages) 
  console.log(languages);
  // ["en-AU", "en", "en-US"]
);

【讨论】:

我喜欢这个。它是特定于铬的,但电子不是在引擎盖下使用铬吗?这是否仅适用于 chrome 或任何 chromium 项目 这只能在 Chrome 扩展中使用。它在常规网页上的 Chrome 中不可用。我不确定 Electron。【参考方案15】:

我遇到了同样的问题,我编写了以下仅包含多个浏览器代码的前端库。代码不多,但不必在多个网站上复制和粘贴相同的代码。

获取:acceptedlanguages.js

使用它:

<script src="acceptedlanguages.js"></script>
<script type="text/javascript">
  console.log('Accepted Languages:  ' + acceptedlanguages.accepted);
</script>

它总是返回一个数组,按用户偏好排序。在 Safari 和 IE 中,数组始终是单一长度的。在 FF 和 Chrome 中,它可能不止一种语言。

【讨论】:

【参考方案16】:

DanSingerman 对这个问题有一个很好的解决方案。

该语言的唯一可靠来源是 HTTP 请求标头。 因此,您需要一个服务器端脚本来回复请求标头或至少将 Accept-Language 字段回复给您。

这是一个非常简单的 Node.js 服务器,应该与 DanSingermans jQuery 插件兼容。

var http = require('http');
http.createServer(function (req, res) 
  res.writeHead(200, 'Content-Type': 'text/plain');
  res.end(JSON.stringify(req.headers));
).listen(80,'0.0.0.0');

【讨论】:

他的插件使用的是JSONP,所以我认为这不会兼容。【参考方案17】:

对于它的价值,维基媒体的通用语言选择器库有这样做的钩子: https://www.mediawiki.org/wiki/Extension:UniversalLanguageSelector

查看 resources/js/ext.uls.init.js 中的 getFrequentLanguageList 函数。直接链接: https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/UniversalLanguageSelector.git;a=blob;f=resources/js/ext.uls.init.js;hb=HEAD

它仍然依赖于服务器,或者更具体地说,是 MediaWiki API。我展示它的原因是它可以提供一个很好的例子来获取有关用户语言的所有有用信息:浏览器语言、接受语言、地理位置(从 CLDR 获取国家/语言信息),当然,用户自己的网站偏好。

【讨论】:

【参考方案18】:

我想分享我的代码,因为它有效并且与其他给出的答案不同。 在此示例中,如果您说法语(法国、比利时或其他法语),您将被重定向到法语页面,否则会重定向到英语页面,具体取决于浏览器配置:

<script type="text/javascript">
$(document).ready(function () 
    var userLang = navigator.language || navigator.userLanguage;
    if (userLang.startsWith("fr")) 
            window.location.href = '../fr/index.html';
    
    else 
            window.location.href = '../en/index.html';
    
);
</script>

【讨论】:

【参考方案19】:

Dan Singerman 的回答有一个问题,即由于 jQuery 的 ajax 的异步特性,必须立即使用获取的标头。但是,使用他的 google 应用服务器,我编写了以下内容,以便将标头设置为初始设置的一部分,并且可以在以后使用。

<html>
<head>
<script>

    var bLocale='raw'; // can be used at any other place

    function processHeaders(headers)
        bLocale=headers['Accept-Language'];
        comma=bLocale.indexOf(',');
        if(comma>0) bLocale=bLocale.substring(0, comma);
    

</script>

<script src="jquery-1.11.0.js"></script>

<script type="application/javascript" src="http://ajaxhttpheaders.appspot.com?callback=processHeaders"></script>

</head>
<body>

<h1 id="bLocale">Should be the browser locale here</h1>

</body>

<script>

    $("#bLocale").text(bLocale);

</script>
</html>

【讨论】:

【参考方案20】:

如果您不想依赖外部服务器并且拥有自己的服务器,则可以使用简单的 PHP 脚本来实现与 @DanSingerman 答案相同的行为。

languageDetector.php

<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
echo json_encode($lang);
?>

只需从 jQuery 脚本中更改以下行:

url: "languageDetector.php",
dataType: 'json',
success: function(language) 
    nowDoSomethingWithIt(language);

【讨论】:

【参考方案21】:

如果你控制了一个后端并且正在使用 django,那么 Dan 的想法的 4 行实现是:

def get_browser_lang(request):
if request.META.has_key('HTTP_ACCEPT_LANGUAGE'):
    return JsonResponse('response': request.META['HTTP_ACCEPT_LANGUAGE'])
else:
    return JsonResponse('response': settings.DEFAULT_LANG)

然后在 urls.py 中:

url(r'^browserlang/$', views.get_browser_lang, name='get_browser_lang'),

在前端:

$.get(lg('SERVER') + 'browserlang/', function(data)
    var lang_code = data.response.split(',')[0].split(';')[0].split('-')[0];
);

(当然你必须在 settings.py 中设置 DEFAULT_LANG)

【讨论】:

【参考方案22】:

根据Accessing the web page's HTTP Headers in JavaScript这里的答案,我构建了以下脚本来获取浏览器语言:

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
var contentLanguage = headers.match( /^content-language\:(.*)$/gm );
if(contentLanguage[0]) 
    return contentLanguage[0].split(":")[1].trim().toUpperCase();

【讨论】:

【参考方案23】:

如果您使用的是 ASP .NET MVC,并且想要从 JavaScript 获取 Accepted-Languages 标头,那么这里是一个不涉及任何异步请求的解决方法示例。

在您的 .cshtml 文件中,将标头安全地存储在 div 的 data- 属性中:

<div data-languages="@Json.Encode(HttpContext.Current.Request.UserLanguages)"></div>

然后您的 JavaScript 代码可以访问该信息,例如使用 JQuery:

<script type="text/javascript">
$('[data-languages]').each(function () 
    var languages = $(this).data("languages");
    for (var i = 0; i < languages.length; i++) 
        var regex = /[-;]/;
        console.log(languages[i].split(regex)[0]);
    
);
</script>

当然,您可以对其他服务器技术使用类似的方法,就像其他人提到的那样。

【讨论】:

【参考方案24】:

对于正在寻找 Java Server 解决方案的人

这里是 RestEasy

@GET
@Path("/preference-language")
@Consumes("application/json", "application/xml")
@Produces("application/json", "application/xml")
public Response getUserLanguagePreference(@Context HttpHeaders headers) 
    return Response.status(200)
            .entity(headers.getAcceptableLanguages().get(0))
            .build();

【讨论】:

【参考方案25】:

我有一个不同的方法,这可能会帮助将来的人:

客户想要一个可以交换语言的页面。 我需要通过该设置格式化数字(不是浏览器设置/不是任何预定义设置)

所以我根据配置设置(i18n)设置了一个初始设置

$clang = $this->Session->read('Config.language');
echo "<script type='text/javascript'>var clang = '$clang'</script>";

后来在脚本中我使用了一个函数来确定我需要什么数字格式

function getLangsettings()
  if(typeof clang === 'undefined') clang = navigator.language;
  //console.log(clang);
  switch(clang)
    case 'de':
    case 'de-de':
        return precision : 2, thousand : ".", decimal : ","
    case 'en':
    case 'en-gb':
    default:
        return precision : 2, thousand : ",", decimal : "."
  

所以我使用了页面的设置语言,作为后备我使用了浏览器设置。

这也应该有助于测试目的。

根据您的客户,您可能不需要这些设置。

【讨论】:

【参考方案26】:

我有一个 hack,我认为它使用的代码非常少,而且非常可靠。

将您网站的文件放在子目录中。 SSL 进入您的服务器,并创建指向存储文件的子目录的符号链接,指示您的语言。

类似这样的:

ln -s /var/www/yourhtml /var/www/en
ln -s /var/www/yourhtml /var/www/sp
ln -s /var/www/yourhtml /var/www/it

使用您的网络服务器读取 HTTP_ACCEPT_LANGUAGE 并根据它提供的语言值重定向到这些“不同的子目录”。

现在您可以使用 Javascript 的 window.location.href 来获取您的 url 并在条件中使用它来可靠地识别首选语言。

url_string = window.location.href;
if (url_string = "http://yoursite.com/it/index.html") 
    document.getElementById("page-wrapper").className = "italian";

【讨论】:

以上是关于用于检测浏览器语言偏好的 JavaScript [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript

js javascript浏览器语言检测,获取用户的浏览器语言首选项

反正有没有使用javascript检测操作系统语言?

如何检测用于创建 slug 的输入语言,如果不是英语,那么 slug 输入使用 javascript 保持为空

初识JavaScript

javascript 布尔(true或false)函数,用于检测当前正在浏览网站的移动设备