Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: 8Observer8 от Октябрь 02, 2014, 13:08



Название: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 13:08
Привет!

Я ожидаю, что слово "Hello" переведётся на русский, но этого не происходит.

В книге Шлее и в этой статье (http://habrahabr.ru/post/51319/) прочитал о переводе и проделал следующее:

- написал такой код:
Код
C++ (Qt)
#include <QApplication>
#include <QLabel>
#include <QTranslator>
#include <QDir>
 
int main( int argc, char *argv[] )
{
   QApplication app( argc, argv );
 
   QTranslator myTranslator;
   myTranslator.load( QDir::currentPath() + "/main_ru.ts" );
   app.installTranslator( &myTranslator );
 
   QLabel label( QObject::tr( "Hello" ) );
   label.show();
 
   return app.exec();
}
 

- получил файл main_ru.ts с помощью команды:
Код:
lupdate main.cpp -ts main_ru.ts

- открыл файл "main_ru.ts" и написал перевод:
Код:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
    <name>QObject</name>
    <message>
        <location filename="main.cpp" line="9"/>
        <source>Hello</source>
        <translation>Привет</translation>
    </message>
</context>
</TS>

Запускаю программу и по-прежденему вижу "Hello"

P.S. Пробовал открывать файл "main_ru.ts" с помощью "Qt Linguist", но он ругается: "Encountered incorrectly encoded content"


Название: Re: Перевод с английского на русский
Отправлено: Old от Октябрь 02, 2014, 13:22
А где запуск lrelease?
И в транслятор нужно загружать не .ts (это исходник), а .qm


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 13:33
Запустил:
Код:
lrelease i18n.pro

Такое выдаёт:
Цитировать
lrelease error: Parse error at C:/Users/Ivan/GoogleDrive/Qt/i18n/i18n/main_ru.ts:1:38: Encountered incorrectly encoded content.


Название: Re: Перевод с английского на русский
Отправлено: Old от Октябрь 02, 2014, 13:34
Запустил:
Код:
lrelease i18n.pro
Но зачем?  :)


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 13:40
Я сначала просто запустил lrelease и вывелось сообщение:
Цитировать
Usage:
    lrelease [options] project-file
Вот я и решил, что после этой команды должен появиться ".qm" файл. Разве нет?


Название: Re: Перевод с английского на русский
Отправлено: OKTA от Октябрь 02, 2014, 13:48
Возьми лингвист, а то править руками конфигурационный файл, который должен быть в одной кодировке, а твой редактор сохранит в черт знает какой, сомнительно  :P


Название: Re: Перевод с английского на русский
Отправлено: alex312 от Октябрь 02, 2014, 13:56
Вот я и решил, что после этой команды должен появиться ".qm" файл. Разве нет?
слушай, ты ж привел ссылку на статью с хабра. Ты ее вообще читал?


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 14:05
Удалил файл "main_ru.ts" и ввёл команду:
Цитировать
lupdate main.cpp -ts main_ru.ts

Открыл "Qt Linguist". Открыл из него файл "main_ru.ts". Написал русский перевод. Выбрал в меню "Release". Изменил строку кода:
Код
C++ (Qt)
myTranslator.load( QDir::currentPath() + "/main_ru.qm", "." );
 

Работает! Всем большое спасибо!

P.S. У Шлее написано, что надо использовать lrelease (написано она лучше сжимает). Как я понял, лучше редактировать в "Qt Linguist", а сжимать из командной сроки с помощью lrelease


Название: Re: Перевод с английского на русский
Отправлено: OKTA от Октябрь 02, 2014, 14:06
а тебе не кажется, что лингвист и использует lrelease?  ;D


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 14:15
слушай, ты ж привел ссылку на статью с хабра. Ты ее вообще читал?
Читал, но нечего не понял, а вот по книге разобрался.

а тебе не кажется, что лингвист и использует lrelease?  ;D
Так в книге написано:
(http://i6.pixs.ru/storage/7/4/5/378png_8292115_14080745.png)


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 14:29
Затык был в том, что Far сохранил файл ".ts", после редактирования, в какой-то кодировке, видимо.


Название: Re: Перевод с английского на русский
Отправлено: OKTA от Октябрь 02, 2014, 14:32
Мда, странный перевод, если сказано, что для получения QM файлов можно использовать lupdate  ;D


Название: Re: Перевод с английского на русский
Отправлено: kambala от Октябрь 02, 2014, 14:45
QDir::currentPath() возвращает т.н. «рабочую папку». лучше используй qApp->applicationDirPath()


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 15:05
Мда, странный перевод, если сказано, что для получения QM файлов можно использовать lupdate  ;D
Может в книге ошибка?

QDir::currentPath() возвращает т.н. «рабочую папку». лучше используй qApp->applicationDirPath()
Разница между ними в том, что одна возвращает "build-i18n-Desktop_Qt_5_3_2_MinGW_32bit-Debug", а другая "build-i18n-Desktop_Qt_5_3_2_MinGW_32bit-Debug/debug". А я то подумал, что она вернёт путь, где ".cpp" лежат...


Название: Re: Перевод с английского на русский
Отправлено: OKTA от Октябрь 02, 2014, 15:33
Может в книге ошибка?
Вероятно ошибка, как и то предположение, что лингвист не использует в своей работе lrelease. Переписывать дважды один код? не, спасибо  ;D


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 16:00
Классная штука это "Лингвист"!

Я ввёл такую команду:
Код:
lupdate Dialog.ui -ts Dialog_ru.ts

Открыл ".ts" с помощью "Лингвист" и он показал форму. Очень удобно переводить!

Кстати, переводы лучше в ресурсах хранить, чтобы не указывать путь так: qApp->applicationDirPath()


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 16:24
На диалоге есть кнопка при нажатии на которую - появляется сообщение. Для диалога создаётся файл "Dialog_ru.qm" из Dialog.ui, а из "Dialog.cpp" создаётся файл "Dialog_cpp_ru.qm". Но похоже этот код неверен:
Код
C++ (Qt)
 
#include <QTranslator>
#include <QApplication>
#include "Dialog.h"
 
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
 
   QTranslator translator;
   translator.load( ":/Dialog_ru.qm", "." );
   translator.load( ":/Dialog_cpp_ru.qm", "." );
   app.installTranslator( &translator );
 
   Dialog w;
   w.show();
 
   return app.exec();
}
 


Название: Re: Перевод с английского на русский
Отправлено: OKTA от Октябрь 02, 2014, 16:27
Для каждого файла перевода надо отдельный объект QTranslator создавать. Иначе будет использоваться последний загруженный через load.


Название: Re: Перевод с английского на русский
Отправлено: 8Observer8 от Октябрь 02, 2014, 16:57
Спасибо! Значит в книжке ошибка:
(http://i6.pixs.ru/storage/0/8/5/379png_9559985_14084085.png)


Название: Re: Перевод с английского на русский
Отправлено: kambala от Октябрь 02, 2014, 17:03
Кстати, переводы лучше в ресурсах хранить, чтобы не указывать путь так: qApp->applicationDirPath()
спорное утверждение. в таком случае для обновления перевода придется отправлять бинарник, а не только новый файл перевода.


Название: Re: Перевод с английского на русский
Отправлено: torwig от Октябрь 03, 2014, 10:23
п.с. 8Observer8, Вы просто жесткий  :) С такой легкостью печатаете "В книге ошибка!!!!!111111"


Название: Re: Перевод с английского на русский
Отправлено: OKTA от Октябрь 03, 2014, 10:34
лично у меня отказывалось работать, когда я несколько файлов qm загружал в один транслятор. Если не прав, поправьте и аргументируйте кодом  ;)


Название: Re: Перевод с английского на русский
Отправлено: Hellraiser от Октябрь 03, 2014, 11:31
За 5-ю версию не скажу, но вот цитата для 4.8:
Цитировать
The previous contents of this translator object are discarded
Т.е. в 4.8 в один объект транслятора 2 перевода не загрузишь.


Название: Re: Перевод с английского на русский
Отправлено: kambala от Октябрь 03, 2014, 13:03
в книжке ошибка, факт


Название: Re: Перевод с английского на русский
Отправлено: Hellraiser от Октябрь 03, 2014, 13:30
В книге Шлее ошибок более чем достаточно.