定义
locale 语言环境是特定于文化的一组功能,程序可以使用这些功能在国际上移植。在C++中,语言环境由语言环境类的对象表示。 这些语言环境对象中的每一个都包含使用一组依赖于区域性的功能所需的所有信息。 但是语言环境对象本身并不直接包含功能作为成员函数:而是,语言环境对象包含有关其选择哪个构面对象的信息,并且是将这些特定构面实现为成员函数的这些构面对象中的每一个。 这允许使用相同的构面对象共享多个语言环境共有的功能,并使它们可扩展,从而允许将自定义构面添加到语言环境对象。
方面分为六个标准类别:
类别 |
方面 |
成员函数 |
collate |
collate |
compare, hash, transform |
ctype |
ctype |
is, narrow, scan_is, scan_not, tolower, toupper, widen |
codecvt |
always_noconv, encoding, in, length, max_length, out, unshift |
monetary |
moneypunct |
curr_symbol, decimal_point, frac_digits, grouping, negative_sign, neg_format, positive_sign, pos_format, thousands_sep |
money_get |
get |
money_put |
put |
numeric |
numpunct |
decimal_point, falsename, grouping, thousands_sep, truename |
num_get |
get |
num_put |
put |
time |
time_get |
date_order, get_date, get_monthname, get_time, get_weekday, get_year (and get, since C++11) |
time_put |
put |
messages |
messages |
close, get, open |
语言环境对象可以完全由名称构造,并具有命名语言环境的所有特征,或者可以混合使用不同语言环境的构面类别(有关更多信息,请参见类locale构造函数)。因此,C++中本地化功能的核心是在不同方面实现的。 构面是对象。 这些对象由语言环境引擎自动管理,因此,通常不在程序中本地构造或复制方面对象(实际上,程序受其保护的析构函数阻止这样做)。 访问与语言环境关联的构面的特定功能的最通用方法是使用use_facet函数:
// using facet member directly:
myvar = use_facet < numpunct<char> > (mylocale).decimal_point();
// alias facet:
const numpunct<char>& myfacet = use_facet < numpunct<char> > (mylocale);
myvar = myfacet.decimal_point();
每一个方面:
- 派生自类locale::facet(或派生自它的任何类,如另一个facet)。
- 定义一个名为id的静态成员,类型为locale::id,并带有特定的值。
一个程序可以定义自己的facet,通过满足上述需求将其添加到地区中。 参构造函数包括所有方面作为第二个参数(称为参考),它定义了类回收是否委托给地区的引擎,因此它是自动删除当最后场所对象存在被摧毁,还是删除的项目负责。某些方面有一个等价的,但以“_byname”结尾。在构造命名的locale对象时,本地化引擎使用这些facet类型来构造适当的facet对象。所有标准facet都是使用公共成员设计的,这些公共成员调用具有相同名称的虚拟受保护成员,但前面有“do_”。操作本身的实现在于保护虚拟成员函数(派生类可以覆盖它),而非公共功能实现特定于平台的功能与操作本身,但必须允许系统上的功能正常工作。