В чем разница между интернационализацией (i18n) и локализацией (l10n)?

Ответ

Интернационализация (i18n) — это проектирование и разработка приложения, позволяющее легко адаптировать его для разных языков и регионов без изменений в коде.

Локализация (l10n) — это процесс адаптации уже интернационализированного приложения под конкретный язык, регион или культуру (переводы, форматы дат, валют).

i18n — подготовка, l10n — реализация.

Пример i18n в коде (подготовка):

// Плохо: хардкод строк
console.log("Welcome");

// Хорошо: использование ключей
console.log(i18n.t('welcome.message'));

Пример файлов локализации (l10n): en.json:

{
  "welcome.message": "Welcome"
}

ru.json:

{
  "welcome.message": "Добро пожаловать"
}

Практические аспекты i18n:

  • Вынос всех строк в ресурсные файлы.
  • Поддержка Юникода (UTF-8).
  • Учет разной длины текста при верстке.
  • Абстрагирование форматов дат, чисел, валют.

Практические аспекты l10n:

  • Перевод текстов и интерфейса.
  • Адаптация графики и цветов.
  • Настройка региональных форматов (например, дата DD.MM.YYYY vs MM/DD/YYYY).

Ответ 18+ 🔞

Давай разберемся с этой парой терминов, а то они как близнецы-братья, которых постоянно путают, пока один из них не даст тебе по ебалу.

Вот смотри, представь, что ты строишь дом. Интернационализация (i18n) — это когда ты с самого начала делаешь фундамент и стены такими, чтобы к ним можно было потом легко прикрутить хоть немецкие, хоть японские, хоть, блядь, марсианские розетки и двери. Ты не знаешь, кто будет жить, но ты готов к любому. Это подготовка, проектирование.

А Локализация (l10n) — это когда приехали конкретные жильцы, немцы, и ты им начинаешь вкручивать евро-розетки, вешать табличку «Achtung!» на подвал и ставить унитаз с полочкой. Это уже реализация под конкретных ребят.

Короче: i18n — «я сделал так, чтобы можно было», l10n — «я сделал для немцев».

Теперь смотри, как это выглядит в коде, если делать по-человечески, а не как олух царя небесного.

Допустим, ты пишешь код и тебе надо вывести приветствие. Первый порыв — написать прямо в коде:

// Плохо, блядь! Прям как в лоб.
console.log("Добро пожаловать");

А потом приходит заказчик и говорит: «А сделай-ка нам ещё на испанский, друг мой». И ты начинаешь везде искать эти строки, копипастить, хуячить условия if (lang === 'es')... Пиздец, а не поддержка. Это путь в ад.

Вот как надо, с прицелом на будущее (это и есть i18n):

// Хорошо! Используем ключ, а не жесткую строку.
console.log(i18n.t('welcome.message'));

Видишь? Мы не пишем текст напрямую. Мы говорим системе: «Дай-ка мне перевод для ключа welcome.message». А сама система уже лезет в нужную папку с переводами.

А где эти переводы? А вот они, локализация (l10n) в чистом виде. Просто файлики:

en.json (для англичан):

{
  "welcome.message": "Welcome"
}

ru.json (для наших):

{
  "welcome.message": "Добро пожаловать"
}

es.json (для тех, кто говорит «о́ле»):

{
  "welcome.message": "Bienvenido"
}

Красота, да? Хочешь добавить язык — просто новый файлик создал. Код вообще не трогаешь. Это и есть магия правильной подготовки.

На что ещё смотреть, чтобы не облажаться (практические аспекты i18n):

  • Все строки — вон! Выноси в ресурсы абсолютно всё, что может быть прочитано человеком. Даже ту мелочь, типа «ОК» или «Сохранить». Потом охуеешь искать.
  • Кодировка — UTF-8. Без вариантов. Чтобы твои «Приветы» не превращались в кракозябры «РџСЂРёРІРµС‚».
  • Место — мать денег. Немецкое слово может быть в три раза длиннее русского. Верстка должна это выдерживать, а не разъезжаться, как дерьмо по волнам.
  • Даты, числа, валюта. Абстрагируй их форматы сразу. Потому что американец увидит 05/07/2023 и подумает, что это 5 июля, а европеец — что это 7 мая. Ёперный театр!

А что делаем при локализации (l10n):

  • Переводим, сука, всё. Тексты, кнопки, ошибки, тултипы. Всё.
  • Картинки и цвета. Свинья — символ удачи в Германии и чуть ли не оскорбление в мусульманских странах. Красный — опасность у нас и праздник в Китае. Думай головой.
  • Форматы подгоняем. Точка или запятая в дробях? Первый день недели — понедельник или воскресенье? Валюта до суммы или после? Всё это настраивается.

Вот и вся философия. Сначала закладываешь возможность (i18n), потом наполняешь её конкретикой (l10n). Делаешь так — и жить спокойно, а не бегать потом с криками «бляяядь, опять всё переписывать!».