Грабли мультиязычной поддержки
От: rean  
Дата: 10.10.15 15:29
Оценка: 90 (8) +2
deleted
Отредактировано 22.04.2019 8:34 deleted2 . Предыдущая версия . Еще …
Отредактировано 10.10.2015 15:50 deleted2 . Предыдущая версия .
Отредактировано 10.10.2015 15:49 deleted2 . Предыдущая версия .
Re: Грабли мультиязычной поддержки
От: YuriKobets Россия http://www.truelaunchbar.com — замена панели быстрого запуска
Дата: 10.10.15 16:15
Оценка: 4 (1) +1
Здравствуйте, rean, Вы писали:

R>Что было и сделано. Я выбрал свой формат текстового языкового файла на основе INI-подобного языка ключ=значение, какой у меня еще использовался и для хранения установок программы. В него просто были внедрены расширения для возможности сохранения значений из нескольких строк, что было важным для некоторых моих программ. Вся информация о текстах записывалась в память программы, откуда уже забиралась во время инициализации и отрисовки.


Только INI-файл? Я в свое время целую интерфейсную либу накатал. С переводами, автоподгоном элементов и блэк джеком
До сих пор тащусь. Очень удобно когда нужно быстренько сделать интерфейс а-ля пара диалогов.

R>Через пять лет программа поддерживала уже десяток языков, и с этим появилась новая проблема. Я раздавал лицензии, но терял координаты переводчиков. Поэтому пришлось заставлять их вписывать свои емейлы в метаданные языкового файла. Но это оказалось лишним. Дело в том, что большая часть этих контактов оказывалась невалидной через год-два. Или переводчик вообще не отвечал на сообщения. Так что, постепенно, у меня скопилось такое количество изменений, что продукт перестал нормально выглядеть на целом ряде очень важных языков. И я принял решение изменить все кардинально.


Да они просто забивают. Бывают, конечно, исключения, но очень редко.

R>Еще оказалось, что при обновлении на новую версию, при установке, старые языковые файлы оставались на своих местах, и пользователь получал неправильную отрисовку. И программой было очень трудно пользоваться, поскольку некоторые тексты в этом случае просто-напросто отсутствовали или уже имели несколько иной смысл, чем было в старых версиях. Моя система дала сбой.


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

R>* Совершенно зря в первых версиях я вносил тексты о цене программы. Цена менялась очень часто. Влияния же на то, что разбрелось по интернету, у меня не было.


Ух ё... про неправильность такого подхода в свое время трубили на всех углах этого (и другого) форума.

R>* Важен удобный доступ к тексту для облегчения программирования. Изначально я грузил всё в переменные программы, а затем получал значение в нужном месте, просто присваивая. По мере роста программы это стало чудовищно неудобным — надо было менять тексты в нескольких местах, что приводило порой к ошибкам и вообще замедляло разработку. Замена доступа через вызов функции типа GetText('SomeCode') упростило программирование.


Я бы даже сказал так: GetText("StringID", "Default text"). И в коде видно, что за текст и при проблемах все же будет какой-то текст.

R>* Не нужно отказываться от родного языка. Стали присылать переводы на русский те, кто не являлся русским — были даже поляки и чехи. Перевод был не очень хорошим. Я вернулся обратно к тому, что сам стал писать русский текст.


Отказываться не нужно. На нем нужно тестить

R>* Существует проблема взаимодействия программы с сайтом. На сайте один список поддерживаемых языков, а в программе другой. Куда посылать пользователя?


Не совсем понятно что имеется в виду. Так или иначе для себя я решил одно: в дистрибутив вообще не включать языки, но давать их скачивать отдельно.

R>* Готовьтесь к тому, что когда у вас появится локализация на язык, какой вы не знаете, в саппорт к вам будут писать на незнакомом вам языке. Дистанция между взаимопониманием увеличивается. Нагрузка на саппорт растет.


Это да, особенно французы этим грешат. Обычно гуглем перевожу, понимаю, дальше идет переписка на английском. Проблем вроде небыло.

R>Несколько решений, какие считаю верными и работающими:


R>* Я сознательно отказался от поддержки азиатских языков и иврита. Там настолько много особенностей, что не имея в составе разработчиков-нейтивов, невозможно это корректно реализовать. Так что, нет смысла этого делать.


Китайский, японский, даже арабский как-то был. Если все в уникоде, то проблем минимум.

R>* На настоящий момент считаю упор на энтузиастов не работающим. Во-первых, за десять последних лет спрос на это упал, во-вторых, они неуправляемы. Очень неприятно находиться в дилемме — стоит ли реализовать некоторую фичу / изменить что-то, что задействует смену текстов, или лучше попытаться отказаться от изменения текстов.


Ага энтузиастов совсем мало. А с текстами нужно делать так, чтобы добавление пары строк не приводило к общему краху перевода.
Re: Грабли мультиязычной поддержки
От: decradle Ниоткуда http://www.alconost.com
Дата: 10.10.15 16:42
Оценка: -1 :)
Привет.

Для всех проблем есть четкое решение. Сперва вот: http://alconost.com/services/crowdin-alconost

Вкратце: будет волшебство — добавил строчку в ресурсы на русском. Запустил bat-файл. Потом запустил второй раз через сутки и все — все переводы (хоть на 40 языков) готовы и можно делать билд.

Волшебство делают здесь: alpha@alconost.com

Велкам!

R>

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

--Александр
Re[2]: Грабли мультиязычной поддержки
От: rean  
Дата: 10.10.15 16:46
Оценка: 1 (1) +1 :)
deleted
Отредактировано 22.04.2019 10:12 deleted2 . Предыдущая версия .
Re[3]: Грабли мультиязычной поддержки
От: UA Украина  
Дата: 10.10.15 18:11
Оценка: -3
D>>Волшебство делают здесь:
R>Похоже, статья превратилась в улавливателя рекламы

Плюсую, статья высосана из пальца — наверное для этого собственно и посвящалась.
Re: Грабли мультиязычной поддержки
От: UA Украина  
Дата: 10.10.15 18:19
Оценка:
R>* Я сознательно отказался от поддержки азиатских языков и иврита. Там настолько много особенностей, что не имея в составе разработчиков-нейтивов, невозможно это корректно реализовать. Так что, нет смысла этого делать.

Насчет азиатов это вы зря.
Re[2]: Грабли мультиязычной поддержки
От: rean  
Дата: 10.10.15 21:12
Оценка:
deleted
Отредактировано 22.04.2019 10:12 deleted2 . Предыдущая версия .
Re[3]: Грабли мультиязычной поддержки
От: UA Украина  
Дата: 10.10.15 21:43
Оценка:
UA>>Насчет азиатов это вы зря.
R>Сколько у вас японцев купило за всё время существования?

Речь же была о локализации.
(ну да иероглифы — сначала было как то страшновато потому что прога изначально не закладывалась под азиатов, потом слегка непривычно, а затем и вовсе смешно — но ничего необычного там нету, никаких разработчиков-нейтивов не требуется).
Re[4]: Грабли мультиязычной поддержки
От: rean  
Дата: 10.10.15 22:39
Оценка: -1 :)
deleted
Отредактировано 22.04.2019 10:12 deleted2 . Предыдущая версия .
Re[5]: Грабли мультиязычной поддержки
От: UA Украина  
Дата: 10.10.15 22:59
Оценка:
UA>>Речь же была о локализации.
UA>>(ну да иероглифы — сначала было как то страшновато потому что прога изначально не закладывалась под азиатов, потом слегка непривычно, а затем и вовсе смешно — но ничего необычного там нету, никаких разработчиков-нейтивов не требуется).

R>Т.е. нисколько?


Расслабься, открою тебе маленький секрет: если твой продукт действительно будет нужен в Азии то тебе даже оплатят эту работу.
Re[6]: Грабли мультиязычной поддержки
От: rean  
Дата: 10.10.15 23:04
Оценка: +1 :))
deleted
Отредактировано 22.04.2019 10:12 deleted2 . Предыдущая версия .
Re[7]: Грабли мультиязычной поддержки
От: UA Украина  
Дата: 10.10.15 23:07
Оценка:
R>Героям слава. Что вы делаете в шареварном разделе вообще?
Читаю, иногда пишу.
Re[8]: Грабли мультиязычной поддержки
От: rean  
Дата: 10.10.15 23:11
Оценка: 1 (1)
deleted
Отредактировано 22.04.2019 10:12 deleted2 . Предыдущая версия .
Re[9]: Грабли мультиязычной поддержки
От: UA Украина  
Дата: 10.10.15 23:20
Оценка: +1
R>Понимаю. Голова для того, чтобы в нее есть.
R>PS. Если бы вы реально работали с японским рынком, вы бы понимали суть моего вопроса про количество ордеров.

Вопрос абсолютно бессмысленный: есть маленькие раки по 3 рубля, есть большие раки но по 5, а есть раки вообще никому не нужные по X, а у тебя возможно вообще не раки а сраки.
Какие раки/сраки лучше берут?
Re: Грабли мультиязычной поддержки
От: Carc Россия AmlPages.com — http://www.amlpages.com/home.php
Дата: 11.10.15 07:47
Оценка: 4 (1)
R>Дальше опишу уже не так подробно, а тезисно, другие грабли, с которыми пришлось столкнуться:

R>* Совершенно зря в первых версиях я вносил тексты о цене программы. Цена менялась очень часто. Влияния же на то, что разбрелось по интернету, у меня не было.


1. Ба-а-а-а, знакомые всё грабли.

2. По делу. Цена хардкодиться — ну или как вариант вынимается в онлайн с сервера (очень часто неприемлемо).

Как хардкодим цену.
1. Цена менятся, но меняется она с выходом новой версии. В новой версии хардкодиться новая цена.

2. Другое дело, что цена может сильно разниться для разной языковой аудитории. Для англоязычных пицот баксов, а для русскоязычных писят баксов. Такое сплошь и рядом.

Что делал я? Я определял цену, которую показать пользователю по языковому файлу. В файле (тот же ини кстати), был ключ LANGPREFIX. В нем был префикс языка по ISO (то что в языковой панели Windows показывается). Всех переводчиков просил указывать (несложно мол, посмотри в нижний угол экрана).

Что дальше? У меня в основном 2 цены. Для англо- и проче-язычных (больше), и для русско- и прочеязычных (цена меньше).

Дальше в подсистеме локализации заводилось пара функций вида BOOL IsПоказатьЦенуДляРусских, BOOL IsПоказатьЦенуДляОстальных. По сути IsПоказатьЦенуДляРусских показывала меньшую цену, вторая была просто отрицанием первой.

Дык вот функция IsПоказатьЦенуДляРусских просто вынимала этот самый префикс языка из ключа LANGPREFIX из текущего файла локализации и сравнивала его с массивом префиксов. Т.е. для префиксов RU, UA, KZ(казахи), BY (белорусы) — она всегда возращала TRUE. Для прочих FALSE.

Т.е. таким образом сравнительно дешево получилось сделать как бы поддержку пра-русской аудитории, и пра-прочей. Ясно, что групп может быть и больше.

Ну минусы очевидны. Плюсы налицо — малой кровью получаем поддержку разных групп цен.

Ну вот так, как-то... Проверено на 3 работающих проектах. Работат!!!!

PS: остальное все само собой, вроде установок цен на orderpage по IP, или редирект по языку веб-браузера на страницу с малой ценой или с большей. Одно другому не мешает.
Aml Pages Home
Re[2]: Грабли мультиязычной поддержки
От: Carc Россия AmlPages.com — http://www.amlpages.com/home.php
Дата: 11.10.15 07:54
Оценка:
D>Волшебство делают здесь: alpha@alconost.com

Это НЕ волшебство! Волшебство БЕСПЛАТНО!!!!

Топикстартер описал суть: как сравнительно бесплатно для разработчика сделать поддержку локализации, как это сделать так, чтобы переводчику было сравнительно лекго этим пользоваться. А в ваших решениях один порог вхождения и так уже выше.
Aml Pages Home
Re[3]: Грабли мультиязычной поддержки
От: UA Украина  
Дата: 11.10.15 08:55
Оценка:
D>>Волшебство делают здесь: alpha@alconost.com
C>Это НЕ волшебство! Волшебство БЕСПЛАТНО!!!!

Облачная платформа + .bat файлы это разве не волшебство?
Re: Грабли мультиязычной поддержки
От: BulatZiganshin  
Дата: 11.10.15 10:09
Оценка: 8 (3)
Здравствуйте, 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, а следовательно и в этом файле, группы строк отсортированы по их важности — сначала идут строки для Explorer context menu, затем главное меню программы и тексты в окне файл-менеджера, ну а дальше всякие диалоги и сообщения. Таким образом, можно переводить файл по частям, начиная с самых важных текстов, и рекомендуемый порядок перевода уже предоставлен. Строка для перевода у тебя перед носом. Контекст, в котором эта конкретная строка показывается, тоже ясен. В общем, переводчику предоставлены все удобства, а исправленная трансляция будет использоваться сразу же после перезагрузки программы
Люди, я люблю вас! Будьте бдительны!!!
Отредактировано 11.10.2015 12:52 BulatZiganshin . Предыдущая версия . Еще …
Отредактировано 11.10.2015 10:59 BulatZiganshin . Предыдущая версия .
Отредактировано 11.10.2015 10:11 BulatZiganshin . Предыдущая версия .
Re[8]: Грабли мультиязычной поддержки
От: marcopolo Россия  
Дата: 11.10.15 15:43
Оценка: +1
Здравствуйте, UA, Вы писали:

R>>Героям слава. Что вы делаете в шареварном разделе вообще?

UA>Читаю, иногда пишу.

Для вас есть dou.

У меня нативы самостоятельно переводили на китайски и японский и корейский, используя текстовые файлы. И это все без использования UniCode еще было.
http://images.vfl.ru/ii/1458025806/ffafd500/11874919.png
Re[9]: Грабли мультиязычной поддержки
От: UA Украина  
Дата: 11.10.15 16:08
Оценка: 1 (1)
M>Для вас есть dou.
Там другой круг и формат общения. Так что заменой служить не может.

M>У меня нативы самостоятельно переводили на китайски и японский и корейский, используя текстовые файлы. И это все без использования UniCode еще было.

Закрытый формат + своя тулза для редактирования == нативы со своей самодеятельностью идут лесом.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.