Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: -=QT=- от Июль 31, 2007, 12:15



Название: Локализация в плагинах (динамических)
Отправлено: -=QT=- от Июль 31, 2007, 12:15
Ув. Сообщество
Сталкивались ли Вы с локализацией в плагинах? И если можете направьте на путь истинный.
Так как в приложении можно сделать так:

 
Код:
   QTranslator translator;
    if (translationFile.isEmpty())
    {
        translationFile = QLocale::languageToString( QLocale::system().language() );
    }
    translationFile = ":/language/translations/"+translationFile+".qm";
    translator.load( translationFile );
    app.installTranslator( &translator );

А в плагине куда совать это всё.
=========
Windows XP ~ Linux 2.6.x ~QT 4.2.3 (4.3.0 - test)


Название: Локализация в плагинах (динамических)
Отправлено: QCasper от Июль 31, 2007, 12:27
я в конструктор виджета совал, только экземпляр транслятора надо в heap создавать, а не в стеке, иначе отмирать будет при завершении работы конструктора, и как следствие никакого перевода вы не увидите


Название: Локализация в плагинах (динамических)
Отправлено: -=QT=- от Июль 31, 2007, 13:38
Большое спасибо.
Только можно кусочек кода этого (одним глазком).

добавлено спустя 1 час 5 минут:

 Нашел подобную тему и решение для неё:
http://www.qtcentre.org/forum/f-qt-programming-2/t-plugin-and-internationalization-631.html
Всем спасибо за общение.
Если ктото забацает по другому дайте знать. Очень интересно.


Название: Локализация в плагинах (динамических)
Отправлено: QCasper от Июль 31, 2007, 13:45
Цитата: "-=QT=-"
Большое спасибо.
Только можно кусочек кода этого (одним глазком).

добавлено спустя 1 час 5 минут:

 Нашел подобную тему и решение для неё:
http://www.qtcentre.org/forum/f-qt-programming-2/t-plugin-and-internationalization-631.html
Всем спасибо за общение.
Если ктото забацает по другому дайте знать. Очень интересно.


От вашего мало чем отличается.

Код:
const QList<const char*> c_TranslateFiles = QList<const char*>()	
<< ":xmltranceiver_ru.qm"
<< ":qt_ru.qm"
;

for (int i=0; i<c_TranslateFiles.size(); i++) {
QTranslator *t = new QTranslator(this);
t->load(c_TranslateFiles[i]);
qApp->installTranslator(t);
}


добавлено спустя 3 минуты:

 
Цитата: "-=QT=-"
Нашел подобную тему и решение для неё:
http://www.qtcentre.org/forum/f-qt-programming-2/t-plugin-and-internationalization-631.html


Или так...


Название: Локализация в плагинах (динамических)
Отправлено: -=QT=- от Июль 31, 2007, 14:27
Я с начала тоже пытался сделать ТАК:
Код:
const QList<const char*> c_TranslateFiles = QList<const char*>()   
   << ":xmltranceiver_ru.qm"
   << ":qt_ru.qm"
;

for (int i=0; i<c_TranslateFiles.size(); i++) {
   QTranslator *t = new QTranslator(this);
   t->load(c_TranslateFiles[i]);
   qApp->installTranslator(t);
}

но в строке :
Код:
qApp->installTranslator(t);

он ругался, что нет у него qApp в плагине.


Название: Локализация в плагинах (динамических)
Отправлено: QCasper от Июль 31, 2007, 15:19
Цитата: "-=QT=-"
он ругался, что нет у него qApp в плагине.


что значит "нет в плагине", и кто именно ругался?


Название: Локализация в плагинах (динамических)
Отправлено: -=QT=- от Август 01, 2007, 07:27
Цитата: "QCasper"
Цитата: "-=QT=-"
он ругался, что нет у него qApp в плагине.


что значит "нет в плагине", и кто именно ругался?


Ругался компилятор при сборке плагина. Но я подразумеваю что все дело
было в  QTranslator translator;


Название: Локализация в плагинах (динамических)
Отправлено: ритт от Август 04, 2007, 02:13
я исходил из принципа, что рядом с плагином не буду таскать кучу мелких бинарничков .qm
//у меня в каждом плагине от силы десяток коротких строк наберётся
сделал трансляшки как обычно и дописал ресурс с путями к бинарничкам
затем в плагине инициализируется ресурс и инсталлю его из плагинменеджера

//   ...
   QString baseName = QFileInfo(fileName).baseName();
   if(baseName.startsWith("lib"))
      baseName.remove(0, 3);

   QPluginLoader loader(fileName);
   if(loader.load())
   {
      QTranslator* translator = 0;
      translator = new QTranslator(qApp);
      if(translator->load(":/translations/"+baseName+"_"+QLocale::system().name()))
         qApp->installTranslator(translator);
   }

   QObject* plugin = loader.instance();
//   ...


пара оговорок: каждый плагин у меня используется в роли фабрики - по запросу создаёт и возвращает сущности с определённым функционалом
loader.instance() приходится использовать после qApp->installTranslator(translator);
если кастится и распознаётся, делаю translator->setParent(plugin), иначе delete translator
таким образом при выгрузке плагина я обеспечиваю убийство транслятора

поправьте, если что не так