簡體   English   中英

使用navigator.language獲取用戶的區域

[英]Getting the user's region with navigator.language

有一段時間,我一直在使用這樣的東西來獲取用戶的國家(ISO-3166):

const region = navigator.language.split('-')[1]; // 'US'

我一直認為這個字符串與en-US類似 - 這個國家將保持數組的第二個位置

我認為這個假設是不正確的 根據MDN文檔navigator.language返回: “表示BCP 47中定義的語言版本的字符串。” 讀取BCP 47 ,主要語言子標簽保證是第一個(例如,'en'),但區域代碼不保證是第二個子標簽。 區域子標簽之前和之后可以有子標簽。

例如, "sr-Latn-RS"是有效的BCP 47語言標記:

sr                |  Latn           |  RS
primary language  |  script subtag  |  region subtag

navigator.language返回的值是否只包含語言和區域的BCP 47的子集? 或者是否存在通常用於從語言標記中提取區域子標簽的庫或正則表達式?

您的解決方案基於錯誤的前提,即瀏覽器的語言標記可靠地匹配用戶的國家/地區。 例如,我已經將我的瀏覽器語言設置為德語,盡管我現在遠在德國附近,而是在美國。

此外,例如在Chrome中,許多語言包不需要您指定區域修改器。 將Chrome的顯示語言設置為德語

在此輸入圖像描述

提供以下語言標記:

> navigator.language
< "de"

根本沒有區域標簽,也是一種相當常見的語言。

最重要的是,我的瀏覽器設置結果是語言標簽de ,即使我住在美國。


確定用戶位置的更准確且可能可靠的方法是從與請求相關聯的IP地址導出它。 有許多服務提供此服務。 ip-api.com就是其中之一:

 $.get("http://ip-api.com/json", function(response) { console.log(response.country); // "United States" console.log(response.countryCode); // "US" }, "jsonp"); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

在Firefox中,您可以在首選項中選擇語言設置:

在此輸入圖像描述

語言列表有269項,其中192項不包含任何地區代碼。

只有當語言根據位置具有不同的變體時,該區域才有用。 這樣,用戶可以告訴服務器他們更喜歡響應的語言變體。

不要使用此方法來定位用戶。 它太不可靠,因為用戶可能沒有指定任何區域,或者因為用戶可能在物理上位於另一個地方。

如果要查找用戶,則應使用Geolocation API

正則表達式在這里找到: https//github.com/gagle/node-bcp47/blob/master/lib/index.js

var re = /^(?:(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$|^((?:[a-z]{2,3}(?:(?:-[a-z]{3}){1,3})?)|[a-z]{4}|[a-z]{5,8})(?:-([a-z]{4}))?(?:-([a-z]{2}|\d{3}))?((?:-(?:[\da-z]{5,8}|\d[\da-z]{3}))*)?((?:-[\da-wy-z](?:-[\da-z]{2,8})+)*)?(-x(?:-[\da-z]{1,8})+)?$|^(x(?:-[\da-z]{1,8})+)$/i;

let foo = re.exec('de-AT');      // German in Austria
let bar = re.exec('zh-Hans-CN'); // Simplified Chinese using Simplified script in mainland China

console.log(`region ${foo[5]}`); // 'region AT'
console.log(`region ${bar[5]}`); // 'region CN'

小心你有navigator.languagenavigator.languages

語言:

 console.log(navigator.language); // "fr"

語言:

 console.log(navigator.languages); // ["fr", "fr-FR", "en-US", "en"]

要查找國家/地區,請參閱ISO 3166-1上的Wikipedia或使用javascript lib:

正如@TimoSta所說,

試試這個

$.getJSON('http://freegeoip.net/json/', function(result) {
   alert(result.country_code);
});

來自javascript(客戶端)獲取訪問者語言和國家代碼 查看@noducks的答案

您收到的值源自HTTP請求的Accept-Language標頭。

標題的值可能非常復雜

Accept-Language: da, en-GB;q=0.8, en;q=0.7

顧名思義,Accept-Language標題基本上定義了可接受的語言,而不是國家。

語言標記可能還包含其他位置信息,如'en-GB',但其他類似'en'的信息不包含。

如果沒有,則沒有關於該國家的信息。

也不總是能夠將像'en'這樣的語言准確地映射到一個國家。 如果語言為“en”,則國家/地區可能為“GB”,但也可能為“US”。

你可以做什么 ;

  • 如果語言包含一個語言,則僅確定國家/地區,如'en-GB'
  • 如果語言不包含國家/地區,則您有以下選項:
  • 一些語言僅在一個國家使用,例如'da',丹麥語僅在丹麥使用(我在這里猜測),因此您可以映射這些案例。
  • 根據語言的不同,您可以對其他情況使用默認值,例如將'en'映射到'GB'
  • 對於所有情況,您都可以使用“美國”等一般默認值,無法確定國家/地區。
  • 您可以使用其他信息(例如客戶端IP地址)來確定國家/地區
  • 最后,您可以要求用戶進入該國家/地區

在這里收集了有關Accept-Language標題的一些其他信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM