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?
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'
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
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>
Seien Sie vorsichtig, dass Sie navigator.language
und navigator.languages
haben.
console.log(navigator.language); // "fr"
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:
In Firefox können Sie Ihre Spracheinstellungen in den Voreinstellungen auswählen:
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.
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 ;
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