Европейские языки в контексте интернационализации данных демонстрируют значительное разнообразие правил отображения текста, чисел, дат и правил грамматики, что напрямую влияет на работу Intl API в JavaScript. Даже внутри одного региона наблюдаются различия в форматировании, сравнении строк и языковых конструкциях, требующих учета при построении локализованных интерфейсов.
Intl API опирается на BCP 47 языковые теги, которые позволяют точно описывать региональные варианты языков. Для европейского контекста особенно важны сочетания языка и региона:
new Intl.NumberFormat("de-DE")
new Intl.DateTimeFormat("fr-FR")
new Intl.Collator("sv-SE")
Комбинации вида de-AT, fr-CH,
en-GB, es-ES отражают не только язык, но и
региональные нормы форматирования. Например, немецкий язык в Германии и
Австрии отличается финансовыми и орфографическими нюансами, что влияет
на числовые разделители и отображение валют.
Одной из ключевых особенностей европейских языков является различие в
десятичном и тысячном разделителях. В рамках Intl API это поведение
инкапсулируется в Intl.NumberFormat.
new Intl.NumberFormat("en-GB").format(1234567.89)
// 1,234,567.89
new Intl.NumberFormat("de-DE").format(1234567.89)
// 1.234.567,89
В английской традиции используется точка как десятичный разделитель и запятая для группировки тысяч. В немецкой и ряде других континентальных европейских языков — наоборот. Это различие критично для финансовых приложений, аналитических панелей и пользовательских интерфейсов.
Дополнительная сложность возникает в форматировании валют:
new Intl.NumberFormat("fr-FR", {
style: "currency",
currency: "EUR"
}).format(1999.5)
// 1 999,50 €
Французская локаль использует неразрывный пробел как разделитель групп, запятую для дробной части и размещает символ валюты после числа.
Европейские языки демонстрируют значительную вариативность в
представлении дат. Intl API учитывает региональные стандарты через
Intl.DateTimeFormat.
new Intl.DateTimeFormat("en-GB").format(new Date("2026-05-27"))
// 27/05/2026
new Intl.DateTimeFormat("de-DE").format(new Date("2026-05-27"))
// 27.5.2026
new Intl.DateTimeFormat("fr-FR").format(new Date("2026-05-27"))
// 27/05/2026
Различия касаются не только разделителей, но и порядка компонентов: день-месяц-год или месяц-день-год. В европейском пространстве доминирует формат DMY, в отличие от американского MDY.
Форматирование времени также различается:
new Intl.DateTimeFormat("en-GB", { hour: "2-digit", minute: "2-digit" }).format(new Date())
// 14:35
new Intl.DateTimeFormat("en-US", { hour: "2-digit", minute: "2-digit" }).format(new Date())
// 2:35 PM
Большинство европейских языков используют 24-часовой формат как стандарт.
Сортировка строк в европейских языках значительно сложнее простой
побайтной или Unicode-сортировки. Диакритические знаки, лигатуры и
специфические алфавитные правила требуют использования
Intl.Collator.
const collator = new Intl.Collator("de-DE");
["ä", "a", "z"].sort(collator.compare)
// ["a", "ä", "z"]
В немецком языке буква “ä” может рассматриваться как модификация “a”, что влияет на её позицию в сортировке. Однако в других языках поведение отличается:
new Intl.Collator("sv-SE").compare("ä", "z")
// "ä" идет после "z"
Шведский язык включает дополнительные буквы в конце алфавита, что меняет порядок сортировки.
Расширенные параметры позволяют учитывать чувствительность к регистру и диакритике:
new Intl.Collator("fr-FR", {
sensitivity: "base"
}).compare("e", "é")
// 0 (считаются равными)
Европейские языки широко используют диакритические знаки: акценты, умляуты, седильи и другие модификаторы. В Unicode они могут быть представлены в виде составных или разложенных форм, что влияет на сравнение строк.
"é" === "e\u0301" // false
Intl Collator абстрагирует эти различия, обеспечивая корректное языковое сравнение без ручной нормализации.
Хотя Intl API не реализует полноценную грамматику, он предоставляет
Intl.PluralRules, критически важный для европейских языков
с развитой системой множественного числа.
new Intl.PluralRules("fr-FR").select(1)
// "one"
new Intl.PluralRules("fr-FR").select(2)
// "other"
В английском языке различие минимально, но в других европейских языках система сложнее:
new Intl.PluralRules("ru-RU").select(5)
// "many"
Славянские языки, включая русский, польский и чешский, используют несколько форм множественного числа, что влияет на текстовые шаблоны интерфейсов.
Применение:
const rules = new Intl.PluralRules("pl-PL");
const forms = {
one: "plik",
few: "pliki",
many: "plików",
other: "pliki"
};
forms[rules.select(3)]
Европейские страны используют различные правила отображения валют, включая положение символа, пробелы и формат дробной части.
new Intl.NumberFormat("de-CH", {
style: "currency",
currency: "CHF"
}).format(1234.5)
// CHF 1’234.50
Швейцарский формат включает апостроф как разделитель тысяч, что характерно для региона.
В некоторых языках символ валюты может быть отделен неразрывным пробелом или размещаться после числа:
new Intl.NumberFormat("es-ES", {
style: "currency",
currency: "EUR"
}).format(1234.5)
// 1.234,50 €
Intl API поддерживает форматирование единиц измерения через
Intl.NumberFormat с опцией unitStyle:
new Intl.NumberFormat("en-GB", {
style: "unit",
unit: "kilometer-per-hour"
}).format(120)
// 120 km/h
В европейских языках часто используется метрическая система, что отражается в единицах по умолчанию: километры, литры, килограммы.
В европейских языках важную роль играют типографические пробелы. Французский язык, например, использует неразрывные пробелы перед двоеточием и точкой с запятой. Intl API частично учитывает эти нормы в форматировании чисел и валют.
new Intl.NumberFormat("fr-FR").format(1000000)
// 1 000 000
Эти пробелы не являются обычными символами ASCII, что важно учитывать при обработке строк.
Большинство европейских языков используют расширенную латиницу, включающую диакритические символы и дополнительные буквы. Это влияет на:
Например, испанский язык традиционно рассматривает “ñ” как отдельную букву алфавита:
new Intl.Collator("es-ES").compare("n", "ñ")
// "n" идет перед "ñ"
В европейских языках регистр букв влияет не только на визуальное
представление, но и на семантическое сравнение.
Intl.Collator позволяет управлять этим поведением:
new Intl.Collator("en-GB", {
sensitivity: "case"
})
Различные режимы чувствительности:
Некоторые европейские языки используют специфические обозначения времени. Например, в немецком языке допускается формат “13 Uhr 45”, где “Uhr” является обязательным компонентом.
new Intl.DateTimeFormat("de-DE", {
hour: "numeric",
minute: "numeric"
}).format(new Date())
// 13:45
Фактическое отображение может варьироваться в зависимости от реализации, но Intl API обеспечивает согласованность базовой структуры.
При комбинировании нескольких Intl API возникают более сложные сценарии. Например, форматирование чисел с учетом валюты и последующей сортировки отображаемых значений:
const nf = new Intl.NumberFormat("fr-FR", {
style: "currency",
currency: "EUR"
});
const collator = new Intl.Collator("fr-FR");
const data = ["10", "2", "100"];
data.sort(collator.compare);
Хотя пример кажется числовым, сортировка выполняется как строковая, что демонстрирует важность выбора правильного инструмента.
Европейские языковые особенности формируют основу требований к локализации в JavaScript, определяя поведение форматирования, сравнения и отображения данных через Intl API.