Skip to main content

23.2. locale —国际化服务

源代码: Lib/locale.py


locale 模块打开对POSIX语言环境数据库和功能的访问。 POSIX语言环境机制允许程序员处理应用程序中的某些文化问题,而不需要程序员知道执行软件的每个国家的所有细节。

locale 模块在 _locale 模块的顶部实现,而 _locale 模块又使用ANSI C语言环境实现(如果可用)。

locale 模块定义了以下异常和功能:

exception locale.Error

无法识别传递给 setlocale() 的区域设置时引发的异常。

locale.setlocale(category, locale=None)

如果给出 locale 而不是 None,则 setlocale() 修改 category 的区域设置。可用类别在下面的数据描述中列出。 locale 可以是字符串,也可以是两个字符串的迭代(语言代码和编码)。如果它是一个可迭代的,它将使用语言环境别名引擎转换为一个区域设置名称。空字符串指定用户的默认设置。如果语言环境的修改失败,则引发异常 Error。如果成功,则返回新的区域设置。

如果省略 localeNone,则返回 category 的当前设置。

setlocale() 在大多数系统上不是线程安全的。应用程序通常从调用开始

import locale
locale.setlocale(locale.LC_ALL, '')

这将所有类别的区域设置设置为用户的默认设置(通常在 LANG 环境变量中指定)。如果语言环境以后没有更改,使用多线程不应该导致问题。

locale.localeconv()

返回本地约定的数据库作为字典。此字典具有以下字符串作为键:

类别

含义

LC_NUMERIC

'decimal_point'

小数点字符。

 

'grouping'

指定期望 'thousands_sep' 的相对位置的数字序列。如果序列以 CHAR_MAX 终止,则不执行进一步的分组。如果序列以 0 终止,则重复使用最后一个组大小。

 

'thousands_sep'

组之间使用的字符。

LC_MONETARY

'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

此区域设置中未指定任何内容。

locale.nl_langinfo(option)

将一些特定于语言环境的信息作为字符串返回。此功能不适用于所有系统,并且可能的选项集也可能在不同平台上有所不同。可能的参数值是数字,符号常量在语言环境模块中可用。

nl_langinfo() 功能接受以下键之一。大多数描述取自GNU C库中的相应描述。

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

获取可以与正则表达式函数一起使用的正则表达式,以识别对是/否问题的肯定响应。

注解

表达式的语法适合于C库中的 regex() 函数,这可能与 re 中使用的语法不同。

locale.NOEXPR

获取可以与regex(3)函数一起使用的正则表达式,以识别对是/否问题的否定响应。

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

获取用于表示值0到99的最多100个值的表示。

locale.getdefaultlocale([envvars])

尝试确定默认语言环境设置,并将其作为 (language code, encoding) 形式的元组返回。

根据POSIX,没有调用 setlocale(LC_ALL, '') 的程序使用便携式 'C' 语言环境运行。调用 setlocale(LC_ALL, '') 允许它使用由 LANG 变量定义的默认语言环境。由于我们不想干扰当前区域设置,因此我们以上述方式模拟行为。

为了保持与其他平台的兼容性,不仅测试了 LANG 变量,而且还测试了作为envvars参数提供的变量列表。第一个发现被定义将被使用。 envvars 默认为在GNU gettext中使用的搜索路径;它必须始终包含变量名 'LANG'。 GNU gettext搜索路径包含 'LC_ALL''LC_CTYPE''LANG''LANGUAGE'

除了代码 'C' 之外,语言代码对应于 RFC 1766。如果不能确定它们的值,则 语言代码encoding 可以是 None

locale.getlocale(category=LC_CTYPE)

将给定语言环境类别的当前设置返回为包含 语言代码encoding 的序列。 category 可以是除 LC_ALL 之外的 LC_* 值之一。它默认为 LC_CTYPE

除了代码 'C' 之外,语言代码对应于 RFC 1766。如果不能确定它们的值,则 语言代码encoding 可以是 None

locale.getpreferredencoding(do_setlocale=True)

根据用户偏好返回用于文本数据的编码。用户首选项在不同系统上的表达方式不同,并且在某些系统上可能无法以编程方式使用,因此此函数仅返回猜测。

在某些系统上,有必要调用 setlocale() 以获取用户首选项,因此此函数不是线程安全的。如果不需要或不需要调用setlocale,则 do_setlocale 应设置为 False

locale.normalize(localename)

返回给定语言环境名称的标准化语言环境代码。返回的语言环境代码被格式化为与 setlocale() 一起使用。如果规范化失败,原始名称将不更改地返回。

如果给定的编码未知,该函数默认为与 setlocale() 类似的语言环境代码的默认编码。

locale.resetlocale(category=LC_ALL)

category 的区域设置设置为默认设置。

默认设置由调用 getdefaultlocale() 确定。 category 默认为 LC_ALL

locale.strcoll(string1, string2)

根据当前 LC_COLLATE 设置比较两个字符串。作为任何其他比较函数,返回负值或正值或 0,取决于 string1string2 之前还是之后整理或等于它。

locale.strxfrm(string)

将字符串转换为可在区域设置感知比较中使用的字符串。例如,strxfrm(s1) < strxfrm(s2) 等同于 strcoll(s1, s2) < 0。当相同的字符串被重复比较时,可以使用该函数。当比较字符串序列时。

locale.format(format, val, grouping=False, monetary=False)

根据当前 LC_NUMERIC 设置格式化 val 号码。格式遵循 % 运算符的约定。对于浮点值,如果合适,将修改小数点。如果 grouping 为真,也考虑分组。

如果 monetary 为true,则转换使用货币千位分隔符和分组字符串。

请注意,此函数仅适用于正好一个%char说明符。对于整个格式字符串,请使用 format_string()

locale.format_string(format, val, grouping=False)

format % val 中一样处理格式化说明符,但会考虑当前的区域设置。

locale.currency(val, symbol=True, grouping=False, international=False)

根据当前 LC_MONETARY 设置格式化一个数字 val

如果 symbol 为true,则返回的字符串包含货币符号,这是默认值。如果 grouping 为true(这不是默认值),则使用该值进行分组。如果 international 为true(不是默认值),则使用国际货币符号。

请注意,此函数不能与“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_CTYPE

字符类型函数的区域设置类别。根据此类别的设置,处理案例的模块 string 的功能会更改其行为。

locale.LC_COLLATE

用于排序字符串的区域设置类别。 locale 模块的功能 strcoll()strxfrm() 会受到影响。

locale.LC_TIME

时间格式化的区域设置类别。函数 time.strftime() 遵循这些约定。

locale.LC_MONETARY

货币值格式化的区域设置类别。可用选项可从 localeconv() 功能获得。

locale.LC_MESSAGES

消息显示的区域设置类别。 Python目前不支持特定于应用程序的区域设置感知消息。操作系统显示的消息(如 os.strerror() 返回的消息)可能会受此类别的影响。

locale.LC_NUMERIC

格式化数字的区域设置类别。 locale 模块的功能 format()atoi()atof()str() 受该类别的影响。所有其他数字格式化操作不受影响。

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

23.2.1. 背景,细节,提示,提示和警告

C标准将区域设置定义为程序范围的属性,其改变可能相对昂贵。最重要的是,一些实现被破坏,频繁的区域设置更改可能会导致核心转储。这使得locale有点痛苦,正确使用。

最初,当程序启动时,无论用户的首选语言环境是什么,语言环境都是 C 语言环境。有一个例外:LC_CTYPE 类别在启动时更改,以将当前区域设置编码设置为用户首选的区域设置编码。该程序必须明确地说,它想通过调用 setlocale(LC_ALL, '') 用户的其他类别的首选区域设置。

在一些库例程中调用 setlocale() 通常是个坏主意,因为作为副作用它影响整个程序。保存和恢复它几乎同样糟糕:它是昂贵的,并影响在设置恢复之前运行的其他线程。

如果在为一般使用的模块编码时,需要一个受语言环境影响的操作的语言环境独立版本(例如与 time.strftime() 一起使用的某些格式),则必须找到一种方法,而不使用标准库常规。更好的是说服自己使用区域设置是好的。作为最后的手段,您应该记录您的模块与非C 区域设置不兼容。

根据语言环境执行数字操作的唯一方法是使用此模块定义的特殊函数:atof()atoi()format()str()

没有办法根据语言环境执行案例转换和字符分类。对于(Unicode)文本字符串,这些仅根据字符值完成,而对于字节字符串,转换和分类根据字节的ASCII值以及设置高位的字节(即,非ASCII字节)永远不会被转换或视为字符类的一部分,例如字母或空格。

23.2.2. 对于嵌入Python的扩展程序和程序

扩展模块不应该调用 setlocale(),除非找出当前语言环境。但是由于返回值只能用于可移植地恢复它,这不是非常有用(除了或许要找出区域设置是否是 C)。

当Python代码使用 locale 模块更改语言环境时,这也会影响嵌入应用程序。如果嵌入应用程序不希望发生这种情况,它应该从 config.c 文件中的内置模块表中删除 _locale 扩展模块(它完成所有工作),并确保 _locale 模块不可访问共享库。

23.2.3. 访问消息目录

locale模块公开了提供此接口的系统上的C库的gettext接口。它由功能 gettext()dgettext()dcgettext()textdomain()bindtextdomain()bind_textdomain_codeset() 组成。这些类似于 gettext 模块中的相同功能,但使用C库的二进制格式用于消息目录,以及C库的搜索算法用于定位消息目录。

Python应用程序通常不需要调用这些函数,应该使用 gettext。此规则的一个已知异常是与内部调用 gettext()dcgettext() 的其他C库链接的应用程序。对于这些应用程序,可能需要绑定文本域,以便库可以正确地定位其消息目录。