Code review переводов

Роль проверки кода в системе интернационализации

Интернационализация на базе i18next в JavaScript-проектах опирается на согласованность переводов, предсказуемую структуру ключей и строгую синхронизацию между языковыми файлами. Ошибки в переводах редко проявляются как синтаксические сбои — чаще они выражаются в виде «тихих дефектов»: отсутствующих строк, некорректной подстановки переменных, разъехавшихся ключей или неконсистентного UX между локалями.

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


Структура переводов в i18next

Базовая модель хранения переводов в i18next представляет собой JSON-структуру, где ключи организованы иерархически:

{
  "auth": {
    "login": {
      "title": "Вход",
      "submit": "Войти"
    }
  }
}

Такая организация формирует несколько критических требований:

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

Любое отклонение между языковыми файлами приводит к fallback-логике, что в реальных интерфейсах воспринимается как «прыгающий» язык.


Ключевые принципы проверки переводов

В процессе ревью переводов анализируется не художественная точность текста, а соответствие контракту данных:

  • наличие всех ключей во всех локалях
  • идентичность структуры JSON
  • корректность плейсхолдеров интерполяции
  • соблюдение правил pluralization
  • отсутствие лишних или устаревших ключей
  • единообразие нейминга

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


Нейминг ключей и их предсказуемость

Ключи в i18next рассматриваются как API. Их именование напрямую влияет на поддерживаемость системы.

Распространённые стратегии:

  • feature.section.element (например, checkout.payment.title)
  • domain.action.state (например, auth.login.error.invalid)
  • группировка по namespace (например, common, auth, profile)

Критичные дефекты, выявляемые в ревью:

  • семантически разнородные ключи в одном namespace
  • избыточная вложенность без логической структуры
  • дублирование ключей с разным смыслом
  • использование текстовых значений в качестве ключей

Стабильность нейминга важнее краткости, поскольку ключи становятся частью кода.


Namespaces и границы контекста

i18next активно использует namespaces для разделения доменных областей:

i18n.t('auth:login.title')

Во время code review анализируется:

  • соответствие namespace функциональной области
  • отсутствие пересечений между модулями
  • изоляция общих строк в common
  • отсутствие «разрастания» одного namespace до монолита

Нарушение границ приводит к снижению переиспользуемости и усложнению поддержки переводов.


Контекст и неоднозначность строк

Перевод без контекста часто приводит к ошибкам. Один и тот же текст может иметь разные значения в зависимости от сценария:

  • «Open» как глагол
  • «Open» как статус
  • «Open» как действие UI

i18next поддерживает контекст через:

{
  "file": {
    "open": "Открыть",
    "open_context_menu": "Открыть меню"
  }
}

При ревью анализируется:

  • наличие неоднозначных ключей
  • использование контекстных суффиксов
  • отсутствие универсальных переводов для разных смыслов
  • дублирование строк с разной семантикой

Плюрализация и числовые формы

Одним из наиболее сложных аспектов является pluralization. i18next поддерживает множественные формы:

{
  "cart": {
    "item_one": "{{count}} товар",
    "item_few": "{{count}} товара",
    "item_many": "{{count}} товаров"
  }
}

Проверка в code review включает:

  • соответствие правилам локали (особенно для славянских языков)
  • наличие всех необходимых форм
  • отсутствие ручной логики склонений в коде
  • корректное использование count

Типовые ошибки:

  • использование одной формы для всех чисел
  • отсутствие zero формы при необходимости
  • смешивание логики склонений и перевода

Интерполяция и безопасность данных

i18next поддерживает интерполяцию значений:

t('welcome', { name: 'Alex' })
{
  "welcome": "Добро пожаловать, {{name}}"
}

При ревью анализируются следующие аспекты:

  • соответствие имён параметров между кодом и переводом
  • отсутствие неиспользуемых плейсхолдеров
  • защита от HTML-инъекций при dangerouslySetInnerHTML
  • единообразие синтаксиса ({{var}}, {{- var}})

Особое внимание уделяется случаям, где интерполяция смешивается с HTML:

{
  "message": "<strong>{{name}}</strong> вошёл в систему"
}

Такие конструкции требуют строгого контроля, поскольку влияют на XSS-поверхность.


Fallback-логика и отсутствующие ключи

i18next использует fallbackLng для подстановки значений при отсутствии перевода.

На уровне code review проверяется:

  • отсутствие неиспользуемых fallback-цепочек
  • контроль «проваливания» в язык по умолчанию
  • выявление ключей, отсутствующих в части локалей
  • отсутствие silent failures (когда UI отображает ключ вместо текста)

Типичная проблема:

t('profile.settings.privacy') // ключ отсутствует в ru

В результате интерфейс отображает технический идентификатор вместо текста.


Согласованность переводов между языками

Сравнение локалей является обязательной частью ревью. Проверяется:

  • идентичность структуры JSON
  • отсутствие дополнительных ключей в одной локали
  • синхронность добавления новых строк
  • единообразие терминологии

Особое внимание уделяется случаям, когда перевод выполнен частично:

// en
{ "save": "Save" }

// ru
{ "save": "Сохранить", "save_and_exit": "Сохранить и выйти" }

Несимметричная структура усложняет поддержку и увеличивает риск ошибок.


Инструменты автоматической проверки

Ручной code review дополняется инструментами статического анализа.

Распространённые решения:

  • i18next-scanner — извлечение ключей из кода
  • i18next-parser — генерация и синхронизация JSON
  • eslint-plugin-i18next — проверка использования t()
  • локальные скрипты diff между языковыми файлами

В рамках ревью анализируется:

  • наличие автоматической генерации ключей
  • корректность конфигурации extraction tools
  • отсутствие «мертвых» переводов

CI-проверки переводов

В зрелых проектах проверка локалей переносится в CI:

  • валидация JSON-схемы переводов
  • сравнение ключей между языками
  • проверка отсутствующих интерполяций
  • обнаружение неиспользуемых ключей
  • тестирование fallback-логики

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


Типизация переводов в TypeScript

TypeScript позволяет повысить надёжность работы с i18next:

interface Resources {
  auth: {
    login: {
      title: string;
    }
  }
}

При ревью анализируется:

  • наличие типизированных ресурсов
  • использование автогенерируемых типов ключей
  • отсутствие any в контексте переводов
  • соответствие типов фактической структуре JSON

Типизация уменьшает вероятность обращения к несуществующим ключам на этапе выполнения.


Типовые дефекты, выявляемые при ревью

На практике повторяются одни и те же категории проблем:

  • несинхронизированные ключи между локалями
  • неправильное использование интерполяции
  • отсутствие pluralization
  • дублирование смысловых ключей
  • нарушение структуры namespaces
  • смешивание UI-логики и текстов
  • неочищенные устаревшие строки

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


Структурные критерии качества переводов

Оценка качества переводов в i18next базируется на нескольких измерениях:

  • структурная целостность — идентичность JSON между языками
  • семантическая устойчивость — отсутствие неоднозначных ключей
  • контрактная совместимость — совпадение с использованием в коде
  • масштабируемость — возможность расширения без рефакторинга
  • детерминированность UI — отсутствие случайных fallback-значений