it-swarm.com.de

Die Region des Benutzers mit navigator.language abrufen

Seit einiger Zeit benutze ich so etwas, um das Land meines Benutzers zu erhalten (ISO-3166):

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

Ich habe immer vorausgesetzt der String würde en-US - ähnlich sein, wobei das Land die 2. Position des Arrays halten würde. 

Ich denke diese Annahme ist falsch . Laut MDN-Dokumenten gibt navigator.language zurück: "Zeichenfolge, die die in BCP 47 definierte Sprachversion darstellt."Lesen von BCP 47 , der primäre Untertitel der Sprache ist garantiert der erste (z , 'en'), aber es ist nicht garantiert, dass der Regionscode der 2. Untertag ist. Es können Untertags vorhanden sein, die vor und nach dem Regionsuntertag liegen. 

Zum Beispiel ist "sr-Latn-RS" ein gültiges BCP 47-Sprach-Tag:

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

Ist der von navigator.language zurückgegebene Wert eine Untermenge von BCP 47, die nur Sprache und Region enthält? Oder gibt es eine Bibliothek oder einen regulären Ausdruck, der üblicherweise verwendet wird, um den Regionsuntertag aus einem Sprachtag zu extrahieren?

15
Jeff

Regex hier gefunden: 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'
1
Jeff

Ihre Lösung basiert auf der falschen Voraussetzung, dass das Sprachkennzeichen des Browsers zuverlässig mit dem Land des Benutzers übereinstimmt. Ich habe zum Beispiel meine Browsersprache auf Deutsch eingestellt, obwohl ich im Moment nicht in der Nähe von Deutschland wohne, sondern eher in den Vereinigten Staaten.

Beispielsweise müssen Sie in Chrome für viele Sprachpakete keine Regionsmodifizierer angeben. Festlegen der Anzeigesprache von Chrome auf Deutsch

 enter image description here

bietet das folgende Sprachkennzeichen:

> navigator.language
< "de"

Überhaupt kein Regions-Tag und eine ziemlich gemeinsame Sprache.

Das Fazit ist, mein Browser-Setup führt zu einem Sprach-Tag de, obwohl ich in den Vereinigten Staaten lebe.


Ein genauerer und möglicherweise zuverlässiger Weg, um den Standort des Benutzers zu bestimmen, wäre es, ihn von der mit der Anfrage verbundenen IP-Adresse abzuleiten. Es gibt zahlreiche Dienste, die diesen Dienst anbieten. ip-api.com ist einer von ihnen:

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

5
Timo

Seien Sie vorsichtig, dass Sie navigator.language und navigator.languages haben.

langage:

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

sprachen:

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

Länder finden Sie unter Wikipedia auf ISO 3166-1 oder verwenden Sie Javascript lib:

1
A-312

In Firefox können Sie Ihre Spracheinstellungen in den Voreinstellungen auswählen:

 enter image description here

Die Liste der Sprachen umfasst 269 Elemente, von denen 192 keinen Regionscode enthalten.

Die Region ist nur nützlich, wenn eine Sprache je nach Standort unterschiedliche Varianten aufweist. Auf diese Weise können Benutzer dem Server mitteilen, in welcher Sprachvariante sie die Antwort bevorzugen.

Verwenden Sie diese Methode nicht, um den Benutzer zu lokalisieren. Dies ist zu unzuverlässig, weil der Benutzer keine Region angeben kann oder der Benutzer sich physisch an einem anderen Ort befinden kann.

Wenn Sie den Benutzer suchen möchten, sollten Sie die Geolocation API verwenden.

1
Oriol

Der Wert, den Sie erhalten, stammt aus dem Accept-Language-Header der HTTP-Anforderung.

Die Werte der Kopfzeile können sehr komplex sein 

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

Wie der Name schon sagt, definiert der Accept-Language-Header grundsätzlich akzeptable Sprachen, nicht Länder.

Ein Sprach-Tag kann auch zusätzliche Standortinformationen enthalten, wie in 'en-GB', andere wie 'en' jedoch nicht.

Falls nicht, gibt es einfach keine Informationen über das Land.

Es ist auch nicht immer möglich, eine Sprache wie "en" einem Land genau zuzuordnen. Wenn die Sprache "en" ist, ist das Land möglicherweise "GB", aber es kann auch "US" sein.

Was du tun kannst ;

  • Bestimmen Sie das Land nur, wenn die Sprache eines enthält, wie in 'en-GB'.
  • Wenn die Sprache kein Land enthält, haben Sie folgende Möglichkeiten:
  • Einige Sprachen werden nur in einem Land verwendet, z. B. "da", Dänisch, das nur in Dänemark gesprochen wird (ich schätze hier), daher können Sie diese Fälle zuordnen.
  • Sie können einen Standard für andere Fälle verwenden, je nach Sprache, z. map 'en' auf 'GB'
  • Sie können einen allgemeinen Standardwert wie "US" für alle Fälle verwenden, für die kein Land festgelegt werden kann.
  • Sie können zusätzliche Informationen verwenden, z. die IP-Adresse des Clients, um das Land zu bestimmen
  • Schließlich können Sie den Benutzer auffordern, das Land einzugeben

Ich habe einige zusätzliche Informationen zum Accept-Language-Header gesammelt hier

Genau wie @TimoSta sagte:

Versuche dies 

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

von Holen Sie sich Sprache und Ländercode des Besuchers mit Javascript (Client-Seite) . Siehe Antwort von @noducks

0
HongZhen Liu