Tornado 国际化支持
用于生成本地化字符串的翻译方法。
要加载语言环境并生成翻译的字符串:
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
更多建议: