Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: SABROG от Март 27, 2007, 12:21



Название: Перевод интерфейса на другие языки
Отправлено: SABROG от Март 27, 2007, 12:21
Такой вопрос, есть файлик в Qt с переводом на русский разных отладочных сообщений и т.п. Как в программе определить текущую локаль в XP и заставить интерфейс показывать переведенные сообщения ? Читал секцию Internationalization with Qt но так и не понял куда чего надо прописать.


Название: Перевод интерфейса на другие языки
Отправлено: evilguard от Март 27, 2007, 13:15
если ты имеешь в виду мессадж боксы, то
Код:

QApplication a(argc, argv);

QTranslator * qt_translator = new QTranslator;
if ( !qt_translator->load( "qt_ru.qm" ) )
{
delete qt_translator;
return false;
}
a.installTranslator( qt_translator );

Файлик qt_ru.qm кладешь в папку с проектом.


Название: Перевод интерфейса на другие языки
Отправлено: SABROG от Март 27, 2007, 13:18
Это ведь насильный перевод на русский или он будет показываться в зависимости от локали ?


Название: Перевод интерфейса на другие языки
Отправлено: noosooth от Март 27, 2007, 13:26
Вероятно вот так:
Код:

   ...
   QApplication app(argc, argv);
   QString app_locale = QLocale::system().name();

   QTranslator app_translator, qt_translator;
   QString dir = "путь к файлам трансляции"  

   if( app_translator.load("app_" + app_locale,  dir))
      app.installTranslator(&app_translator);

   if( qt_translator.load("qt_" + app_locale, dir));
      app.installTranslator(&qt_translator);
   


Название: Перевод интерфейса на другие языки
Отправлено: SABROG от Март 27, 2007, 14:08
Интересно, а в ресурсы впихнуть нельзя эти файлы трансляции.

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

 Я собираю программу с ключем CONFIG += console чтобы видеть отладочные сообщения, когда я сам пытаюсь впихнуть отладочную информацию, то получаю текст в неверной кодировке, почему ?

Код:

//выводим текущую дату и время
qDebug() << qApp->tr(QDateTime::currentDateTime().toString().toAscii())


(http://img100.imageshack.us/img100/2651/qdebugob6.jpg)

Как заставить tr() не обрамлять текст кавычками ?


Название: Перевод интерфейса на другие языки
Отправлено: alexis от Март 27, 2007, 14:30
Это не tr() обрамляет, а оператор << на qDebug


Название: Перевод интерфейса на другие языки
Отправлено: Mixolap от Март 27, 2007, 15:01
В ресурсы впихнуть можно, тогда файл ресурсов будет выглядеть следующим образом:
   <qresource prefix="/translations" >
        <file>translations/repdesigner_ru.qm</file>
   </qresource>   

А загрузка:
   QTranslator translator;    
   QString translationFile = ":/translations/translations/repdesigner_"+QLocale::system().name().left(2)+".qm";       
   translator.load( translationFile );
   app.installTranslator( &translator );


Название: Перевод интерфейса на другие языки
Отправлено: SABROG от Март 27, 2007, 16:15
Mixolap, спасибо, теперь я познал технологию использования файловой системы ресурсов :)

noosooth: в чем разница между app_ и qt_ префиксами ?

Не знаете почему кириллица в консоли козябрами выводится ?


Название: Перевод интерфейса на другие языки
Отправлено: noosooth от Март 27, 2007, 17:54
Цитата: "SABROG"
noosooth: в чем разница между app_ и qt_ префиксами ?

Ммм... видимо в буквах? ;)

Я попытался привести пример, где:
app_xx.qm - translation files для нашего (Вашего) приложения.
qt_xx.qm - translation files собственно самого Qt'а.


Название: Перевод интерфейса на другие языки
Отправлено: Sergey B. от Март 27, 2007, 18:39
Цитата: "SABROG"
Mixolap, спасибо, теперь я познал технологию использования файловой системы ресурсов :)

noosooth: в чем разница между app_ и qt_ префиксами ?

Не знаете почему кириллица в консоли козябрами выводится ?


CP866


Название: Перевод интерфейса на другие языки
Отправлено: SABROG от Март 27, 2007, 19:48
"IBM 866" ?

Я пробывал вариант

Код:

QTextCodec::setCodecForCStrings( QTextCodec::codecForName("IBM 866") );


Но похоже я чего-то не догоняю. Исходники хранятся в utf8, надо вывести русский текст utf8 в отладочную консоль в cp866 ?

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

 И потом все-таки Qt кросплатформ и я хочу чтобы так оно и оставалось для моей программы, т.е. я хочу автоопределение локали и вывод текста в соответствующей кодировке, в linuxe обычно никто не ставит cp866...


Название: Перевод интерфейса на другие языки
Отправлено: Вудруф от Март 28, 2007, 08:59
Нет, CP866 - это DOS-кодировка.


Название: Перевод интерфейса на другие языки
Отправлено: SABROG от Март 28, 2007, 12:29
Да я знаю что это досовская кодировка для русского языка.
Но в консоли *nixaх используется что угодно, но не cp866, поэтому перекодировать вывод только для винды глупо. Вот я и хочу узнать как в зависимости от локали консоли сделать верную кодировку.


Название: Перевод интерфейса на другие языки
Отправлено: Вудруф от Март 28, 2007, 13:20
Не мудри и используй tr. Или setCodecForCStrings - где указывать надо кодек для исходных файлов. Вывод-то всё равно в Unicode идёт. Или для qDebug это не работает?


Название: Перевод интерфейса на другие языки
Отправлено: SABROG от Март 28, 2007, 15:58
tr нужен только если программа может перевести переданную фразу в язык текущей локали, при этом она ничего не знает о кодировке. Я перенаправил вывод qDebug в файл и хоть в него текст передается в кодировке utf8 в файле он в неизвестной мне кодировке:
Цитировать

[28.39.07 14] [D] I?eaao ie?


Здесь "I?eaao ie?" - "Привет мир"

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

 В общем пока вот чего я добился:

- исходники сохраняю в формате "KOI8-R" (в винде)
- вставляю
QTextCodec::setCodecForCStrings( QTextCodec::codecForName("KOI8-R") );
- получаю на выходе русский текст в кодировке utf8 O.o


Название: Перевод интерфейса на другие языки
Отправлено: Вудруф от Март 29, 2007, 10:27
О том речь и шла: вместо мифического IBM 866 нужно было указать Windows-1251 и не надо было бы менять кодировку исходников.
codecForCString указывает кодировку исходных строк, из которых потом преобразовываются в UNICODE, а при выводе они уже сами как надо конвертятся.
А tr нужен и для того, чтобы вообще ничего кроме латиницы в тексте программы не использовать. В таком случае проблем с кодировкой возникать не будет.


Название: Перевод интерфейса на другие языки
Отправлено: SABROG от Март 29, 2007, 10:45
Не работает указывание "Windows-1251", как ни старался, а в UTF-8 исходники компилятор не принимает. Но я уже решил свою проблему через

QString::fromLocal8Bit(msg)


Название: Перевод интерфейса на другие языки
Отправлено: WW от Апрель 09, 2007, 18:21
У меня так заработало:
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());