Python Tornado入门教程 Tornado 国际化支持

2024-02-25 开发教程 Python Tornado入门教程 匿名 3

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

要加载语言环境并生成翻译的字符串:

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) → tornado.locale.Locale

返回给定语言环境代码的最接近匹配项。

我们按顺序遍历所有给定的语言环境代码。 如果我们对代码有紧密或松散的匹配(例如,“en”对应“en_US”),我们会返回语言环境。 否则,我们将移至列表中的下一个代码。

默认情况下,如果没有找到任何指定语言环境的翻译,我们将返回 ​en_US​。 您可以使用 ​set_default_locale()​ 更改默认语言环境。

tornado.locale.set_default_locale(code: str) → None

设置默认语言环境。

假定默认语言环境是系统中所有字符串使用的语言。 从磁盘加载的翻译是从默认语言环境到目标语言环境的映射。 因此,您无需为默认语言环境创建翻译文件。

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

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

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

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

使用默认“excel”语言中的 csv 模块读取文件。 在这种格式中,逗号后不应有空格。

如果未给出编码参数,则如果文件包含字节顺序标记 (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"

在 4.3 版更改: 添加了编码参数。 添加了对基于 BOM 的编码检测、UTF-16 和 UTF-8-with-BOM 的支持。

tornado.locale.load_gettext_translations(directory: str, domain: str) → None

从 ​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]

返回所有支持的语言环境代码的列表。

class tornado.locale.Locale(code: str)

表示语言环境的对象。

在调用 ​load_translations或 ​load_gettext_translations之一后,调用 ​get或 ​get_closest以获取 Locale 对象。

classmethodget_closest(*locale_codes) → tornado.locale.Locale

返回给定语言环境代码的最接近匹配项。

classmethodget(code: str) → tornado.locale.Locale

返回给定语言环境代码的语言环境。

如果不支持,我们会引发异常。

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

返回此语言环境的给定消息的翻译。
如果给出了​pural_message​,您还必须提供​count​。当 ​count != 1​ 时返回​pural_message​,当 ​count == 1​ 时返回给定消息的单数形式。

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

格式化给定的日期(应该是 GMT)。

默认情况下,我们返回一个相对时间(例如,“2 分钟前”)。 您可以使用​relative=False返回绝对日期字符串。

您可以使用full_format=True强制使用完整格式的日期(“1980 年 7 月 10 日”)。

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

format_day(date: datetime.datetime, gmt_offset: int = 0, dow: bool = True) → bool

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

示例:“1 月 22 日,星期一”。 您可以使用 ​dow=False​ 删除星期几。

list(parts: Any) → str

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

例如,对于大小为 1 的列表,格式是“A、B 和 C”、“A 和 B”或只是“A”。

friendly_number(value: int) → str

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

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

使用 tornado 的 CSV 翻译格式的语言环境实现。

class tornado.locale.GettextLocale(code: str, translations: gettext.NullTranslations)

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

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

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

使用示例:

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