tornado.locale — 国际化支持

用于生成本地化字符串的翻译方法。

要加载区域设置并生成翻译后的字符串

user_locale = tornado.locale.get("es_LA")
print(user_locale.translate("Sign out"))

tornado.locale.get() 返回最匹配的区域设置,不一定是你请求的特定区域设置。你可以使用 translate() 的附加参数来支持复数形式,例如

people = [...]
message = user_locale.translate(
    "%(list)s is online", "%(list)s are online", len(people))
print(message % {"list": user_locale.list(people)})

如果 len(people) == 1,则选择第一个字符串,否则选择第二个字符串。

应用程序应调用 load_translations(使用简单的 CSV 格式)或 load_gettext_translations(使用 gettext 和相关工具支持的 .mo 格式)之一。如果没有调用任何方法,则 Locale.translate 方法将简单地返回原始字符串。

tornado.locale.get(*locale_codes: str) Locale[source]

返回给定区域设置代码的最匹配项。

我们按顺序遍历所有给定的区域设置代码。如果我们对代码有严格匹配或宽松匹配(例如,“en” 匹配 “en_US”),我们返回区域设置。否则我们转到列表中的下一个代码。

默认情况下,如果找不到任何指定区域设置的翻译,我们返回 en_US。你可以使用 set_default_locale() 更改默认区域设置。

tornado.locale.set_default_locale(code: str) None[source]

设置默认区域设置。

默认区域设置被认为是系统中所有字符串使用的语言。从磁盘加载的翻译是从默认区域设置到目标区域设置的映射。因此,你不需要为默认区域设置创建翻译文件。

tornado.locale.load_translations(directory: str, encoding: Optional[str] = None) None[source]

从目录中的 CSV 文件加载翻译。

翻译是带有可选的 Python 风格命名占位符(例如,My name is %(name)s)及其关联翻译的字符串。

该目录应具有 LOCALE.csv 格式的翻译文件,例如 es_GT.csv。CSV 文件应具有两列或三列:字符串、翻译和可选的复数指示符。复数指示符应为 “plural” 或 “singular” 之一。给定的字符串可以同时具有单数形式和复数形式。例如,%(name)s liked this 可能会根据 %(name)s 是一个名称还是一个名称列表而具有不同的动词变化。CSV 文件中应为此字符串有两行,一行带有复数指示符 “singular”,另一行带有 “plural”。对于没有动词变化的字符串,只需使用 “unknown” 或空字符串(或者根本不包含此列)。

该文件使用默认的 “excel” 方言的 csv 模块进行读取。在此格式中,逗号后不应有空格。

如果没有给出 encoding 参数,则如果文件包含字节顺序标记 (BOM),将自动检测编码(UTF-8 和 UTF-16 之间),如果不存在 BOM,则默认为 UTF-8。

示例翻译 es_LA.csv

"I love you","Te amo"
"%(name)s liked this","A %(name)s les gustó esto","plural"
"%(name)s liked this","A %(name)s le gustó esto","singular"

Changed in version 4.3: 添加了 encoding 参数。添加了对基于 BOM 的编码检测、UTF-16 和带有 BOM 的 UTF-8 的支持。

tornado.locale.load_gettext_translations(directory: str, domain: str) None[source]

gettext 的区域设置树加载翻译

区域设置树类似于系统的 /usr/share/locale,例如

{directory}/{lang}/LC_MESSAGES/{domain}.mo

使你的应用程序翻译需要三个步骤

  1. 生成 POT 翻译文件

    xgettext --language=Python --keyword=_:1,2 -d mydomain file1.py file2.html etc
    
  2. 与现有的 POT 文件合并

    msgmerge old.po mydomain.po > new.po
    
  3. 编译

    msgfmt mydomain.po -o {directory}/pt_BR/LC_MESSAGES/mydomain.mo
    
tornado.locale.get_supported_locales() Iterable[str][source]

返回所有支持的区域设置代码的列表。

class tornado.locale.Locale(code: str)[source]

表示区域设置的对象。

在调用 load_translationsload_gettext_translations 之一后,调用 getget_closest 来获取 Locale 对象。

classmethod get_closest(*locale_codes: str) Locale[source]

返回给定语言代码的最佳匹配。

classmethod get(code: str) Locale[source]

返回给定语言代码的 Locale 对象。

如果语言代码不支持,我们会抛出异常。

translate(message: str, plural_message: Optional[str] = None, count: Optional[int] = None) str[source]

返回该语言的给定消息的翻译。

如果提供了 plural_message,则还必须提供 count。当 count != 1 时,我们返回 plural_message;当 count == 1 时,我们返回给定消息的单数形式。

format_date(date: Union[int, float, datetime], gmt_offset: int = 0, relative: bool = True, shorter: bool = False, full_format: bool = False) str[source]

格式化给定的日期。

默认情况下,我们返回一个相对时间(例如, “2 minutes ago”)。您可以通过 relative=False 来返回绝对日期字符串。

您可以通过 full_format=True 强制使用完整格式日期(“July 10, 1980”)。

此方法主要用于过去日期。对于未来日期,我们将回退到完整格式。

Changed in version 6.4: 现在支持 datetime.datetime 对象(仍然假设 naive datetime 对象为 UTC 时间)。

format_day(date: datetime, gmt_offset: int = 0, dow: bool = True) bool[source]

将给定日期格式化为星期几。

例如:“Monday, January 22”。您可以通过 dow=False 移除星期几。

list(parts: Any) str[source]

返回给定部件列表的逗号分隔列表。

格式为,例如, “A, B and C”, “A and B” 或仅 “A” 用于大小为 1 的列表。

friendly_number(value: int) str[source]

返回给定整数的逗号分隔数字。

class tornado.locale.CSVLocale(code: str, translations: Dict[str, Dict[str, str]])[source]

使用 tornado 的 CSV 翻译格式的 Locale 实现。

class tornado.locale.GettextLocale(code: str, translations: NullTranslations)[source]

使用 gettext 模块实现的语言环境。

pgettext(context: str, message: str, plural_message: Optional[str] = None, count: Optional[int] = None) str[source]

允许为翻译设置上下文,接受复数形式。

使用方法示例

pgettext("law", "right")
pgettext("good", "right")

复数消息示例

pgettext("organization", "club", "clubs", len(clubs))
pgettext("stick", "club", "clubs", len(clubs))

要生成带上下文的 POT 文件,请在 load_gettext_translations 序列的步骤 1 中添加以下选项

xgettext [basic options] --keyword=pgettext:1c,2 --keyword=pgettext:1c,2,3

版本 4.2 中新增。