2016-08-29 3 views
14

でユーザーの地域を取得する(ISO-3166):が、私は私のユーザーの国を取得するには、このようなものを使用してきたいくつかの時間のためにnavigator.language

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

私はいつも文字列を想定しましたen-USに似ています - 国が第2位の配列を保持します。

私はこの仮定が間違っていると考えていますAccording to MDN docsnavigator.language戻り値:"BCP 47で定義されている言語バージョンを表す文字列。Reading BCP 47の場合、第1言語サブタグは最初に(例えば 'en')保証されるが、リージョンコードは第2サブタグであることが保証されない。リージョンのサブタグに先行して従うサブタグがあります。たとえば"sr-Latn-RS"については

は有効なBCP 47言語タグである:

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

navigator.languageのみ言語と地域を含むBCP 47のサブセットから返された値はありますか?または、言語タグから地域サブタグを抽出するためによく使用されるライブラリまたは正規表現がありますか?

答えて

0

正規表現は、ここで見つける:@TimoStaが言ったのと同じように

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' 
+0

Regexはなぜちょうど以下のような分割を使用することができるのか: const part = navigator.language.split( ' - '); const region = parts [parts.length-1] –

+0

領域は、分割後に配列の2番目の位置にあるとは限りません。上記の例を参照してください。 – Jeff

+0

そうです。実際の位置に関係なく常に最後のコードを取るコードを上回っています。ではない? –

2

あなたの解決策は、ブラウザの言語タグがユーザーの国と確実に一致するという誤った前提に基づいています。たとえば、私はブラウザ言語をドイツ語に設定していますが、現時点ではドイツの近くではなく、米国に住んでいます。

また、たとえばChromeでは、多くの言語パックで地域修飾子を指定する必要はありません。

> navigator.language 
< "de" 
全く

ない地域タグ、およびかなり共通の言語:ドイツ語

enter image description here

にChromeの表示言語を設定すると、次の言語タグを提供します。

私は米国に住んでいますが、ボトムラインは、言語設定のタグdeのブラウザ設定になります。


より正確で信頼性の高い方法でユーザーの場所を特定することは、要求に関連付けられたIPアドレスからそれを派生させることです。このサービスを提供する多数のサービスがあります。

$.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>

+0

に関するいくつかの追加情報を収集しました。私のアプリケーションでは、100%サポートは出荷の前提条件ではありません。私がする必要があるのは、ユーザーの地域で最も良い推測を得ることだけです。しかし、あなたの例では、あなたは言語と地域を混乱させているかもしれないと思います。 "de"は地域サブタグではない言語サブタグです。地域への言語は一対一ではありません。たとえば、「de-AT」はオーストリア( 'AT')で使用されているドイツ語( 'de')を表します。おそらく最も良い方法は、Geolocation、navigator.languages、およびいくつかの残りのエンドポイントというAPIの組み合わせを使用することです。入力をありがとうが、私はこれが正確に私の質問に答えるとは思わない。 – Jeff

0

Firefoxでは、あなたが好みで言語設定を選択できます:ip-api.comはそのうちの一つです

enter image description here

言語のリストには269項目、192を持っています地域コードは含まれていません。

この地域は、場所によって言語のバリエーションが異なる場合にのみ有効です。このようにして、ユーザーは応答を好む言語の変種であるサーバーに伝えることができます。

この方法を使用してユーザーを特定しないでください。ユーザーが地域を指定しない場合や、ユーザーが物理的に別の場所にいる可能性があるため、あまりにも信頼性がありません。

ユーザーを特定する場合は、Geolocation APIを使用してください。

+0

TimoStaの回答:言語!=地域ではなく、1-1で私のコメントを参照してください。私が興味を持っているのは、言語ではなくユーザーの地域です。 – Jeff

+0

@Jeffはい。あなたが 'navigator.language'で得ることは、ユーザーの好みの言語のバリエーションが話されている地域です。これはユーザーがいる地域ではなく、Geolocation APIで取得できます。 – Oriol

+0

私は場所を取得するためのユーザーの許可が必要ですか?包括的なソリューションは、これらの多くを使用したり、ユーザーが地域を選択できるようにするようなものです。しかし、もし私が提供されている場合、地域を抽出するためにBCP 47言語タグを解析するためのまともな方法があるかどうかは疑問でした。私はこれがかなり一般的な必要だと思うだろう。 – Jeff

0

あなたが受けている値は、HTTPリクエストのAccept-Languageをヘッダに由来します。

ヘッダの値は非常に複雑であることができるような

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

名前が示すように、同意語ヘッダは、基本的に許容される言語ではなく、国を定義します。

言語タグには、「en-GB」のように追加の位置情報も含まれている場合がありますが、「en」のようなものには追加できません。

そうでない場合、その国に関する情報はありません。

「en」のような言語を国に正確にマップすることは必ずしも可能ではありません。 言語が 'en'の場合、国は 'GB'でも 'US'でもかまいません。

できること。いくつかの言語にのみ使用されている

  • :言語は1が含まれている場合、言語を使用すると、以下のオプションを持っている国が含まれていない場合は

    • 「-GBエン」のように、唯一の国を決定しますデンマークでのみ話されているデンマーク語(私はここで推測しています)のような1つの国では、これらのケースをマッピングできます。
    • 他の場合は、言語に応じてデフォルトを使用できます(例: 'en'から 'GB'へ
    • すべての場合に「US」のような一般的なデフォルトを使用できます。国を特定することはできません。
    • 追加情報を使用できます。最後に、あなたが国に

    を入力するようユーザーに求めることができる国

  • を決定するために、クライアントのIPアドレスは、私が興味深いのAccept-Languageヘッダhere

  • 関連する問題

     関連する問題