locale ——国际化服务

源代码: Lib/locale.py


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

这个 locale 模块是在 _locale 模块,该模块反过来使用ANSIC语言环境实现(如果可用)。

这个 locale 模块定义以下异常和函数:

exception locale.Error

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

locale.setlocale(category, locale=None)

如果 locale 是否给予 Nonesetlocale() 修改的区域设置 类别 . 下面的数据说明中列出了可用的类别。 locale 可以是一个字符串,也可以是两个字符串(语言代码和编码)中的一个可Itable。如果它是一个iterable,它将使用区域设置别名引擎转换为区域设置名称。空字符串指定用户的默认设置。如果修改区域设置失败,则异常 Error 提高了。如果成功,则返回新的区域设置。

如果 locale 被省略或 None ,的当前设置 类别 返回。

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

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

函数临时设置 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_CTYPE

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

locale.LC_COLLATE

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

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() . 对于这些应用程序,可能需要绑定文本域,以便库能够正确定位其消息目录。