Особенности европейских языков

Европейские языки в контексте интернационализации данных демонстрируют значительное разнообразие правил отображения текста, чисел, дат и правил грамматики, что напрямую влияет на работу 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"
})

Различные режимы чувствительности:

  • base — игнорирует диакритику и регистр
  • accent — учитывает диакритику
  • case — учитывает регистр
  • variant — учитывает все различия

Локальные особенности временных форматов

Некоторые европейские языки используют специфические обозначения времени. Например, в немецком языке допускается формат “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.