翻译和国际化

QTextBrowser可以处理很多简单的HTML标签,可以使用它来显示标记着基于HTML语法的帮助页。

Qt应用程序和Qt Assistant之间的通信是由QAssistantClient类来处理的,它位于一个单独的库中,使用需要

CONFIG += assistant

使用它的例子

class HelpBrowser
{
 public:
     static void showPage(const QString &page);
     private:
     static QDir directoryOf(const QString &subdir);
     static QAssistantClient *assistant;
}

QAssistantClient *HelpBrowser::assistant=0;
 void HelpBrowser::showPage(const QString &page)
{
 QString path=directoryOf("doc").absoluteFilePath(page);
 if(!assistant)
   assistant=new QAssistantClient("");
 assistant->showPage(path);
}
QDir MainWindow::directoryOf(const QString &subdir)
{
 QDir dir(QApplication::applicationDirPath());
 if(dir.dirName().toLower()=="debug"||dir.dirName().toLower()=="release")
   dir.cdUp();
 dir.cd(subdir);
 return dir;
}

QAssistantClient构造函数接受一个路径字符串作为它的第一个参数,它可以用于定位Qt Assistant可执行文件。通过传递一个空字符串,表示让QAssistantClient在PATH环境变量中查找到执行文件,它的showPage()函数可以接受带一个可选HTML锚点的页面名称。


Qt为翻译人员提供了一个称为Qt Linguist的图形用户界面工具,配上两个通常由应用程序开发人员的命令行语句-lupdate和lrelease就可以为翻译提供完美支持。

QString将字符串存储为Unicode,每一个字符都是一个16位的QChar,为了获得一个QChar的数字值,可以对它调用unicode(),为了获得它的ASCII或者Latin-1的值,则要对它调用toLatinl()。因为程序中所有字符都是ASCII字符,所以可以在toLatinl()的返回值上使用isdigit(),isspace()这样的标准<cctype>函数。

QTextStream对于读取和写入都使用系统的本地8位编码格式,通过QTextCodec::codecForLocale()函数获得。UFT-16是一种为每个字符都使用两个字节存储的格式,它在内存中的表现形式和QString一致。QTextCodec是一个可以在Unicode和给定编码之间进行转换的对象,Unicode也支持UTF-8,它是ASCII的一个超集。可以使用QTextCodec::codecForName()函数设置适当的编码格式。

默认情况下,Qt会把tr()的参数当做Latin-1,为了改变,可以调用QTextCodec::setCodecForTr()来设置。这个调用必须在第一次使用tr()之前完成。当在const char *和QString之间进行转换的时候,可以通过调用QTextCodec::setCodecForCStrings()来让Qt使用某种特殊的编解码器。tr函数的原型为

QString QObject::tr(const char* sourceText,const char* disambiguation=Q_NULLPTR,int n=-1)

第二个参数是消除歧义字符串,一般使用类名或者部件名,第三个参数n是表明是否使用了复数,因为英文单词中复数一般要在单词末尾加s

要在项目文件中生成指定的.ts文件,每一种翻译语言对应一个.ts文件,那么需要添加

TRANSLATIONS = yourname.ts

对于加速键的值使用QKeySequence()函数,如果使用硬编码,那么翻译将无法覆盖它。

对于非Qt类,如果要支持翻译,需要在类定义的开始使用Q_DECLARE_TR_FUNCTIONS()宏,如:

class MyClass
{
 Q_DECLARE_TR_FUNCTIONS(MyClass)
 ...
};

对于静态字符串数组,为了能够翻译它,必须使用QT_TR_NOOP()宏标记它,宏只是简单的返回它的参数,但是lupdate将会提取所有包含在QT_TR_NOOP()中的字符串,还有一个QT_TRANSLATE_NOOP()宏,它的特别是还带有一个上下文参数,用于在类之外初始化它的变量时显得有用。

可以告诉Qt禁止从const char* 到QString的隐式转换。通过在包含任意的Qt头文件之前预定义QT_NO_CAST_FROM_ASCII预处理符号,就可以实现这一点。最简单的方式是在.pro中设置

DEFINES += QT_NO_CAST_FROM_ASCII
Qt包含了一个QLocale类,它可以用来提供本地化的数字和日期以及时间格式,要查询其他与本地相关的特定信息,可以使用标准C++中的setLocal()和localeconv()函数。QString::localeAwareCompare()使用与本地设置相关的方式比较两个字符串,在对用户的可见项进行排序的时候,它非常有用。


猜你喜欢

转载自blog.csdn.net/weixin_38893389/article/details/81035901