Qt国际化
来自KlniuWiki
- 所有用户可视的文本都使用 QString。
- 字面文本都使用 tr()。
- 有时在定义某些变量中使用的字符 串,不能使用上述方法,但是为了让Qt提取并翻译该字符串,必须用 某种方法标志出 来。Qt 定义了 QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 来标志它们。前者用于单个字符串,后者用于多个字符串。比如:
QStringList stringsList; stringList << QT_TR_NOOP( "Hello" ) << QT_TR_NOOP( "World" );
- 非Qt QObject类不能直接使用 tr() 函数,需要使用 Q_DECLARE_TR_FUNCTIONS 宏来声明类。
class MyClass { Q_DECLARE_TR_FUNCTIONS(MyClass) public: MyClass(); ... };
- 快捷键使用 QKeySequence()
exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcuts(QKeySequence::Quit);
- 动态文本使用 QString::arg()
void FileCopier::showProgress(int done, int total, const QString ¤tFile) { label.setText(tr("%1 of %2 files copied.\nCopying: %3").arg(done).arg(total).arg(currentFile)); }
- 参数顺序:
QString s1 = "%1 of %2 files copied. Copying: %3"; QString s2 = "Kopierer nu %3. Av totalt %2 filer er %1 kopiert."; qDebug() << s1.arg(5).arg(10).arg("somefile.txt"); qDebug() << s2.arg(5).arg(10).arg("somefile.txt");
- 输出:
5 of 10 files copied. Copying: somefile.txt Kopierer nu somefile.txt. Av totalt 10 filer er 5 kopiert.
- 为工程文件 xxx.pro 添加 TRANSLATIONS 入口。
HEADERS = funnydialog.h \
wackywidget.h
SOURCES = funnydialog.cpp \
main.cpp \
wackywidget.cpp
FORMS = fancybox.ui
TRANSLATIONS = xxx_zh.ts \
xxx_fi.ts \
xxx_no.ts \
xxx_se.ts
- lupdate xxx.pro, 产生xxx_ll_CC.ts TS文件
- lrelease xxx.pro, 产生xxx_ll_CC.qm QM文件
- 加载翻译文件
int main(int argc, char *argv[]) { QApplication app(argc, argv); QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); QTranslator myappTranslator; myappTranslator.load("xxx_" + QLocale::system().name()); app.installTranslator(&myappTranslator); ... return app.exec(); }
参见
- Qt学习笔记--国际化. 姜坤. 2010-07-11 07:27.
- Qt 国际化编程. 于明俭. 2002 -01-09.