QT---之QLocal概念

基于Qt进行国际化功能的开发,主要问题是要搞清楚Locale这个概念。

Locale的概念


在计算机技术中,Locale是一个参数集,用于定义用户语言、国家(或地区)以及其他在用户界面中可见的与语言和国家相关的特性,比如日期表示、货币表示等。为了分别不同Locale,一个Locale对象会有一个ID来表示它,这个ID至少包括语言ID和地区ID。在POSIX系统中,Locale ID的表示格式如下:

[language[_territory][.codeset][@modifier]]

比如,澳大利亚英语采用UTF-8编码的Locale ID就是en_AU.UTF-8

注意,Locale一般被使用在如何格式化输出上,所以Locale不会包含时区和夏令时的信息。

在POSIX系统中,可以使用locale命令,查看locale对象相关信息。

QLocale的使用


Qt中有QLocale对象,封装了Locale的属性和方法,主要用来在不同语言下,实现各种数字与表达它们的字符串之间的转换。

QLocale对象通过language/country来初始化,其中所有的language和country都有对应enum数据与之对应。如果使用QLocale的默认构造函数,则QLocale对象会使用系统的Loacle设置;当然用户可以调用QLocale::setDefault()静态函数来修改默认的QLocale。

前面讲到QLocale对象的初始化会用到语言/国家,如果输入的国家和语言都存在,则使用之,如国家不存在或者是AnyCountry,则实际上会使用跟这个语言最合适的国家,比如Germany for German,如果两者都不存在,则使用默认locale。

可能你会很好奇Locale对象到底在什么时候被使用呢?其实很多字符串函数都偷偷使用了它,比如QString::toInt()和QString::toDouble()。这两个函数函数还很有意思,如果你使用了默认的locale,那么如果该函数使用它失败,则会fall back到"C" locale。

这里有牵出另一个问题,什么是"C" locale?它其实等同于English/UnitedStates。

QT中日期和时间


Qt中有QDateTime,QDate和QTime来表示日期是时间,当要显示他们时,一般都要转化成QString,如QString QDateTime::toString()。这里有两个重载函数,第一个函数toString(const QString & format)中参数是描述了显示格式的QString,比如"dd.MM.yyyy",这个字符串也可以从QLocale::dateTimeFormat()中获得;另一个函数toString(Qt::DateFormat format),参数是Qt预先定义好的格式。

对于日期和时间的格式,除非自己定义格式字符串,一般而言,返回的时间字符串都是跟loacle的设置有关(包括系统loacle和application的locale)。比如即使在英文软件中,如果你的locale是中文(中国)的,那么返回的字符串中是有中文的。比如“2012年5月3日”。可能会很奇怪,即使在你的机器中没有中文翻译文件,他也能返回有关时间的中文字符串,这是因为在qlocale_data_p.h文件中,已经将基本的中文单词用unicode码表示了,具体请见文件中的几个数组date_format_data,time_format_data、months_data、days_data、am_data和pm_data,他们为各个语言和国家预先定义了有关时间字符的unicode码。

猜你喜欢

转载自blog.csdn.net/weixin_39609623/article/details/82797874