Различные языки в разных частях приложения
У меня многоязычное приложение Qt, где у меня есть следующая проблема
- Основная часть пользовательского интерфейса должна быть переведена в соответствии с языком языковой системы
- Приложение также может печатать различные формы. Язык этих форм должен быть независимо выбран с языка пользовательского интерфейса (формы будут переданы людям, которые часто не говорят на местном языке).
- Если возможно, было бы неплохо иметь ту же возможность, что и предыдущая точка, для диалога в приложении.
Каким образом я могу достичь этого? Все примеры, которые я нашел, касаются перевода всего приложения, но в моем случае мне нужны два независимых перевода (хотя возможно, на один и тот же язык).
Нужно ли мне реплицировать механизмы возврата QApplication::translate
самостоятельно и напрямую использовать QTranslator::translate
, или есть более удобный способ?
Ответы
Ответ 1
Предположим, вам нужен один перевод для всего приложения, а другой - для диалога. Вам нужно создать два файла qm: один, который содержит переводы всего, кроме этого диалогового окна, и один, который содержит переводы только для этого диалога. Теперь вы можете загружать/выгружать эти qm файлы отдельно.
Я думаю, вы знаете, как динамически менять перевод.
Обновление от комментария:
Чтобы создать отдельные qm файлы, вы можете поместить все основные источники в один каталог и все источники диалога в другой и вызвать lupdate -no-obsolete -recursive ../src/Form -ts Form_ru.ts
, где ../src/Form
- это каталог диалогов. Или даже звоните lupdate -no-obsolete ../src/Form.ui ../src/Form.cpp ../src/Form.h -ts Form_ru.ts
в файлы.
Результат script будет примерно таким:
lupdate -no-obsolete -recursive ../test.pro -ts test_ru.ts
lupdate -no-obsolete ../Form.ui ../Form.cpp ../Form.h -ts Form_ru.ts
Ответ 2
Поскольку класс QTranslator имеет виртуальную функцию для перевода. Вы можете наследовать от QTranslator и перегружать функцию перевода, чтобы возвращать языковую строку для каждой желаемой локали, в зависимости от флага, установленного в унаследованном классе.
Затем вы устанавливаете флаг в локаль, который хотите использовать непосредственно перед созданием страницы для печати, а затем установите ее после этого.
Ответ 3
Я не уверен, что это вариант, но вы можете разделить ваше приложение на два:
- одно приложение просто распечатает формы
- другое приложение - это графический интерфейс с элементами управления
Таким образом, просто установить язык самостоятельно и перевести оба приложения.