Информация об изменениях

Сообщение Re: Грабли мультиязычной поддержки от 11.10.2015 10:09

Изменено 11.10.2015 10:11 BulatZiganshin

Здравствуйте, rean, Вы писали:

R>Впервые мультиязычность в моих продуктах появилась примерно десять лет назад. По мере внедрения этого появились трудности и проблемы. О них и заострю внимание.


расскажу о своём freearс (и прогу и исходники можно скачать на сайте):

все "some text", которые увидит юзер, были заменены на i18n("0123 some text"). это позволяет работать проге даже без lang-файлов или с файлами от иной версии, плюс делает понятней исходники. я пользуюсь gui-библиотекой через свои врапперы, в них был добавлен вызов i18n плюс автоматическая подкачка тултипов. т.е. вызов uiButton("some text") поменялся на uiButton("0123 some text"), а текст самого uiButton стал примерно таким:

createButton(i18n(text))
n = extractNumber(text)
addTooltip(i18n(n+1000))

i18n пытается извлечь текст с заданным номером из текущего файла локализации, затем из английского, и наконец при неудаче просто возвращает остаток текста. соответственно мы получаем локализованную надпись, если она есть, плюс локализованный или английский вариант тултипа (тексты тултипов хранятся только в lang-файлах)

старые номера навечно закреплены за старыми надписями, даже если эти надписи перестали использоваться в новой версии программы. тексты могут включать параметры типа "0123 ваша цена %1, со скидкой %2" — такой текст сначала транслируется, а потом в него подставляются параметры


ну а жемчужина всей этой организации — система сборки трансляций. английский языковый файл, как я уже говорил, содержит только тултипы. основным файлом трансляции является русский. как только в программу добавляется новый "нумерованный" текст, в том же диффе я заношу его в arc.russian.txt вместе с переводом, при этом содержимое arc.russian.txt аккуратно отсортировано и структурировано, например:

=== Explorer context menu =======================================================
0391 Add to "%s"=Добавить в "%s"
0392 Compress the selected files using FreeArc=Сжать выделенные файлы с помощью FreeArc

=== Menu ========================================================================
Main menu
0050 File=Файл
0066 Edit=Правка

File menu/toolbar
0262 Open archive=Открыть архив
0265 Open archive=Открыть архив
0263 Select all=Выделить всё


далее, есть такой момент — у меня программа близка по назначению к 7-zip, поэтому некоторые термины можно взять из его трансляций, а их уже под сотню. таким образом, система сборки трансляций читает два-три файла:
— мой arc.russian.txt
— старый файл этого языка, если он есть
— файл этого языка из 7-zip

и собирает из них новый файл для этого языка. при этом за основу берётся arc.russian.txt, в нём заменяются только правые части транслируемых строк на взятые по номеру из старого файла этого языка (или 7-зиповские). это автоматически обеспечивает сохранение структуры моей русской трансляции, выкидывание устаревших строк перевода и добавление новых. если перевода для какой-то строки нет, то правая часть заменяется на "??", т.е. текст будет выглядеть так:

Main menu
0050 File=??
0066 Edit=??

когда человек переключает GUI программы на свой язык, то в том же диалоге присутствует кнопка Edit. При её нажатии текущий файл трансляции открывается в Notepad. В заголовке этого файла приведена (скопированная из arc.russian.txt) инструкция для переводчика — искать в файле все строчки "??" и заменять их на переводы строк слева. При этом в arc.russian.txt, а следовательно и в этом файле, группы строк отсортированы по их важности — сначала идут строки для Explorer context menu, затем главное меню программы и тексты в окне файл-менеджера. Таким образом, можно переводить файл по частям, начиная с самых важных текстов, и рекомендуемый порядок перевода уже предоставлен. Строка для перевода у тебя перед носом. Контекст, в котором эта конкретная строка показывается, тоже ясен. В общем, переводчику предоставлены все удобства, а исправленная трансляция будет использоваться сразу же после перезагрузки программы
Здравствуйте, rean, Вы писали:

R>Впервые мультиязычность в моих продуктах появилась примерно десять лет назад. По мере внедрения этого появились трудности и проблемы. О них и заострю внимание.


расскажу о своём freearс (и прогу и исходники можно скачать на сайте):

все "some text", которые увидит юзер, были заменены на i18n("0123 some text"). это позволяет работать проге даже без lang-файлов или с файлами от иной версии, плюс делает понятней исходники. я пользуюсь gui-библиотекой через свои врапперы, в них был добавлен вызов i18n плюс автоматическая подкачка тултипов. т.е. вызов uiButton("some text") поменялся на uiButton("0123 some text"), а текст самого uiButton стал примерно таким:

createButton(i18n(text))
n = extractNumber(text)
addTooltip(i18n(n+1000))

i18n пытается извлечь текст с заданным номером из текущего файла локализации, затем из английского, и наконец при неудаче просто возвращает остаток текста. соответственно мы получаем локализованную надпись, если она есть, плюс локализованный или английский вариант тултипа (тексты тултипов хранятся только в lang-файлах)

старые номера навечно закреплены за старыми надписями, даже если эти надписи перестали использоваться в новой версии программы. тексты могут включать параметры типа "0123 ваша цена %1, со скидкой %2" — такой текст сначала транслируется, а потом в него подставляются параметры


ну а жемчужина всей этой организации — система сборки трансляций. английский языковый файл, как я уже говорил, содержит только тултипы. основным файлом трансляции является русский. как только в программу добавляется новый "нумерованный" текст, в том же диффе я заношу его в arc.russian.txt вместе с переводом, при этом содержимое arc.russian.txt аккуратно отсортировано и структурировано, например:

=== Explorer context menu =======================================================
0391 Add to "%s"=Добавить в "%s"
0392 Compress the selected files using FreeArc=Сжать выделенные файлы с помощью FreeArc

=== Menu ========================================================================
Main menu
0050 File=Файл
0066 Edit=Правка

File menu/toolbar
0262 Open archive=Открыть архив
0265 Open archive=Открыть архив
0263 Select all=Выделить всё


далее, есть такой момент — у меня программа близка по назначению к 7-zip, поэтому некоторые термины можно взять из его трансляций, а их уже под сотню. таким образом, система сборки трансляций читает два-три файла:
— мой arc.russian.txt
— старый файл этого языка, если он есть
— файл этого языка из 7-zip

и собирает из них новый файл для этого языка. при этом за основу берётся arc.russian.txt, в нём заменяются только правые части транслируемых строк на взятые по номеру из старого файла этого языка (или 7-зиповские). это автоматически обеспечивает сохранение структуры моей русской трансляции, выкидывание устаревших строк перевода и добавление новых. если перевода для какой-то строки нет, то правая часть заменяется на "??", т.е. текст будет выглядеть так:

Main menu
0050 File=??
0066 Edit=??

когда человек переключает GUI программы на свой язык, то в том же диалоге присутствует кнопка Edit. При её нажатии текущий файл трансляции открывается в Notepad. В заголовке этого файла приведена (скопированная из arc.russian.txt) инструкция для переводчика — искать в файле все строчки "??" и заменять их на переводы строк слева. При этом в arc.russian.txt, а следовательно и в этом файле, группы строк отсортированы по их важности — сначала идут строки для Explorer context menu, затем главное меню программы и тексты в окне файл-менеджера, ну а дальше всякие диалоги и сообщения. Таким образом, можно переводить файл по частям, начиная с самых важных текстов, и рекомендуемый порядок перевода уже предоставлен. Строка для перевода у тебя перед носом. Контекст, в котором эта конкретная строка показывается, тоже ясен. В общем, переводчику предоставлены все удобства, а исправленная трансляция будет использоваться сразу же после перезагрузки программы