Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: ритт от Октябрь 16, 2008, 04:21



Название: TranslationManager
Отправлено: ритт от Октябрь 16, 2008, 04:21
TranslationManager - попытка создать удобный механизм для смены языка интерфейса без перезапуска программы.
это пока только техническая версия - надеюсь будут комментарии и пожелания...
сейчас под лжпл2, но запускать планирую под жпл2 и/или пивной лицензией.
в проекте имеется простенький примерчик для наглядности. документации пока что нет.

* currentLanguage/setCurrentLanguage - текущий язык интерфейса.
* untranslatedLanguage/setUntranslatedLanguage - язык по умолчанию для программы (если не подгружать файлы переводов).
* languages/isLanguageAvailable - список языков (генерируется из списка найденных файлов перевода).
* translationPaths/setTranslationPaths/addTranslationPath/removeTranslationPath - пути, в которых следует искать файлы перевода. используются в прямой последовательности. по умолчанию включаются пути {appDirPath}/translations ({appDirPath}/../share/{appName}/translations для юнихов) и путь к переводам Qt из QLibraryInfo.
* nameFilters/setNameFilter/setNameFilters/addNameFilter/removeNameFilter - маски файлов перевода в виде "myapp_*.qm", где звёздочка заменяет название языка для локали в формате  ru_RU либо в кратком - ru. используются в обратной последовательности. по умолчанию включаются "{appName}_*.qm" и "qt_*.qm".
при "перекрытии" строк перевода важно соблюдать последовательность путей и масок файлов!

принцип работы стандартный - установка QTranslator'ов и реакция на QEvent::LanguageChange в собственных виджетах. для перевода форм дизайнера (да-да, именно "форм", т.к. в дизайнере производные виджеты так и называются :) ) нужно вызывать retranslateUi соответствующей формы.

ругайте :)


Название: Re: TranslationManager
Отправлено: lit-uriy от Октябрь 16, 2008, 05:32
поругаем конечно, но для начала - СПАСИБО.


Название: Re: TranslationManager
Отправлено: ритт от Октябрь 20, 2008, 17:25
ну, что, никому не надо? я один пользую переводы плагинов отдельно от переводов ядра? :)


Название: Re: TranslationManager
Отправлено: pastor от Октябрь 20, 2008, 17:29
ну, что, никому не надо? я один пользую переводы плагинов отдельно от переводов ядра? :)

вещь нужная, но потестить совершенно времени нет


Название: Re: TranslationManager
Отправлено: IGHOR от Октябрь 22, 2008, 15:58
Ща потестим


Название: Re: TranslationManager
Отправлено: Hort от Октябрь 29, 2008, 00:19
большое спасибо!! прикрутил к своему проекту - все работает олично.
хотелось бы иметь возможность работать с языками не только в формате "ru" и "ru_RU" но и "russian" (напрмер передавать в setCurrentLanguage())


Название: Re: TranslationManager
Отправлено: ритт от Октябрь 29, 2008, 00:35
о, первый тестер :)

> хотелось бы иметь возможность работать с языками не только в формате "ru" и "ru_RU" но и "russian"
хорошо, на досуге посмотрю что можно сделать...


Название: Re: TranslationManager
Отправлено: ритт от Ноябрь 07, 2008, 03:57
выделил сегодня немного времени - к поддержке языковых кодов добавил поддержку названий языков...
и вроде бы всё неплохо, НО...если имеются файлы переводов, например, qt_ru.qm и myapp_russian.qm, то в списке языков имеем "Russian (ru_RU)" и "Russian (russian)" - околесица, не правда ли? :)
планирую добавить ещё систему алиасов, где ru_RU и russian автоматически распознаются как один и тот же язык...
и по этому поводу вопрос: имеет ли смысл давать возможность назначать произвольные алиасы? например, russian_padonak назначить алиасом языка ru_RU/russian - т.о. при наличии соотстветвующих фалов для русского языка подгрузятся файлы переводов qt_ru.qm и myapp_russian_padonak.qm...это может быть кому-то полезным?

Hort, в первую очередь вопрос адресован тебе, т.к. в данном случае ты - инициатор :)
и ещё: как смотришь на регистрозависимость как то myapp_Russian.qm? если алиасы окажутся никому не нужны, мне будет проще сделать именно так...


Название: Re: TranslationManager
Отправлено: Hort от Ноябрь 09, 2008, 23:25
выделил сегодня немного времени - к поддержке языковых кодов добавил поддержку названий языков...
и вроде бы всё неплохо, НО...если имеются файлы переводов, например, qt_ru.qm и myapp_russian.qm, то в списке языков имеем "Russian (ru_RU)" и "Russian (russian)" - околесица, не правда ли? :)
планирую добавить ещё систему алиасов, где ru_RU и russian автоматически распознаются как один и тот же язык...
и по этому поводу вопрос: имеет ли смысл давать возможность назначать произвольные алиасы? например, russian_padonak назначить алиасом языка ru_RU/russian - т.о. при наличии соотстветвующих фалов для русского языка подгрузятся файлы переводов qt_ru.qm и myapp_russian_padonak.qm...это может быть кому-то полезным?

Hort, в первую очередь вопрос адресован тебе, т.к. в данном случае ты - инициатор :)
и ещё: как смотришь на регистрозависимость как то myapp_Russian.qm? если алиасы окажутся никому не нужны, мне будет проще сделать именно так...
о большое спасибо! я так понимаю теперь возвращает язык в виде "Russian (russian)"? хотелось бы чтобы это можно было изменить, т.к. я заполняю QComboBox для выбора языка чемто вроде:
Код:
QStringList languages=TranslationManager::languages();
foreach(QString locale, languages){
if(locale!="untranslated")
m_ui->optionsLang->addItem(QLocale::languageToString(QLocale(locale).language()), locale);
}
т.е. у меня в каждом пункте читабельное название языка ("Russian") и его код возвращаемый languages()
и переходить на какойто другой вид не хотелось бы (я имею ввиду внешний вид).
думаю можно было бы сделать или 2 разные функции, или 1 в которую передавать небходимый ключ.
Насчет "padonak" мысль конечно интерестная но я думаю она будет не сильно востребована, так что такое можно конечно добавить но не в первую очередь. для среднестатист
>> околесица, не правда ли?
помоему вполне нормально. у меня в Опере когдато было 2 языка "Русский" и "russian"

ps забыл спросить если в setCurrentLanguage() передать "Russian" он выберет мой myapp_ru.qm?
т.к. мне приходилось шаманить похожим перебором чтобы это сделать


Название: Re: TranslationManager
Отправлено: ритт от Ноябрь 10, 2008, 00:38
да, добавлю алиасы - в setCurrentLanguage можно будет передавать хоть Russian, хоть ru, хоть ru_RU...

TranslationManager::languages() будет возвращать список языков (выбранный из найденных файлов переводов) в виде "Russian, English, ..."
TranslationManager::locales()  будет возвращать список локалей (опять же, из найденных файлов переводов) в виде "ru_RU, en_EN, en_GB, ..."

"padonak" тогда идёт лесом - только путаницы добавит...

новый код пока не выкладываю - ещё понаждачу.

зы: благодарствую за комменты.


Название: Re: TranslationManager
Отправлено: Вячеслав от Ноябрь 10, 2008, 19:40
Кость , попробывал сегодня в лоб собрать 2008 - обломался ;) собираеться только релиз либы ...
решение в лоб в src.pro

TARGET    = $$qtLibraryTarget($$TRANSLATIONMANAGER_LIBNAME)
и телемаркет ;)

PS а чего с плагами делать при таком подходе ? причем у разных плагов может-ведь быть(теоретически) разный набор переводов ;)


Название: Re: TranslationManager
Отправлено: ритт от Ноябрь 10, 2008, 21:30
про таргет корректива принята :) - будет в следующей версии

> и телемаркет
???

PS если в код заглядывал - список языков генерится из названий всего набора найденных файлов переводов. т.е. в случае разного набора переводов, скажем, ru_RU+en_GB для аппы, en_GB+de_DE для плуга #1 и en_GB+tw для плуга #2 полноценно переведённой аппа будет только для untransllated (если исходный язык один - предполагается, что всегда верно) и для en_GB. для остальных же вариантов будут смеси типа ru_RU+untransllated/de_DE+untransllated и т.д.

можно пойти иначе - определить "важные" маски, только по которым будет строиться список языков. но тогда придётся как-то классифицировать маски на "системные" (qt_*.qm), "важные" и "всякий бред", что сделает программный интерфейс довольно запутанным...

если есть идеи, с удовольствием послушаю :)


Название: Re: TranslationManager
Отправлено: Hort от Ноябрь 12, 2008, 19:41
в линуксе при установке изменил имя исполняемого файла с editor на tceditor чтобы не было конфликтов при вызове из командной строки. и теперь он не кушает файлы перевода editor_ru.qm =(. хотя в программе я явно прописал setApplicationName("editor") - думал он берет название из этой переменной, а оказывается наверно из имени файла. если можно - поправьте плз!
заранее благодарен. :)


Название: Re: TranslationManager
Отправлено: ритт от Ноябрь 12, 2008, 20:07
однозначно, из имени файла, т.к. applicationName может быть в произвольной кодировке и даже с пробелами и символами маски, что неприемлемо. но appName под линухом практически всегда будет в латин1 и 100% не может содержать символы маски.
если требуется задать совершенно произвольный набор масок (и не включать маски по умолчанию), пользуйся setTranslationPaths


Название: Re: TranslationManager
Отправлено: Hort от Ноябрь 12, 2008, 20:11
т.е. в моем случае можно задать "editor_*.qm"? в этом случае нормально будет работать с qt_ru.qm или для него тоже прописывать маску?


Название: Re: TranslationManager
Отправлено: ритт от Ноябрь 12, 2008, 20:37
в этой версии - нет. в следующей версии qt_*.qm будет вынесен в разряд "автоматических опциональных" масок.
распознавание по названи языка уже добавил, мб сегодня добавлю ещё хэш и выложу на посмотреть...


Название: Re: TranslationManager
Отправлено: lit-uriy от Ноябрь 12, 2008, 21:20
2 Hort, стоило поступить так:
имя своего бинаря знаешь (  QCoreApplication::arguments ().at(0) ), пытайся загрузить <имя бинаря>_ru.qm


Название: Re: TranslationManager
Отправлено: ритт от Ноябрь 12, 2008, 21:28
appName() вернёт то же самое, <имя бинаря>_ru.qm и так включается автоматически
здесь вопрос в изменении имени программы без изменения маски поиска - этого делать я не буду ибо бессмысленно...


Название: Re: TranslationManager
Отправлено: Hort от Ноябрь 14, 2008, 14:56
Нашел такой баг:
вот состав папки с переводами
Код:
qt_ru.qm
tester_ru.qm
tester_uk.qm
Украинский перевод не погружается (tester_uk.qm). Но стоило убрать из фильтров qt_*.qm - стразу начал спокойно отображаться и нормально переводить. Походу дело в том, что qt_uk.qm нет не в моей папке и в папке с переводами Qt. Только добавил переименованый qt_ru.qm -> qt_uk.qm начало работать и с "qt_*.qm"


Название: Re: TranslationManager
Отправлено: pastor от Ноябрь 14, 2008, 15:04
офтоп:

UK - United Kingdom
UA - Ukrainian


Название: Re: TranslationManager
Отправлено: Hort от Ноябрь 14, 2008, 15:11
офтоп:

UK - United Kingdom
UA - Ukrainian
uk - ukrainian
UA - Ukraine
сам удивился когда узнал
проверял дебагом QLocale("uk") определяет как
uk_UA
language=Ukranian
Country=Ukraine


Название: Re: TranslationManager
Отправлено: pastor от Ноябрь 14, 2008, 15:23
uk - ukrainian
UA - Ukraine
сам удивился когда узнал
проверял дебагом QLocale("uk") определяет как
uk_UA
language=Ukranian
Country=Ukraine

Интересно :)


Название: Re: TranslationManager
Отправлено: lit-uriy от Ноябрь 14, 2008, 15:36
2 pastor, английский:
en_AU - Австралия
en_CA - Канада
en_GB - Великобритания
en_NZ - Новая зеландия
en_US - США

Вроде больше нету



Название: Re: TranslationManager
Отправлено: lit-uriy от Ноябрь 14, 2008, 15:39
ага есть еще:
en_ZA - английский (Южная африка)
ну и
uk_UA - украинский (Украина)

(не забывайте что в таких обозначениях, первый - язык, второй - государство; в отличие от просто en или ru)


Название: Re: TranslationManager
Отправлено: pastor от Ноябрь 14, 2008, 15:45
Ну я руководствовался не тем что в папке QTDIR/translations, а меджународным буквенным обозначение стран согласно ISO 3166


Название: Re: TranslationManager
Отправлено: lit-uriy от Ноябрь 14, 2008, 21:09
а я подглядел в инструментах для переводчика и Aspell, одинаково.


Название: Re: TranslationManager
Отправлено: lit-uriy от Ноябрь 14, 2008, 21:15
вот в украинской вики нашел http://uk.wikipedia.org/wiki/ISO_639


Название: Re: TranslationManager
Отправлено: pastor от Ноябрь 14, 2008, 21:46
вот в украинской вики нашел http://uk.wikipedia.org/wiki/ISO_639

Век живи, век учись, а дураком помрешь )))

Спасибо за линк )