Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QTranslator, QString и кодировки...


Автор: sergey_85 21.5.2010, 08:10
Привет!

Столкнулся с проблемой при добавлении многоязычности в приложение.

делаю ручной перевод (без tr, т.к. надписи и названия кнопок будут динамические)

делаю так:
Код

  QTranslator trans;
  bool isOk = trans.load("имя_файла_перевода"); //true
   ...

далее, загружаю динамически массив строк для перевода из файла, сливаю все это в QStringList
и затем пытаюсь сделать перевод этих строк через мой QTranslator

Код

QStringList baseWords; //загруженные слова, требующие перевода
QStringList transWords; //здесь будет лежать перевод этих слов, найденных в файле перевода через QTranslator

for(int i=0; i<baseWords.count(); i++)
{
  transWords.append( trans.translate("", baseWords[i].toAscii()) ); //здесь находится перевод слова
}



...и вот тут начинает весь прикол, если в ф-цию translate(...)  в параметре приходит английское слово, например Hello или Privet, то тогда перевод происходит без проблем возвращается перевод на русский к примеру Привет, НО вот если на вход translate(...) приходит русское слово, например Привет, то во-первых, параметр baseWords[i].toAscii() даёт мусор, а перевод не находиться, хотя слово перевода в файле там 100% есть!!!

в main у меня стоят следующие кодеки:
Код

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("windows-1251"));


...еще дополню, что слова для перевода грузятся из файла в кодировке в utf-8, а файл перевода qm в кодировке utf-8

Может кто сталкивался с такой проблемой, думаю что проблема у меня с кодировкой, но где???

использую Qt4.4.3

Спасибо за помощь!



Автор: _GRIN_ 22.5.2010, 15:48
1.
Цитата
QString QTranslator::translate ( const char * context, const char * sourceText, const char * disambiguation = 0 ) const   [virtual]
Returns the translation for the key (context, sourceText, disambiguation). If none is found, also tries (context, sourceText, ""). If that still fails, returns an empty string.

следовательно раз на выходе
Цитата
даёт мусор

значит перевод дейстительно 100% есть и он найден и дело в кодировке smile

2.
Цитата
QTextCodec::setCodecForTr(QTextCodec::codecForName("windows-1251"));

Цитата
делаю ручной перевод (без tr, т.к. надписи и названия кнопок будут динамические)

Цитата
void QTextCodec::setCodecForTr ( QTextCodec * c )   [static]
Sets the codec used by QObject::tr() on its argument to c. If c is 0 (the default), tr() assumes Latin-1.
If the literal quoted text in the program is not in the Latin-1 encoding, this function can be used to set the appropriate encoding. For example, software developed by Korean programmers might use eucKR for all the text in the program, in which case the main() function might look like this:
 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     QTextCodec::setCodecForTr(QTextCodec::codecForName("eucKR"));
     ...
 }
Note that this is not the way to select the encoding that the user has chosen. For example, to convert an application containing literal English strings to Korean, all that is needed is for the English strings to be passed through tr() and for translation files to be loaded. For details of internationalization, see Internationalization with Qt.

т.е. так как tr() не используется, то данная настройка кодека ни к чему.

3.По идее установка кодека для С-строк должна правильно настроить QString::toAscii()
Цитата
QByteArray QString::toAscii () const
Returns an 8-bit ASCII representation of the string as a QByteArray.
If a codec has been set using QTextCodec::setCodecForCStrings(), it is used to convert Unicode to 8-bit char; otherwise this function does the same as toLatin1().

но может быть установка кодека не сработала по какой-либо причине.

Я советую попробывать QString::toUtf8() вместо QString::toAscii(). Правда сам с таким не сталкивался, а проверить времени нет.

З.Ы.
Имхо отказ от tr() оправдан только в случае если в процессе эксплуатации добавляется перевод. Если же все строки так и так забиты в коде, то отказ от tr() не оправдан.
Честно говоря интересно подробнее узнать о причине отказа от tr()
smile

Автор: sergey_85 23.5.2010, 13:21
почему отказался от tr(...) т.к. в программе динамический перевод, немного скажу, динамически грузиться gui (через ui loader), затем грузиться файл перевода и вот так вот идет перевод, фай перевода идет вместе с gui формой..

проблему пока не решил, как что так сразу напишу.

спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)