2012-01-19 4 views
3

Qt lupdate и строки строк группы QTranslator в исключительных контекстах. Это означает, что перевод, определенный в одном контексте, не будет доступен в другом контексте.Автоматизация пользовательских контекстов QTranslator

Контекст по умолчанию в C++ - это имя класса, который переопределил QObject::tr(). Контекст по умолчанию внутри декларативного QML - это текущее имя файла без расширения. Чтобы переопределить контекст перевода, можно использовать qApp->translate("context", "source") или qsTranslate("context", "source") в C++ или QML.

Я хочу, чтобы иметь возможность использовать один общий контекст трансляции в большом проекте, и я нахожу, что определение контекста перевода с каждой функцией перевода очень утомительно. Есть ли существующие или будущие расширения каркаса перевода Qt, которые упростили бы эту задачу? Я ищу что-то, что было бы так же просто, как tr("source") и qsTr("source"), но используйте общесистемный или общий по умолчанию контекст по умолчанию. Есть идеи?

ответ

0

Есть что-то более легкое, чем это. Используйте qtTrId/qsTrId (Qt/QML) вместо tr/qsTr и добавьте параметр -idbased в ваши lrelease-вызовы. Перевод на основе ID не имеет никакого контекста.

+0

Кажется, что это хорошо работает, спасибо! «ID» может быть сложной строкой с пробелом и некоторой пунктуацией, но она не отображается в лингвисте. Вместо этого перед вызовами 'qTTrId()'/'qsTrId()' нужно добавить специальные комментарии ''%% исходного текста ''. ... или написать сценарий для автоматической копирования строки ID в исходный тег. :) Надеюсь, мне не понадобится контекстное разделение по дороге. – Igor

2

Вы можете использовать Q_DECLARE_TR_FUNCTIONS() макросъемки, примененные к определению класса, который действует исключительно в контексте:

class CONTEXT_CLASS { 
    Q_DECLARE_TR_FUNCTIONS(CONTEXT_CLASS) 
}; 

где CONTEXT_CLASS может быть столь же коротким, как вы хотели бы, скажем, X (в надежде который не конфликтует ни с чем другим в вашем коде). Это сделало бы ваш Tr() ЗАЯВЛЕНИЯМИ

X::tr("source"); 

Не пытайтесь #define что-то, чтобы сократить X :: тр, так что не будет подхвачено инструментом перевода.

+0

Прохладный спасибо! Это идеально подходит для компонентов C++. Есть ли способ распространить это на QML? – Igor