Russian Qt Forum
Май 09, 2024, 06:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: TranslationManager  (Прочитано 17292 раз)
ритт
Гость
« : Октябрь 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 соответствующей формы.

ругайте Улыбающийся
« Последнее редактирование: Октябрь 16, 2008, 04:24 от Константин » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Октябрь 16, 2008, 05:32 »

поругаем конечно, но для начала - СПАСИБО.
Записан

Юра.
ритт
Гость
« Ответ #2 : Октябрь 20, 2008, 17:25 »

ну, что, никому не надо? я один пользую переводы плагинов отдельно от переводов ядра? Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Октябрь 20, 2008, 17:29 »

ну, что, никому не надо? я один пользую переводы плагинов отдельно от переводов ядра? Улыбающийся

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #4 : Октябрь 22, 2008, 15:58 »

Ща потестим
Записан
Hort
Гость
« Ответ #5 : Октябрь 29, 2008, 00:19 »

большое спасибо!! прикрутил к своему проекту - все работает олично.
хотелось бы иметь возможность работать с языками не только в формате "ru" и "ru_RU" но и "russian" (напрмер передавать в setCurrentLanguage())
Записан
ритт
Гость
« Ответ #6 : Октябрь 29, 2008, 00:35 »

о, первый тестер Улыбающийся

> хотелось бы иметь возможность работать с языками не только в формате "ru" и "ru_RU" но и "russian"
хорошо, на досуге посмотрю что можно сделать...
Записан
ритт
Гость
« Ответ #7 : Ноябрь 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? если алиасы окажутся никому не нужны, мне будет проще сделать именно так...
« Последнее редактирование: Ноябрь 07, 2008, 10:40 от Константин » Записан
Hort
Гость
« Ответ #8 : Ноябрь 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?
т.к. мне приходилось шаманить похожим перебором чтобы это сделать
« Последнее редактирование: Ноябрь 09, 2008, 23:32 от Hort » Записан
ритт
Гость
« Ответ #9 : Ноябрь 10, 2008, 00:38 »

да, добавлю алиасы - в setCurrentLanguage можно будет передавать хоть Russian, хоть ru, хоть ru_RU...

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

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

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

зы: благодарствую за комменты.
Записан
Вячеслав
Гость
« Ответ #10 : Ноябрь 10, 2008, 19:40 »

Кость , попробывал сегодня в лоб собрать 2008 - обломался Подмигивающий собираеться только релиз либы ...
решение в лоб в src.pro

TARGET    = $$qtLibraryTarget($$TRANSLATIONMANAGER_LIBNAME)
и телемаркет Подмигивающий

PS а чего с плагами делать при таком подходе ? причем у разных плагов может-ведь быть(теоретически) разный набор переводов Подмигивающий
Записан
ритт
Гость
« Ответ #11 : Ноябрь 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), "важные" и "всякий бред", что сделает программный интерфейс довольно запутанным...

если есть идеи, с удовольствием послушаю Улыбающийся
Записан
Hort
Гость
« Ответ #12 : Ноябрь 12, 2008, 19:41 »

в линуксе при установке изменил имя исполняемого файла с editor на tceditor чтобы не было конфликтов при вызове из командной строки. и теперь он не кушает файлы перевода editor_ru.qm =(. хотя в программе я явно прописал setApplicationName("editor") - думал он берет название из этой переменной, а оказывается наверно из имени файла. если можно - поправьте плз!
заранее благодарен. Улыбающийся
Записан
ритт
Гость
« Ответ #13 : Ноябрь 12, 2008, 20:07 »

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

т.е. в моем случае можно задать "editor_*.qm"? в этом случае нормально будет работать с qt_ru.qm или для него тоже прописывать маску?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.217 секунд. Запросов: 22.