Как интернационализация работает в JavaScript?

143

Мне интересно, как бороться с интернационализацией в JavaScript. Я погуглил, но не получаю убедительных ответов на:

  • Есть ли в JavaScript встроенная поддержка интернационализации?
  • Что такое i18n в JavaScript?
  • Как работать с календарями, валютами, датами и т. Д.?

Я уже читал Интернационализация в JavaScript .

rajakvk
источник
Microsoft недавно выпустила плагин глобализации jquery. Подробности здесь
Адел

Ответы:

161

Поддержка локализации в старых браузерах оставляет желать лучшего. Первоначально это происходило из-за фраз в ECMAScriptспецификации языка, которые выглядят так:

Number.prototype.toLocaleString () Создает
строковое значение, представляющее значение Number, отформатированное в соответствии с соглашениями текущей локали среды хоста. Эта функция зависит от реализации, и для нее допустимо, но не рекомендуется, возвращать то же самое, что и toString .

Каждый метод локализации, определенный в спецификации, определяется как «зависящий от реализации», что приводит к множеству несоответствий. В этом случае Chrome Opera и Safari возвращают то же самое, что и .toString(). Firefox и IE будут возвращать строки в формате локали, а IE даже включает разделитель тысяч (идеально подходит для строк валюты). Chrome был недавно обновлен, чтобы возвращать разделенную тысячами строку, но без фиксированного десятичного числа.

Для современных условий , то API спецификация ECMAScript Интернационализации , новый стандарт , который дополняет ECMAScript язык спецификация, обеспечивает гораздо лучшую поддержку для сравнения строк, форматирование чисел, а также дата и время форматирования; он также исправляет соответствующие функции в спецификации языка. Введение можно найти здесь . Реализации доступны в:

  • Chrome 24
  • Firefox 29
  • Internet Explorer 11
  • Опера 15

Также есть реализация совместимости, Intl.js , которая предоставит API в средах, где его еще нет.

Определение предпочтительного языка пользователя остается проблемой, так как нет спецификации для получения текущего языка. Каждый браузер реализует метод для получения языковой строки, но он может основываться на языке операционной системы пользователя или только на языке браузера:

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

Хороший способ для этого - сбросить заголовок Accept-Language с сервера на клиент. Если он отформатирован как JavaScript, его можно передать конструкторам API Интернационализации, которые автоматически выберут лучший (или первый поддерживаемый) языковой стандарт.

Короче говоря, вы должны выполнить большую часть работы самостоятельно или использовать фреймворк / библиотеку , потому что вы не можете полагаться на браузер, который сделает это за вас.

Различные библиотеки и плагины для локализации:

  • Другие:

Не стесняйтесь добавлять / редактировать.

Andy E
источник
13
Спасибо всем людям, помогающим; Я никогда бы не подумал, что смогу чему-то научиться, прочитав мои старые ответы. Я рад видеть там обновление спецификации API Интернационализации, это действительно потрясающе, и я только что протестировал его в Chrome.
Энди Э,
1
Спасибо за отличный сборник. Положительным моментом является то, что похоже, что Mozilla вскоре может поставить современный toLocaleString () - возможно, FF28: bugzilla.mozilla.org/show_bug.cgi?id=769871
Крис Адамс
1
i18next.com теперь поставляется с системой управления переводами, созданной на основе locize.com - это может быть большой победой, если вам нужно решить весь процесс перевода, а не просто инструмент для написания кода для i18n. Плюс есть хорошая функция Incontext Editor ...
jamuhl
12

Mozilla недавно выпустила потрясающий L20n или локализацию 2.0. По их собственным словам L20n это

открытый исходный код, специфичный для локализации язык сценариев, используемый для обработки пола, множественного числа, спряжений и большинства других необычных элементов естественного языка.

Их реализация js находится в репозитории github L20n.

ashwoods
источник
Я начал проект, который нуждается в локализации, и мы решили использовать L20n;). Поэтому я написал первую версию плагина L20n для RequireJS ( github.com/fernandogmar/L20n-RequireJS ) на случай, если вы используете RequireJS, надеюсь, он будет вам полезен. Любое предложение будет приветствоваться.
Фернандо Гм
0

Некоторые из них являются родными, остальные доступны через библиотеки.

Например, Datejs - хорошая международная библиотека дат.

В остальном, речь идет только о переводе языка, а JavaScript изначально совместим с Юникодом (как и все основные браузеры).

Лука Маттеис
источник
0

Вы также можете попробовать другую библиотеку - https://github.com/wikimedia/jquery.i18n .

В дополнение к замене параметров и множественным множественным формам, он поддерживает пол - довольно уникальную особенность пользовательских правил грамматики, которая нужна некоторым языкам.

Амир Э. Ахарони
источник