locale国际化服务

源代码: Lib / locale.py


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

locale模块_locale模块,如果可用,它又使用ANSI C语言环境实现.

localemodule定义了以下异常和函数:

exception locale.Error

当语言环境传递到setlocale()不被认出来

locale.setlocalecategory, locale=None

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

如果locale被省略或None,则category的当前设置被恢复.

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

import localelocale.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" 货币符号是否优先于该值(forpositive resp。negativevalues).
  "p_sep_by_space/n_sep_by_space" 货币符号是否与aspace的值分开(对于正的resp.negative值).
  "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 localeLC_NUMERIC语言环境或LC_MONETARY语言环境,如果语言环境不同,则数字或货币字符串是非ASCII。这个临时更改影响其他线程

更改版本3.7:在某些情况下,函数现在暂时将LC_CTYPE语言环境设置为LC_NUMERIC语言环境。

locale.nl_langinfooption

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

nl_langinfo()函数接受以下键之一。大多数描述都取自GNU Clibrary中的相应描述.

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

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

locale.CRNCYSTR

获取货币符号,如果符号应出现在值之前,则以“ – ”开头;如果符号应出现在值之后,则加“+”;如果符号应替换基数字符,则加“。”

locale.ERA

获取一个字符串,表示当前语言环境中使用的时代.

大多数语言环境都不定义此值。确定此值的区域设置示例是日语区域。在日本,传统的日期表示包括与当时皇帝统治相对应的时代的名称.

通常,不必直接使用此值。在格式字符串中指定E修饰符会导致time.strftime()功能使用此信息。返回的字符串的格式没有指定,因此你不应该在differentsystems上知道它.

locale.ERA_D_T_FMT

获取time.strftime()以alocale特定的时代为基础的方式来表示日期和时间.

locale.ERA_D_FMT

获取time.strftime()的格式字符串来表示基于alocale特定时代的日期.

locale.ERA_T_FMT

获取time.strftime()在alocale特定的基于时代的方式中表示时间

locale.ALT_DIGITS

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

locale.getdefaultlocale ( [envvars]

尝试确定默认的语言环境设置并将它们作为(language code, encoding).

形式的元组返回。根据POSIX,没有调用setlocale(LC_ALL, "")的程序使用便携式"C"语言环境运行。打电话给setlocale(LC_ALL, "")letsit使用LANG变量定义的默认语言环境。由于我们不想干扰当前的区域设置,因此我们以上述方式模仿行为.

为了保持与其他平台的兼容性,不仅测试了LANG变量,还测试了以envvars参数给出的变量列表。将使用第一个被定义的定义。envvars默认为GNU gettext中使用的搜索路径;它必须始终包含变量名称"LANG"。GNU gettext搜索路径包含"LC_ALL","LC_CTYPE", "LANG""LANGUAGE",按顺序.

除了代码"C",语言代码对应RFC 1766 .language codeencoding也许 None如果他们的价值无法确定.

locale.getlocalecategory=LC_CTYPE

返回给定语言环境类别的当前设置,因为包含language code, encoding. category的序列可能是LC_* valuesexcept LC_ALL之一。默认为LC_CTYPE.

除了代码"C",语言代码对应RFC 1766 .language codeencoding也许 None如果他们的价值无法确定.

locale.getpreferredencodingdo_setlocale=True

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

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

在Android或UTF-8模式下(-X utf8选项),总是返回"UTF-8",语言环境和do_setlocale参数被忽略.

更改版本3.7:现在该函数总是在Android上返回UTF-8或者启用了UTF-8模式.

locale.normalizelocalename

返回给定语言环境名称的规范化语言环境代码。返回的localecode格式化为与setlocale()一起使用。如果规范化失败,原始名称将保持不变.

如果给定的编码未知,则函数默认为区域代码的默认编码,就像setlocale().

locale.resetlocalecategory=LC_ALL

category的语言环境设置为默认设置.

默认设置是通过调用getdefaultlocale().category默认设置为LC_ALL.

locale.strcollstring1, string2

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

locale.strxfrm//(string

将字符串转换为可在locale-awarecomparisons中使用的字符串。例如,strxfrm(s1) < strxfrm(s2)等于strcoll(s1, s2) < 0。当重复比较相同的字符串时,可以使用该功能,例如,整理琴弦序列时

locale.format_stringformat, val, grouping=False, monetary=False)

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

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

format % val中那样处理格式化说明符,但考虑到currentcocale设置.

更改版本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_MONETARYsettings.

如果symbol是的,这是默认值。如果grouping如果为true(这不是默认值),则使用值进行分组。如果international为真(这不是默认值),则使用国际货币符号.

请注意,此功能不适用于’C’区域设置,因此您必须通过setlocale()首先设置alocale

locale.str// (float

使用与内置函数str(float)相同的格式格式化浮点数,但考虑小数点.

locale.delocalize (string )

LC_NUMERIC设置之后将字符串转换为标准化数字字符串

在3.5版本中新增.

locale.atof (string)

LC_NUMERICsettings.

locale.atoistring

按照LC_NUMERIC convention.

locale.LC_CTYPE

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

locale.LC_COLLATE

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

locale.LC_TIME

用于格式化时间的Locale类别。函数time.strftime()遵循这些约定.

locale.LC_MONETARY

用于格式化货币值的列表类别。可用的选项可从localeconv() function.

locale.LC_MESSAGES

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

locale.LC_NUMERIC

用于格式化数字的列表类别。format(),atoi(), atof()模块区域的str()locale的功能受该类别的影响。所有其他数字格式化操作都不受影响.

locale.LC_ALL

所有区域设置的组合。如果在更改语言环境时使用此标志,则尝试设置所有类别的语言环境。如果forany类别失败,则根本不会更改任何类别。使用此标志检索区域设置时,将返回指示所有类别的设置的字符串。此字符串可以在以后用于恢复设置.

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在启动时更改类别,以将当前的localeencoding设置为用户首选的语言环境编码。该程序必须通过调用setlocale(LC_ALL, "").

打电话setlocale()在某些库例程中,由于副作用,它会影响整个程序。保存和恢复它几乎一样糟糕:它很昂贵并影响在设置恢复之前碰巧运行的其他线程.

如果在编写模块以供一般使用时,您需要一个受语言环境影响的操作的语言环境独立版本(例如time.strftime()),你必须找到一种方法,而不使用标准库例程。更好的是说服自己使用区域设置是可以的。只有作为最后的手段,你应该记录你的模块与非 – Clocale settings。

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

根据区域设置,无法执行大小写转换和字符分类。对于(Unicode)文本字符串,这些仅根据字符值完成,而对于字节字符串,转换和分类根据字节的ASCII值完成,而设置高位的字节(即,非ASCII字节)从不转换或考虑字符类的部分,如字母或空格.

对于嵌入Python的扩展编写器和程序

扩展模块永远不应该调用setlocale(),除了找出当前的区域设置。但是由于返回值只能用于移植它,所以它不是很有用(除了可能是为了找出该区域是否是C).

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

访问消息目录

locale.gettextmsg
locale.dgettextdomain, msg
locale.dcgettextdomain, msg, category
locale.textdomaindomain
locale.bindtextdomaindomain, dir

语言环境模块在提供此接口的系统上公开C库的gettext接口。它由函数gettext(),dgettext(), dcgettext(), textdomain(), bindtextdomain()bind_textdomain_codeset()组成。它们类似于gettext模块中的相同函数,但是使用C库的二进制格式来表示消息目录,而C库的搜索算法用于定位消息目录.

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

评论被关闭。