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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTranslator не переводит  (Прочитано 7690 раз)
TrimS
Гость
« : Февраль 05, 2014, 12:40 »

Есть глобальная текстовая переменная. Пытаюсь её перевести на другой язык - не переводится ничего. Грустный
Минимальный тестовый пример:
Код:
QString aaa = QObject::tr(QT_TR_NOOP("Hello"));

int MainFunc( int argc, char *argv[] )
{
QApplication app(argc, argv);

QTranslator translator;
bool is = translator.load("appcenter_ru.qm", app.applicationDirPath());
QApplication::installTranslator(&translator);

QLabel lbl(aaa);
lbl.show();

return app.exec();
}
Файл перевода лежит рядом с бинарником, переменная is равна true. Тоесть всё сделал правильно.
Не переводит!
В чём может быть причина и как сделать, чтобы переводило?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Февраль 05, 2014, 12:47 »

Дык, элементарно же - строка aaa, создаётся до translator.
И зачем там QT_TR_NOOP Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
TrimS
Гость
« Ответ #2 : Февраль 05, 2014, 13:01 »

Спасибо! Точно, проблема в том, что он создаётся до строки.
Но тогда получается, что невозможно использовать глобальные строковые константы - ибо если даже транслятор сделать глобальным - то это не даст гарантию, что он проинициализируется первым.
Как обычно эта проблема решается в рамках Qt? Согдаётся отдельная функция, которая инициализирует глобальные переменные?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Февраль 05, 2014, 13:05 »

Как обычно эта проблема решается в рамках Qt?
А причём здесь Qt Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
TrimS
Гость
« Ответ #4 : Февраль 05, 2014, 13:59 »

Как при чём Qt? При том, что обычные походы работы с глобальными переменными не работают. К примеру:
Код:
QString aaa;

void initdd()
{
aaa = QObject::tr("Hello");
}

int MainFunc( int argc, char *argv[] )
{
QApplication app(argc, argv);

DDDDD ddd(&app);
initdd();

QPushButton button(aaa);
bool c1 = QObject::connect(&button, SIGNAL(pressed()), &ddd, SLOT(ChangeLang()));
button.show();

return app.exec();
}
Код:
class DDDDD : public QObject
{
Q_OBJECT

public:
DDDDD(QObject *parent = 0);
DDDDD(QApplication* app_);
~DDDDD();

public slots:
void ChangeLang();

private:
QTranslator translator;
QApplication* app;
};

void DDDDD::ChangeLang()
{
bool is = translator.load("appcenter_ru.qm", app->applicationDirPath());
app->installTranslator(&translator);
}

При таком раскладе не переводится текст кнопки при клике. Хотя (!) транслятор создан до присвоения значения к aaa. Вопрос в том как работать с глобальными строковыми переменными, которые требуют перевода?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Февраль 05, 2014, 14:05 »

Хм..., как всё запущено.
Т.е. то, что загрузка словаря делается после вызова транслятора значения совсем не имеет Непонимающий
И откуда взялась уверенность, что после загрузки все строки автоматом перегрузятся?
« Последнее редактирование: Февраль 05, 2014, 14:07 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
TrimS
Гость
« Ответ #6 : Февраль 05, 2014, 15:11 »

Ну.....стараюсь разобраться.

Время загрузки словаря имеет значение? Хм, пока не видел об этом примечания в доке.
Уверенность оттуда, что формально я выполнил все требования - обернул строку, создал транслятор, загрузил, установил - по идее должно перевести, по крайней мере я не нашёл информации, что что-то ещё надо сделать.

А как же тогда делать перевод приложения при выборе в пункте меню языка? Если не ошибаюсь Qt позволяет сделать такой финт.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #7 : Февраль 05, 2014, 16:28 »

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

креатор подставляет новый перевод после перезапуска. но можно делать и динамически: для этого нужно загружать другой файл перевода и повторно присваивать строки
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Февраль 05, 2014, 16:55 »

Время загрузки словаря имеет значение? Хм, пока не видел об этом примечания в доке.
Уверенность оттуда, что формально я выполнил все требования - обернул строку, создал транслятор, загрузил, установил - по идее должно перевести, по крайней мере я не нашёл информации, что что-то ещё надо сделать.
С чего это должно, если транслятор был задействован после создания строки Непонимающий
И что такое "обернул строку"?

Цитировать
А как же тогда делать перевод приложения при выборе в пункте меню языка? Если не ошибаюсь Qt позволяет сделать такой финт.
Динамический перевод.

значения статических переменных вычисляются до входа в main()
Наверное, следует сказать, что это верно при объявлении переменной в главном скопе файла)
Записан

Qt 5.11/4.8.7 (X11/Win)
TrimS
Гость
« Ответ #9 : Февраль 05, 2014, 21:46 »

Спасибо, понял.
Жаль, что кучу работы нужно делать руками - кроме переинициализации глобальных переменных ещё и переопределять все GUI классы с отловом QEvent::LanguageChange и переустановкой текста.
Мне казалось, что Qt механизм в этом плане более продвинутый, а так он предоставляет только самые базовые примитивы транслятора.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Февраль 06, 2014, 14:30 »

Чтобы иметь "такой продвинутый Qt механизм" нужно как минимум каким-то образом взаимно связать QString с QTranslator и не терять эту связь при копировании.
Такие сложности никому не нужны.
К тому же на лету менять язык основной массе не нужно.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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