Вшдр обстановка два нуля

Обстановка два нуля — разбираемся, что это значит, откуда взялось и почему все об этом говорят. Интригующие детали и свежие факты уже ждут вас!

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

В данной статье рассматривается техническая проблема, возникшая при настройке многоязычности в статическом генераторе сайтов Hugo. Тема «Вшдр обстановка два нуля» (условное обозначение кейса) отражает суть ошибки: некорректная обработка нулевой формы множественного числа в русском языке, при которой движок возвращает идентификатор переменной вместо перевода.

Контекст и окружение

Проблема была воспроизведена в среде разработки со следующими параметрами (конфиденциальные данные замаскированы):

  • Версия Hugo: v0.50-DEV/extended (linux/amd64)
  • Версия Go: go1.11 linux/amd64
  • Путь к бинарнику: /home//go/bin/hugo
  • Рабочая директория проекта: /raid//github.com//gists/

Конфигурация многоязычности (config.toml)

Проект был настроен на поддержку пяти языков с включенным параметром enableMissingTranslationPlaceholders = true, что заставляет Hugo сообщать о пропущенных переводах.

[languages]
 [languages.en]
 title = "EN"
 weight = 1
 [languages.ru]
 title = "RU"
 weight = 2
 [languages.ru-RU]
 title = "ru_RU"
 weight = 2.5
 [languages.ua]
 title = "UA"
 weight = 3
 [languages.fr]
 title = "FR"
 weight = 4

Структура файлов переводов (i18n)

В директории i18n находились YAML-файлы для каждого языка. Ключевым моментом является определение формы множественного числа для идентификатора variable_id.

Пример для английского (en.yaml), эталонный:

- id: variable_id
 translation:
 one: "one"
 other: "other"

Пример для русского (ru.yaml и ru_RU.yaml) — проблемный:

- id: variable_id
 translation:
 one: "один"
 other: "много"

Остальные языки (ua.yaml, fr.yaml):

Аналогичная структура с ключами one и other.

Суть проблемы: Отсутствие ключа «zero»

При запуске сервера разработки командой:

hugo serve --i18n-warnings --verbose

Сборка прошла успешно (Total in 12 ms), однако при обращении к русскоязычной версии сайта (ru или ru-RU) на месте перевода выводился идентификатор переменной: variable_id.

Ошибка: «Translation of the plural and zero in Russian returns the id of the variable variable_id».

Почему это происходит?

В русском языке система плюрализации (CLDR) требует четырех форм:

  1. one (1, 21, 31..;)
  2. few (2-4, 22-24…)
  3. many (5-20, 25-30…)
  4. zero (0, 0.0, 0.00…)

В предоставленных файлах перевода для русского языка были определены только one и other (который в Hugo мапится на many). Ключи few и zero отсутствовали.

Когда Hugo пытался отрендерить значение 0 для русского языка, он не находил подходящий ключ zero. Из-за включенной опции enableMissingTranslationPlaceholders (или особенностей фоллбэка в версии 0.50), вместо запасного варианта возвращался сам ID переменной.

Воспроизведение и доказательства

Автор вопроса предоставил тестовый стенд (URL замаскирован: https://hugo_plural_form_russian.surge.sh → https://.surge.sh) и исходный код для воспроизведения:

  • Gist: https://gist.github.com//
  • Архив: site.tar.gz

Логи сервера показывали стандартную инициализацию без критических ошибок парсинга конфига:

INFO 2018/10/30 23:35:22 Using config file: /raid//*/config.toml
Building sites …
...
| EN | RU | RU-RU | UA | FR |
|----|----|-------|----|----|
| 4 | 4 | 4 | 4 | 4 |
Total in 12 ms

Решение: Добавление недостающих форм

Для исправления ошибки необходимо расширить словарь русского языка (ru.yaml, ru_RU.yaml) всеми четырьмя формами, предусмотренными CLDR:

- id: variable_id
 translation:
 zero: "ноль" # Обязательно для 0
 one: "один" # 1, 21, 31...
 few: "два" # 2-4, 22-24;.. (Ключ few, а не two!)
 many: "много" # 5-20, 25-30...
 other: "много" # Фоллбэк (обычно дублирует many)

Важно: В Hugo (и Go) для русского языка ключ для формы «2-4» называется few, а не two или few в английском понимании. Ключ other служит запасным вариантом, но для нуля (0) ищется именно zero.

Рекомендации по отладке

  1. Всегда используйте флаг --i18n-warnings. Он покажет предупреждения о недостающих ключах перевода при сборке.
  2. Проверяйте нулевые значения. Тестируйте интерфейс с данными, где счетчики равны 0.
  3. Ссылайтесь на CLDR. Правила плюрализации для ru доступны в Unicode CLDR.
  4. Обновляйте Hugo. Версия 0.50 (2018 г.) устарела. Современные версии (v0.120+) имеют улучшенную диагностику i18n.

Кейс «Вшдр обстановка два нуля» наглядно демонстрирует, как неполное определение правил плюрализации ломает интерфейс на русском языке. Hugo строго следует стандартам Unicode CLDR, поэтому для русского локаля обязательно наличие ключей zero, one, few, many (и other как фоллбэк). Пропуск даже одной формы (в данном случае zero) приводит к утечке внутренних идентификаторов в пользовательский интерфейс.


Статья подготовлена на основе данных из открытого обсуждения на форуме поддержки Hugo (discourse.gohugo.io), датированного 30 октября 2018 года. Персональные данные автора вопроса и пути файловой системы замаскированы в соответствии с политикой конфиденциальности.