2013-05-02 3 views
13

У меня есть многоязычный Qt приложения, где у меня есть следующая проблемаРазличные языки в различных частях приложения

  1. Большая часть пользовательского интерфейса должны быть переведены в соответствии с языком локали системы
  2. Заявка также могут печатать различные формы. Язык этих форм должен быть независимо выбран с языка пользовательского интерфейса (формы будут переданы людям, которые часто не говорят на местном языке)
  3. Если возможно, было бы неплохо иметь такую ​​же возможность, как и предыдущий point также для диалога в приложении.

Каким образом я могу достичь этого? Все примеры, которые я нашел, касаются перевода всего приложения, но в моем случае мне нужны два независимых перевода (хотя, возможно, на один и тот же язык).

Мне нужно было скопировать механизмы падения назад QApplication::translate и использовать QTranslator::translate напрямую, или есть более удобный способ?

+0

Во время печати вы не можете загрузить и установить желаемый язык, выполнить печать, а затем установить ее обратно в системный язык? – TheDarkKnight

+0

@ Merlin069: Это может сработать, но не будет выглядеть красиво, потому что это также вызовет повторный перевод всего пользовательского интерфейса (дважды!), Когда вы что-то напечатаете. –

ответ

5

Предположим, вам нужен один перевод для всего приложения, а другой для диалога. Вам нужно создать два файла 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 на файлы.

В результате сценарий будет что-то вроде этого:

lupdate -no-obsolete -recursive ../test.pro -ts test_ru.ts 
lupdate -no-obsolete ../Form.ui ../Form.cpp ../Form.h -ts Form_ru.ts 
+0

Любые подсказки о том, как создавать эти отдельные файлы .qm (или соответствующие файлы .ts)? –

+0

Конечно. Вы можете поместить все основные источники в один каталог, а все источники диалога - в другой, и вызовите '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' файлы. В результате скрипт будет выглядеть примерно так: 'lupdate -no-obsolete -recursive ../test.pro -ts test_ru.ts lupdate -no-obsolete ../Form.ui ../Form.cpp. ./Form.h -ts Form_ru.ts ' – Amartel

1

Поскольку класс QTranslator имеет виртуальную функцию для перевода. Вы можете наследовать от QTranslator и перегружать функцию перевода, чтобы возвращать строку языка для каждой требуемой локали, в зависимости от установленного вами флага в унаследованном классе.

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

+0

Вы имеете в виду установку всех возможных переводов в приложение, а затем пусть класс QTranslator (производный) решит, должен ли он быть активным в переводе или нет? –

+0

Нет, загрузите перевод, необходимый при выборе языкового стандарта для печати. Если у вас есть только небольшое количество языков для работы, я думаю, вы можете загрузить их все в памяти. – TheDarkKnight

0

Я не уверен, что это вариант, но вы можете разбить приложение на две части:

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

Таким образом, , просто установить язык самостоятельно и перевести оба приложения.

Смежные вопросы