Вы добавили в настройки интерфейса строчку ru‑RU и решили, что локализация завершена, пользователи довольны. Поздравляем: вы официально вступили в ряды тех, кто ещё не видел, как выглядит языковой тег «во всей своей красе».
Когда пользователь открывает страницу в браузере, тот отправляет на сервер данные о языковых предпочтениях посетителя, и это далеко не всегда что‑то простое. Здесь мы рассмотрим, как именно указывается конкретный язык. Стандарт, в соответствии которым это происходит (RFC 5646), — ворота в языковой мультивселенную, где sl‑rozaj‑biske-1994 звучит как заклинание, а x‑private‑foo может означать что угодно — от диалекта вашей бабушки до внутреннего сленга команды маркетологов.

Для тех, кто пропустил IETF RFC 5646
Для указания языка Инженерная группа Интернета (IETF) еще в 2009 году взамен старого стандарта предложила RFC 5646. Сегодня именно он определяет структуру и использование языковых тегов, которые применяются в приложениях, работающих с текстом — в том числе, в веб‑браузерах.
В простейшем случае можно указать просто ru… или несколько букв: две‑три буквы языка + две буквы страны, например ru‑RU (русский, Россия) или en‑US (английский, США):
ru — это так называемый основной субтег. Обязательный компонент записи — своего рода код языка, соответствующий ISO 639–1 или ISO 639-3;
RU — расширенный субтег — двух или трехбуквенный код с помощью которого указывается регион или страна, использующая язык — в соответствии с ISO 3166–1 Alpha-2 или Alpha-3 он может быть также численным.
Казалось бы, мы покрыли все варианты? Смотрите, как удобно: en‑GB — английский язык, используемый в Великобритании, а en‑US — в США; fr‑CA — французский в Канаде. Есть даже клингонский (tlh) и французский язык жестов (fsl). У себя на проекте мы сталкивались с языком индейцев чероки (chr‑US), швейцарским алеманнским вариантом немецкого языка (gsw‑CH) и языком йоруба (yo) из Западной Африки — Нигерии, Бенина и Того.
Но внутри спецификации не все так просто. Располагайтесь поудобнее, вы просто еще не представляете масштабов буйства человеческой лингвистической фантазии!
Как указать систему письма
Увы, но не только страна определяет систему письма. Сербский бывает на кириллице, а бывает на латинице — и все в одной и той же стране. Так что для указания системы письма предусмотрен субтег скрипта. С его помощью можно разделить:
sr‑Latn — вариант на латинице;
sr‑Cyrl — вариант на кириллице.
Так у нас на проекте проявился узбекский на кириллице — uz‑Cyrl.
Субтег скрипта покрывает и китайский «зоопарк»:
zh‑Hant — китайский традиционный,
zh‑Hans — китайский упрощенный.
Все возможные субтеги систем письма указаны в ISO 15924. Сейчас их там около 350 шт. Если покопаться в стандарте, там можно найти:
Teng (Tengwar) и Cirt (керитское письмо) — вымышленная письменность, созданная Дж. Р. Р. Толкином для его вселенной «Властелин Колец»;
Linear B (Linb) — линейное письмо Б, использовавшееся для записи микенского греческого языка в бронзовом веке.
Все это стандартизовано для использования в интернете в конце нулевых. Живите теперь с этими знаниями.
И не пальните себе в ногу…
Субтег скрипта указывается до региона. Причем, указывая субтег скрипта, регион могут опускать… Теги — регистронезависимы, но не запутаться помогает использование прописных и строчных букв. Более‑менее принято, что в субтеге скрипта прописная буква только первая (при этом сам субтег состоит из 4 символов), а регион указывается полностью прописными.
Система письма - это не диалект
Сразу после субтега основного языка может быть указан еще и диалект, и с точки зрения стандарта это вовсе не то же самое, что система письма. Например, zh‑yue — Кантонский диалект китайского языка (правда, именно это сочетание помечено в стандарте как redundant), sl‑rozaj — диалект словенского, sl‑rozaj‑biske — а это диалект этого диалекта.
А еще есть своего рода «синтаксический сахар». Для некоторых пар язык‑диалект есть возможность просто указать тег языка. В примере выше это будет yue.
Дальше в экзотику
Разного взгляда на диалект и письменность разработчикам оказалось мало, поэтому в стандарте оставили возможность расширять теги языка.
Расширение состоит из двух частей:
буква‑ключ, которая определяет, что и как расширяется;
сами субтеги расширения.
Ключа на данный момент доступно два.
Любимец публики — u (Unicode locale), где можно прописать всё: «календарь — японский, цифры — арабские, сортировка — sweden‑phonebook» и прочие прихоти.
«Простой» пример: en‑Latn‑US‑u-ca‑islamic‑nu‑arabext читается как «Английский, латиница, США, но календари считай по исламскому летоисчислению, а цифры печатай арабскими «расширенными««. Одним тегом вы отдаёте распоряжение сразу куче библиотек: даты, числа, сортировка, часовые пояса — всё подтянется мгновенно. Но не дай Бог вам перепутать порядок!
Еще один ключ — t — относится к переведенному или транслитерованному контенту (описан в RFC 6497).
А теперь - бои без правил
А еще стандарт позволяет использовать частные субтеги, на которые не распространяются никакие правила — лишь бы они не конфликтовали с описанным выше. Перед ними в записи ставится «x». Одно но: сторонние приложения не обязаны это поддерживать. Они имеют право выкидывать все, что после x.
Вот несколько примеров:
pt‑BR‑x-jurema — специфический диалект португальского языка в Бразилии;
zh‑Hans‑CN‑x-newspapervariant — китайский язык с упрощённой системой иероглифов — с уточнением для газетного стиля;
упомянутый в начале sl‑rozaj‑biske-1994 — словенский, диалект резьянский, подвариант «биське», орфография из 1994 года. Да‑да, такое реально водится.
BCP 47
RFC 5646 является лишь одним из многих стандартов, которые объединены в сводном документе — BCP 47. Если есть желание, ныряйте глубже в эту кроличью нору: ссылка.
Вместо заключения
RFC 5646 — как инструкция к швейцарскому ножу: лишь малая часть функций нужна каждый день, но приятно знать, что где‑то глубоко внутри прячется пила по дереву, лазерный уровень и открывалка для устриц.
Все это изложено исключительно для вашего развлечения. Если вам достаточно ru и en, оставайтесь в их рамках, не пытайтесь выделять отдельно корейский на ханже (ko‑Hang). Помните только, что условный fr‑CA не гарантирует формат дат YYYY‑MM‑DD — чтобы добиться конкретной локали, дописывайте расширение u.
P. S. Мы публикуем наши статьи на нескольких площадках Рунета. Подписывайтесь на нашу страницу в VK или на Telegram‑канал, чтобы узнавать обо всех публикациях и других новостях компании Maxilect.
shaseer
это кирт (Кертас Даэрон)