2015-07-16 4 views
2

У моего приложения есть GUI, написанный в Qt QML, и мы успешно интернационализировали его, используя qsTr() и Qt .ts файлов. Теперь мы добавляем стороннюю поддержку плагинов через API qmldir Qt. В файлах .qml плагина qsTr() работает корректно, только если перевод уже находится в файлах .ts главного приложения. Как сторонний автор QML добавляет локализованные строки в свой плагин qmldir?Как локализовать плагин Qt qmldir?

ответ

5

Я создал класс Translator, чтобы организовать и загрузить переводы. У меня есть QVariantMap, который содержит имя и имя языка, а затем, когда я создаю свой Translator, я должен предоставить исходный каталог, поскольку это требование для загрузки переводов. Мой класс также заботится о сохранении в QSettings используемого последнего языка.

Теперь, чтобы ответить на ваш вопрос, вы всегда можете перевести точно так же, как если бы это было обычное приложение на вашем файле проекта вы должны добавить что-то вроде этого:

1 - список всех ваших возможные переводы

TRANSLATIONS = \ 
      translation_sp.ts \ 
      translation_fr.ts 

2 - Запуск LUPDATE для создания фактических файлов перевод

lupdate project.pro 

3 - Запуск lrelease

Перевести с Лингвист и создать фактические переводы. В этом примере, этот шаг будет генерировать translation_sp.qm и translation_fr.qm

4 - Развертывание переводов с плагином

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

5 - Загрузить плагин перевода в приложении

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

qTranslator.load("plugin_XX.qm", "PATH_TO_TRANSLATION_FILE") 
app->installTranslator(qtTranslator); 

Я упростили это в моем классе. Вот файлы header и source моего класса Translator, если вы хотите посмотреть.

А вот как вы его используете:

Translator translator(app.data(), "PATH_TO_TRANSLATION"); 
translator.addTranslation("SP", "plugin_XX.qm"); 
engine.rootContext()->setContextProperty("translator", &translator); 

Вы можете установить несколько переводчиков, поэтому он будет работать для вашего приложения и ваших плагинов. Когда я писал свой класс, я не ожидал появления разных источников, но вы можете изменить его, чтобы каждый раз, когда вы добавляли перевод, для него должен был быть 2-буквенный код, имя файла и путь к нему.

Надеюсь, это поможет!

+0

Мне нравится это решение, потому что оно использует все встроенные i18n Qt. Одним из негативных последствий является то, что плагин будет загружать свой перевод после того, как хост загрузит свой перевод. Qt просматривает переводы в обратном порядке добавления, поэтому плагин имеет право переопределять переводы хоста, если они используют одни и те же строки. Если авторы плагина компетентны, возможно, это нормально, но если они используют более низкие переводы (например, машинный перевод), это наносит вред хосту. –

+0

Вы всегда можете контролировать заказ, скажем, у вас уже есть переводы, тогда вы загружаете плагин, вы можете выгружать все переводы (без отправки сигнала, что-то изменилось), а затем загружать их в том порядке, в котором вы хотите. – iktwo

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