locale
——国际化服务¶
源代码: Lib/locale.py
这个 locale
模块打开对POSIX区域设置数据库和功能的访问。POSIX语言环境机制允许程序员处理应用程序中的某些文化问题,而不要求程序员了解执行软件的每个国家的所有细节。
这个 locale
模块是在 _locale
模块,该模块反过来使用ANSIC语言环境实现(如果可用)。
这个 locale
模块定义以下异常和函数:
- exception locale.Error¶
当区域设置传递到时引发异常
setlocale()
无法识别。
- locale.setlocale(category, locale=None)¶
如果 locale 是否给予
None
,setlocale()
修改的区域设置 类别 . 下面的数据说明中列出了可用的类别。 locale 可以是一个字符串,也可以是两个字符串(语言代码和编码)中的一个可Itable。如果它是一个iterable,它将使用区域设置别名引擎转换为区域设置名称。空字符串指定用户的默认设置。如果修改区域设置失败,则异常Error
提高了。如果成功,则返回新的区域设置。如果 locale 被省略或
None
,的当前设置 类别 返回。setlocale()
在大多数系统上不是线程安全的。应用程序通常从以下调用开始:import locale locale.setlocale(locale.LC_ALL, '')
这会将所有类别的区域设置为用户的默认设置(通常在
LANG
环境变量)。如果此后未更改区域设置,则使用多线程不应导致问题。
- locale.localeconv()¶
以字典形式返回本地约定的数据库。此词典有以下字符串作为键:
类别
键
意义
'decimal_point'
小数点字符。
'grouping'
数字序列,指定
'thousands_sep'
是意料之中的事。如果序列以CHAR_MAX
,不执行进一步分组。如果序列以0
,重复使用最后一个组大小。'thousands_sep'
组之间使用的字符。
'int_curr_symbol'
国际货币符号。
'currency_symbol'
当地货币符号。
'p_cs_precedes/n_cs_precedes'
货币符号是否在值之前(对于正响应。负值)。
'p_sep_by_space/n_sep_by_space'
货币符号与值之间是否用空格分隔(表示正响应。负值)。
'mon_decimal_point'
用于货币值的小数点。
'frac_digits'
货币值的本地格式中使用的小数位数。
'int_frac_digits'
国际货币值格式中使用的小数位数。
'mon_thousands_sep'
用于货币值的组分隔符。
'mon_grouping'
相当于
'grouping'
,用于货币价值。'positive_sign'
用于注释正货币值的符号。
'negative_sign'
用于注释负货币值的符号。
'p_sign_posn/n_sign_posn'
标志的位置(对于正响应负值),见下文。
所有数值都可以设置为
CHAR_MAX
指示此区域设置中没有指定值。的可能值
'p_sign_posn'
和'n_sign_posn'
如下所示。价值
解释
0
货币和价值用括号括起来。
1
符号应位于值和货币符号之前。
2
符号应跟随价值和货币符号。
3
符号应紧跟在值之前。
4
该符号应紧跟该值。
CHAR_MAX
此区域设置中未指定任何内容。
函数临时设置
LC_CTYPE
本地化到LC_NUMERIC
locale或LC_MONETARY
如果区域设置不同,并且数字或货币字符串不是ASCII,则为区域设置。此临时更改会影响其他线程。在 3.7 版更改: 函数现在临时设置
LC_CTYPE
本地化到LC_NUMERIC
某些情况下的区域设置。
- locale.nl_langinfo(option)¶
以字符串形式返回一些特定于区域设置的信息。此功能并非在所有系统上都可用,可能的选项集也可能因平台而异。可能的参数值是数字,其符号常量在区域设置模块中可用。
这个
nl_langinfo()
函数接受以下键之一。大多数描述来自GNUC库中的相应描述。- locale.CODESET¶
获取具有所选区域设置中使用的字符编码名称的字符串。
- locale.D_T_FMT¶
获取可用作格式字符串的字符串
time.strftime()
以特定于区域设置的方式表示日期和时间。
- locale.D_FMT¶
获取可用作格式字符串的字符串
time.strftime()
以特定于区域设置的方式表示日期。
- locale.T_FMT¶
获取可用作格式字符串的字符串
time.strftime()
以特定于区域设置的方式表示时间。
- locale.T_FMT_AMPM¶
获取格式字符串
time.strftime()
以AM/PM格式表示时间。
- DAY_1 ... DAY_7
获取一周中第n天的名称。
注解
这符合美国公约
DAY_1
星期天,不是星期一的国际公约(ISO 8601)是星期一的第一天。
- ABDAY_1 ... ABDAY_7
获取一周中第n天的缩写名称。
- MON_1 ... MON_12
获取第n个月的名称。
- ABMON_1 ... ABMON_12
获取第n个月的缩写名称。
- locale.RADIXCHAR¶
获取基数字符(小数点、小数逗号等)。
- locale.THOUSEP¶
获取千位分隔符(三位数字组成的组)。
- locale.YESEXPR¶
获取一个正则表达式,该表达式可与regex函数一起用于识别对yes/no问题的正响应。
注解
表达式的语法适用于
regex()
来自C库的函数,它可能与中使用的语法不同re
.
- locale.NOEXPR¶
获取一个正则表达式,该表达式可与regex(3)函数一起用于识别对yes/no问题的否定响应。
- locale.CRNCYSTR¶
获取货币符号,如果符号应出现在值之前,则以“-”开头;如果符号应出现在值之后,则以“+”开头;如果符号应替换基数字符,则以“.”开头。
- locale.ERA¶
获取表示当前区域设置中使用的纪元的字符串。
大多数地区没有定义这个值。定义该值的区域设置的一个示例是日语区域设置。在日本,传统的日期表示法包括与当时皇帝统治相对应的时代名称。
通常不需要直接使用该值。指定
E
其格式字符串中的修饰符导致time.strftime()
函数来使用此信息。未指定返回字符串的格式,因此不应假定您在不同的系统上了解它。
- locale.ERA_D_T_FMT¶
获取格式字符串
time.strftime()
以一种特定于地区的基于时代的方式表示日期和时间。
- locale.ERA_D_FMT¶
获取格式字符串
time.strftime()
以特定于区域的基于时代的方式表示日期。
- locale.ERA_T_FMT¶
获取格式字符串
time.strftime()
以一种特定于地区的基于时代的方式表示时间。
- locale.ALT_DIGITS¶
获取最多100个用于表示值0到99的值的表示形式。
- locale.getdefaultlocale([envvars])¶
尝试确定默认区域设置并将其作为表单的元组返回
(language code, encoding)
.根据posix,一个没有调用
setlocale(LC_ALL, '')
使用便携式设备运行'C'
locale。调用setlocale(LC_ALL, '')
允许它使用由LANG
变量。因为我们不想干扰当前的区域设置,所以我们按照上面描述的方式模拟行为。为了保持与其他平台的兼容性,不仅是
LANG
变量被测试,但作为envvars参数给出的变量列表。将使用找到的第一个要定义的。 埃文瓦尔 默认为GNU GetText中使用的搜索路径;它必须始终包含变量名'LANG'
. GNU GetText搜索路径包含'LC_ALL'
,'LC_CTYPE'
,'LANG'
和'LANGUAGE'
,按照这个顺序。除了代码
'C'
,语言代码对应 RFC 1766 . 语言代码 和 encoding 可能是None
如果无法确定它们的值。
- locale.getlocale(category=LC_CTYPE)¶
将给定区域设置类别的当前设置作为包含 语言代码 , encoding . 类别 可能是
LC_*
值除外LC_ALL
. 它默认为LC_CTYPE
.除了代码
'C'
,语言代码对应 RFC 1766 . 语言代码 和 encoding 可能是None
如果无法确定它们的值。
- locale.getpreferredencoding(do_setlocale=True)¶
返回 locale encoding 根据用户首选项用于文本数据。用户首选项在不同的系统上表示不同,在某些系统上可能无法以编程方式提供,因此此函数仅返回猜测。
在某些系统上,需要调用
setlocale()
为了获得用户首选项,所以这个函数不是线程安全的。如果不需要或不需要调用setlocale, do_setlocale 应设置为False
.在Android上,或者如果 Python UTF-8 Mode 已启用,则始终返回
'UTF-8'
,即 locale encoding 以及 do_setlocale 参数被忽略。这个 Python preinitialization 配置LC_CTYPE区域设置。另请参阅 filesystem encoding and error handler 。
在 3.7 版更改: 该函数现在始终返回
UTF-8
在Android上,或者如果 Python UTF-8 Mode 已启用。
- locale.normalize(localename)¶
返回给定区域设置名称的规范化区域设置代码。返回的区域设置代码已格式化,可用于
setlocale()
. 如果规范化失败,原始名称将原封不动地返回。如果给定的编码未知,则函数默认为区域设置代码的默认编码,就像
setlocale()
.
- locale.resetlocale(category=LC_ALL)¶
设置的区域设置 类别 默认设置。
默认设置由调用
getdefaultlocale()
. 类别 默认为LC_ALL
.
- locale.strcoll(string1, string2)¶
根据电流比较两个字符串
LC_COLLATE
设置。与任何其他比较函数一样,返回负值或正值,或者0
,取决于 STRIGE1 前后排序 STRIGN2 或者等于它。
- locale.strxfrm(string)¶
将字符串转换为可用于区分区域设置的比较的字符串。例如,
strxfrm(s1) < strxfrm(s2)
等于strcoll(s1, s2) < 0
. 当重复比较同一字符串时(例如,在整理字符串序列时),可以使用此函数。
- locale.format_string(format, val, grouping=False, monetary=False)¶
设置数字格式 val 根据电流
LC_NUMERIC
设置。格式遵循%
操作员。对于浮点值,如果合适,则修改小数点。如果 分组 是真的,也要考虑分组。如果 monetary 是真的,转换使用货币千位分隔符和分组字符串。
处理格式说明符,如中所示
format % val
,但将当前区域设置考虑在内。在 3.7 版更改: 这个 monetary 添加了关键字参数。
- locale.format(format, val, grouping=False, monetary=False)¶
请注意,此函数的工作方式如下
format_string()
但只适用于一个%char
说明符。例如,'%f'
和'%.0f'
都是有效的说明符,但'%f KiB'
不是。对于整个格式字符串,请使用
format_string()
.3.7 版后已移除: 使用
format_string()
相反。
- locale.currency(val, symbol=True, grouping=False, international=False)¶
设置数字格式 val 根据电流
LC_MONETARY
设置。返回的字符串包含货币符号if symbol 为真,这是默认值。如果 分组 如果为真(不是默认值),则使用该值进行分组。如果 国际的 为真(不是默认值),使用国际货币符号。
请注意,此函数不适用于“c”区域设置,因此您必须通过
setlocale()
第一。
- locale.str(float)¶
使用与内置函数相同的格式格式化浮点数
str(float)
但要考虑小数点。
- locale.delocalize(string)¶
将字符串转换为规范化的数字字符串,然后
LC_NUMERIC
设置。3.5 新版功能.
- locale.atof(string)¶
将字符串转换为浮点数,后跟
LC_NUMERIC
设置。
- locale.atoi(string)¶
将字符串转换为整数,后跟
LC_NUMERIC
习俗。
- locale.LC_TIME¶
用于设置时间格式的区域设置类别。函数
time.strftime()
遵循这些惯例。
- locale.LC_MONETARY¶
用于设置货币值格式的区域设置类别。可用选项可从
localeconv()
功能。
- locale.LC_MESSAGES¶
消息显示的区域设置类别。python当前不支持特定于应用程序的区域设置感知消息。操作系统显示的消息,如
os.strerror()
可能受此类别的影响。
- locale.LC_NUMERIC¶
用于设置数字格式的区域设置类别。功能
format()
,atoi()
,atof()
和str()
的locale
模块受该类别的影响。所有其他数字格式操作都不受影响。
- locale.LC_ALL¶
所有区域设置的组合。如果在区域设置更改时使用此标志,则尝试为所有类别设置区域设置。如果任何类别都失败,则根本不会更改任何类别。使用此标志检索区域设置时,将返回一个指示所有类别的设置的字符串。此字符串稍后可用于还原设置。
- locale.CHAR_MAX¶
这是一个符号常量,用于返回的不同值
localeconv()
.
例子::
>>> import locale
>>> loc = locale.getlocale() # get current locale
# use German locale; name might vary with platform
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
>>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut
>>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale
>>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale
>>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale
背景、细节、提示、提示和注意事项¶
C标准将语言环境定义为程序范围的属性,更改该属性可能相对昂贵。除此之外,一些实现被破坏了,频繁的区域设置更改可能会导致核心转储。这使得正确使用区域设置有些困难。
最初,当程序启动时,区域设置是 C
区域设置,无论用户的首选区域设置是什么。有一个例外:即 LC_CTYPE
类别在启动时更改,以将当前区域设置编码设置为用户首选的区域设置编码。程序必须通过调用 setlocale(LC_ALL, '')
.
调用通常是个坏主意 setlocale()
在某些库例程中,因为它作为副作用影响整个程序。保存和恢复它几乎同样糟糕:它很昂贵,并且会影响在恢复设置之前碰巧运行的其他线程。
如果在对模块进行通用编码时,需要一个受区域设置影响的独立于区域设置的操作版本(例如,用于 time.strftime()
,您将必须找到一种不使用标准库例程的方法。更好的是说服自己使用区域设置是可以的。只有作为最后手段,您才应该记录您的模块与非-C
区域设置。
根据区域设置执行数值操作的唯一方法是使用此模块定义的特殊函数: atof()
, atoi()
, format()
, str()
.
无法根据区域设置执行案例转换和字符分类。对于(unicode)文本字符串,仅根据字符值进行转换,而对于字节字符串,则根据字节的ASCII值进行转换和分类,并且设置高位的字节(即非ASCII字节)从不被转换或视为字符类的一部分,如字母或空白。
用于嵌入python的扩展编写器和程序¶
扩展模块不应调用 setlocale()
,但要找出当前区域设置是什么。但是,由于返回值只能用于可移植地还原它,所以这不是很有用(除非可能是为了查明区域设置是否是 C
)
当python代码使用 locale
模块更改区域设置,这也会影响嵌入应用程序。如果嵌入应用程序不希望发生这种情况,则应删除 _locale
扩展模块(完成所有工作)来自 config.c
归档,并确保 _locale
模块不能作为共享库访问。
访问邮件目录¶
- locale.gettext(msg)¶
- locale.dgettext(domain, msg)¶
- locale.dcgettext(domain, msg, category)¶
- locale.textdomain(domain)¶
- locale.bindtextdomain(domain, dir)¶
locale模块在提供此接口的系统上公开C库的getText接口。它由功能组成 gettext()
, dgettext()
, dcgettext()
, textdomain()
, bindtextdomain()
和 bind_textdomain_codeset()
. 这些功能与 gettext
模块,但对消息目录使用C库的二进制格式,并使用C库的搜索算法查找消息目录。
Python应用程序通常不需要调用这些函数,应该使用 gettext
相反。此规则的一个已知例外是与内部调用的附加C库链接的应用程序 gettext()
或 dcgettext()
. 对于这些应用程序,可能需要绑定文本域,以便库能够正确定位其消息目录。