Jak działa internacjonalizacja w JavaScript?


143

Zastanawiam się, jak poradzić sobie z internacjonalizacją w JavaScript. Wyszukałem w Google, ale nie otrzymuję przekonujących odpowiedzi na:

  • Czy JavaScript ma natywną obsługę internacjonalizacji?
  • Czym jest i18n w JavaScript?
  • Jak radzić sobie z kalendarzami, walutami, datami itp.?

Przeczytałem już o internacjonalizacji w JavaScript .


Firma Microsoft niedawno wydała wtyczkę do globalizacji jquery. Szczegóły są tutaj
Adeel

Odpowiedzi:


161

Obsługa lokalizacji w starszych przeglądarkach jest słaba. Pierwotnie było to spowodowane wyrażeniami w ECMAScriptspecyfikacji języka, które wyglądały następująco:

Number.prototype.toLocaleString ()
Tworzy ciąg znaków, który reprezentuje wartość Number sformatowaną zgodnie z konwencjami bieżących ustawień regionalnych środowiska hosta. Ta funkcja jest zależna od implementacji i jest dozwolona, ​​ale nie zalecana, aby zwracała to samo, co toString .

Każda metoda lokalizacji zdefiniowana w specyfikacji jest definiowana jako „zależna od implementacji”, co skutkuje wieloma niespójnościami. W tym przypadku Chrome Opera i Safari zwróciłyby to samo, co .toString(). Firefox i IE zwrócą ciągi sformatowane dla ustawień regionalnych, a IE zawiera nawet separator tysięcy (idealny dla ciągów walutowych). Przeglądarka Chrome została niedawno zaktualizowana, aby zwracać ciąg znaków oddzielonych tysiącami, ale bez stałego miejsca po przecinku.

W nowoczesnych środowiskach specyfikacja ECMAScript Internationalization API , nowy standard uzupełniający specyfikację języka ECMAScript, zapewnia znacznie lepszą obsługę porównywania ciągów, formatowania liczb oraz formatowania daty i godziny; naprawia również odpowiednie funkcje w specyfikacji języka. Wprowadzenie można znaleźć tutaj . Wdrożenia są dostępne w:

  • Chrome 24
  • Firefox 29
  • Internet Explorer 11
  • Opera 15

Istnieje również implementacja zgodności, Intl.js , która zapewni API w środowiskach, w których jeszcze nie istnieje.

Określenie preferowanego języka użytkownika pozostaje problemem, ponieważ nie ma specyfikacji umożliwiającej uzyskanie bieżącego języka. Każda przeglądarka implementuje metodę uzyskiwania ciągu językowego, ale może to być oparte na języku systemu operacyjnego użytkownika lub po prostu na języku przeglądarki:

// navigator.userLanguage for IE, navigator.language for others
var lang = navigator.language || navigator.userLanguage;

Dobrym rozwiązaniem tego problemu jest zrzucenie nagłówka Accept-Language z serwera do klienta. Jeśli jest sformatowany jako JavaScript, można go przekazać do konstruktorów interfejsu API internacjonalizacji, które automatycznie wybiorą najlepsze (lub pierwsze obsługiwane) ustawienie regionalne.

Krótko mówiąc, musisz włożyć dużo pracy samodzielnie lub skorzystać z frameworka / biblioteki , ponieważ nie możesz polegać na przeglądarce, aby zrobiła to za Ciebie.

Różne biblioteki i wtyczki do lokalizacji:

  • Inne:

Zapraszam do dodawania / edytowania.


13
Dziękuję wszystkim współpracującym osobom; Nigdy bym nie pomyślał, że mogę się czegoś nauczyć czytając moje stare odpowiedzi. Cieszę się, że widzę tam aktualizację specyfikacji API internacjonalizacji, to naprawdę niesamowite i właśnie przetestowałem ją w Chrome.
Andy E

1
Dzięki za doskonałą kompilację. Na szczęście wygląda na to, że Mozilla może wkrótce dostarczyć nowoczesną metodę toLocaleString () - prawdopodobnie FF28: bugzilla.mozilla.org/show_bug.cgi?id=769871
Chris Adams

1
i18next.com jest teraz dostarczany z zarządzaniem tłumaczeniami opartym na top locize.com - może to być duża wygrana, jeśli musisz rozwiązać cały proces tłumaczenia - a nie tylko instrumentować swój kod dla i18n. Plus ma fajną funkcję edytora Incontext ...
jamuhl

12

Niedawno Mozilla wydała niesamowity L20n lub lokalizację 2.0. Ich własnymi słowami jest L20n

język skryptowy typu open source, specyficzny dla lokalizacji, używany do przetwarzania płci, liczby mnogiej, koniugacji i większości innych dziwacznych elementów języka naturalnego.

Ich implementacja js znajduje się w repozytorium github L20n.


Rozpocząłem projekt, który wymaga lokalizacji i zdecydowaliśmy się również na L20n;). Więc napisałem pierwszą wersję wtyczki L20n do RequireJS ( github.com/fernandogmar/L20n-RequireJS ) na wypadek, gdybyś używał RequireJS. Mam nadzieję, że będzie przydatna również dla Ciebie. Wszelkie sugestie będą mile widziane.
Fernando Gm

0

Część z nich jest natywna, reszta jest dostępna w bibliotekach.

Na przykład Datejs to dobra międzynarodowa biblioteka dat.

Reszta dotyczy tylko tłumaczenia języka, a JavaScript jest natywnie kompatybilny z Unicode (a także ze wszystkimi głównymi przeglądarkami).


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.