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[原始碼]

返回給定語系程式碼的最接近匹配項。

我們按順序迭代所有給定的語系程式碼。如果我們找到與程式碼的嚴格或寬鬆匹配項(例如,“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 檔案應具有兩到三列:字串、翻譯和可選的複數指示器。複數指示器應為 “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"

在 4.3 版本中變更:新增了 encoding 參數。新增了對基於 BOM 的編碼檢測、UTF-16 和帶有 BOM 的 UTF-8 的支援。

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_translationsload_gettext_translations 其中一個函式後,呼叫 getget_closest 來取得 Locale 物件。

classmethod get_closest(*locale_codes: str) Locale[原始碼]

傳回給定語言代碼最接近的匹配項。

classmethod get(code: str) Locale[原始碼]

傳回給定語言代碼的 Locale 物件。

如果該語言代碼不支援,則會引發例外。

translate(message: str, plural_message: Optional[str] = None, count: Optional[int] = None) str[原始碼]

傳回此語言環境中給定訊息的翻譯。

如果給定了 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[原始碼]

格式化給定的日期。

預設情況下,我們會傳回相對時間(例如,「2 分鐘前」)。您可以使用 relative=False 傳回絕對日期字串。

您可以使用 full_format=True 強制使用完整格式日期(「1980 年 7 月 10 日」)。

此方法主要用於過去的日期。對於未來的日期,我們會回退到完整格式。

在 6.4 版變更: 現在支援感知 datetime.datetime 物件(仍假設無時區的 datetime 物件為 UTC)。

format_day(date: 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: 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 序列的第一步

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

4.2 版本新增。