Child pages
  • i18n в JSON-коллекциях
Skip to end of metadata
Go to start of metadata

Общие задачи

Реализовать систему локализации для JSON-коллекций, загружаемых при upgrade

Описание проблемы 

На настоящий момент в JSON-коллекциях, загружаемых при upgrade отсутсвуют переводы на языки, отличные от английского. Для EventClass и AlarmClass предусмотрен механизм, позволяющий задать разные варанты перевода. Но он жестко зашит в код, не предусматривает каких-либо инструментов для локализаторов за исключением ручной правки JSON. Кроме того, все переводы устанавливаются в базу и извлекаются из MongoDB при каждом обращении к event class. Кроме того, отсутсвует механизм поиска по локализованным сообщениям.

Общие предположения

  • Механизм должен выбирать сообщение на правильном языке в момент запуска upgrade и записывать его как обычное текстовое поле
  • Любое текстовое поле имеет право на локализацию
  • Локализаторы могут быть незнакомы с синтакисисом JSON
  • Переводчики на разные языки могут быть не связаны друг с другом
  • JSON-файлы создаются разными людьми и поступают в проект разными способами
  • Помимо записей, импортированных из JSON каждая база NOC в процессе работы пополняется локально. Часть изменений может вернуться в проект
  • В качестве базового языка для текста по историческим причинам принят английский (в королевском варианте)
  • Список поддерживаемых переводов будет расти

Требования

#ТребованияС точки зрения пользователяВажностьПримечания
1

Переводы должны храниться в исходном JSON-файле

Каждый JSON является отдельным независимым объектомОбязательно

Минимизация накладных расходов на ведение JSON-коллекции

2Выбор правильного языка должен осуществляться в момент запуска upgrade. После установки ядро NOC должно обрабатывать переведенные поля как обычные текстовыеАдминистратор запустил upgrade и сделал себе хорошоОбязательноМинимизация расходов на разработку. Все тяжелые операции должны выполняться только в момент апгрейда
3Любое текстовое поле в JSON можно локализовывать без модификации исходного кода NOCJSON содержит в себе все необходимые декларацииОбязательно 
4Необходимо иметь возможность задания нескольких языков локализации как глобально, так и на уровне коллекции. По возможности должен использоваться первый перевод. В случае его отсутсвия - следующий по приоритету, и так далее

В noc.conf добавляется секция для предпочтительных переводов как глобально, так и на уровне коллекции

ОбязательноВ случае отсутствия перевода на родной язык возможен переход на родственный, но понятный пользователям системы. Например: украинский -> русский -> английский, каталонский -> испанский -> английский
5В случае изменения сообщения на базовом языке остальные переводы должны быть помечены как нечеткие (fuzzy)Локализаторы могут дополнительно проверять нечеткие и устаревшие переводы и приводить их в соответсвиеЖелательноВ противном случае возможна рассинхронизация перевода с реальным смыслом
6Локализаторы должны иметь возможность обнаруживать отсутствующие переводы для объектовУ локализатора есть инструмент для быстрого определения пропущенных переводовЖелательноВ противном случае возможны кусочные переводы и мешанина из языков
7Контрибуторы должны иметь возможность присылать JSON даже в случае отсутсвия переводов сообщений на всех поддерживаемых языкахКонтрибутор нажимает кнопку JSON и получает JSON-файл, достаточный для пересылкиОбязательноПри создании дополнительных сложностей контрибуторам поток изменений может сократиться

Общий дизайн

Дополнительные соглашения при обработки JSON

Вместо текстового значения атрибута может быть указан особым образом сформатированый dict. Например

...
   "subject": "Link down"
...

может быть заменено на

...
   "subject": {
		"$i18n": {
			"en": "Link down",
			"ru": "Упал линк"
		}
	},

Признаками наличия переводов являюется:

  • dict вместо строки
  • единственный ключ $i18n в dict
  • наличие ключа en во вложенном dict

Настройки

В noc.conf

[i18n]
collection.global = ua,ru,en
collection.fm.eventclasses = en
 
collection.global.allow_fuzzy = true
collection.gm.eventclasses.allow_fuzzy = false

Опция collection.global задает глобальные настройки для всех коллекций. Языки указываются через запятую, наиболее предпочтительными является первый в списке. В качестве fallback всегда используется английский (код en)

Настройки для коллекции перебивают глобальные.

Дополнительно настраивается возможность использования неточного перевода (allow_fuzzy), как глобально, так и на уровне коллекции

fuzzy translation

При изменении текста для первичного языка (en) все остальные переводы помечаются как нечеткие (fuzzy). Нечеткий перевод требует дополнительной проверки со стороны локализаторов, в противном случае смысл перевода может быть сильно искажен.

нечеткие переводы помечены соответсвующим префиксом.

...
   "subject": {
		"$i18n": {
			"en": "Network Link down",
			"ru": "[FUZZY] Упал линк"
		}
	},

При установке в базу префикс FUZZY удаляется и далее нигде, кроме JSON, не фигурирует.

upgrade

Upgrade строит список предпочтительных языков для коллекции. Процесс upgrade происходит в штатном режиме за одним исключением – если в качестве значения поля указан dict c размером в один ключ со значением $i18n, который в свою очередь также является dict, содержащим, как минимум, ключ enто upgrade переходит в режим поиска перевода.

Upgrade проверяет наличие ключа для первого предпочтительного языка. Если перевод помечен как нечеткий, то проверяется соответсвующая настройка конфига. В случае неудачи проверяется следующий язык. И так далее. Для языка по умолчанию параметр fuzzy игнорируется.

В результате перевода получается строка, которая и записывается в базу.

Дополнительное приложения для локализаторов

Необходимо разработать дополнительное приложение (dev.translation) для локализаторов, позволяющее заводить переводы.

Приложение позволяет отфильтровывать только пропущенные или только нечеткие переводы.

dev.translation UI

При нажатии на кнопку Save происходит запись переводов в коллекции. При изменении нечеткого перевода признак FUZZY снимается

Открытые вопросы

Отрытые вопросы, нерешенные проблемы:

ВопросВарианты решения
Таблица кодов языковНеобходимо договориться о кодах языков, которые будут использоватсья для перевода
Существует ли связь с таблицей LanguageНеобходимо понять, следует ли хранить коды языков трансляции в таблице Language
Реакция при Install JSON, для национальных языковПрописать алгоритм записи переведенного поля в JSON

Related Issues

Отложенные задачи

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

Translate to English

Свойства

Epic
TypeFEATURE
StatusDRAFT
Open Date2014-09-19
ModulesCORE
Language

Russian

OwnerUnknown User (dv)
DesignerUnknown User (dv)
Developers
QA
Close Date 

Оглавление

История изменений

Version Date Comment
Current Version (v. 13) 09.10.2014 12:55 Unknown User (dv):
Приведен пример нелокализованой части JSON
v. 12 24.09.2014 10:56 Unknown User (dv)
v. 11 24.09.2014 10:11 Unknown User (dv)
v. 10 22.09.2014 07:33 Unknown User (dv)
v. 9 22.09.2014 07:31 Unknown User (dv)
v. 8 22.09.2014 07:24 Unknown User (dv)
v. 7 22.09.2014 06:57 Unknown User (dv)
v. 6 19.09.2014 19:27 Unknown User (dv)
v. 5 19.09.2014 19:27 Unknown User (dv)
v. 4 19.09.2014 18:42 Unknown User (dv)
v. 3 19.09.2014 17:59 Unknown User (dv)
v. 2 19.09.2014 17:35 Unknown User (dv)
v. 1 19.09.2014 17:26 Unknown User (dv)

2 Comments

  1. Unknown User (evyscr)

    > Механизм должен выбирать сообщение на правильном языке в момент запуска upgrade и записывать его как обычное текстовое поле

    Отказ от многопользовательского подхода? У одной инсталляции вполне могут быть разноязычные пользователи (как минимум, подобное наблюдалось для инсталляций других web-faced проектов).

    С этой же точки зрения напрашивается вынос конфигурационных параметров в пользовательские настройки. В системных могли бы быть (по примеру одного rpm-based distro) список используемых (устанавливаемых - ради облегчения базы etc.) и дефолтная локаль.

    > Вместо текстового файла может быть указан особым образом сформатированый dict

    Требуется пример с текстовым файлом. Либо, если от этого планируется отказываться, указать это явно.

    > При изменении нечеткого перевода признак FUZZY снимается

    Видит ли локализатор признак [FUZZY]? Если да - он может удалить его вручную (как это и принято) после доведения строки до желаемого состояния. Лично я нередко оставлял данный признак при сомнении в правильности для последующей вычитки/правки.

     

  2. Unknown User (dv)

    Частично реализовано в FM