跳到主要内容

语言

Morrow 内置 81 种语言,用于格式化、解析、humanize 和 dehumanize。除简体中文和繁体中文外,各语言的文本与 Arrow 1.4.0 一致;两种中文保持 Morrow 1.0 的输出。

from morrow import Locale, Morrow

var dt = Morrow(2026, 1, 1, 15)
print(dt.format("dddd Do MMMM YYYY", locale="fr")) # jeudi 1er janvier 2026
print(dt.shift(hours=-5).humanize(dt, locale="ru")) # 5 часов назад
print(dt.dehumanize("vor 2 Tagen", locale="de"))
print(Morrow.get("1 января 2026", "D MMMM YYYY", locale="ru"))

所有 locale 参数都可以传语言名称或 Locale 值。名称不区分大小写,_ 和 - 等价,因此 pt_BR、pt-br 和 PT-BR 加载的是同一种语言。未知名称会报 unsupported locale。

复用语言对象​

传入名称时,每次调用都会重新加载该语言的数据。在循环中,先加载一次 Locale,再传入这个值:

var french = Locale("fr")
for day in Morrow.iter_range("day", start, limit=365):
print(day.format("dddd D MMMM", locale=french))

Locale.available() 返回 81 个规范名称,Locale.aliases("ar") 返回某种语言接受的全部名称。

自定义语言​

Locale 的字段都是公开的。以某种内置语言为基础,修改需要的部分:

var pirate = Locale("en")
pirate.name = "en-pirate"
pirate.month_names[0] = "Janarrr"
pirate.meridians = ["ay", "pee", "AY", "PEE"]
pirate.set_timeframe("hours", "{0} bells")
pirate.past = "{0} back"

print(Morrow(2026, 1, 1, 15).format("MMMM D A", locale=pirate)) # Janarrr 1 PEE

名称列表从下标 0 开始:month_names[0] 是一月,day_names[0] 是星期一。meridians 依次为 am、pm、AM、PM。ordinals 可以覆盖内置的 1–31 日序数。

时间单位文本用 {0} 表示数量。需要按数量或方向选择不同形式时,设置 plural_rule 并传入对应的键:

plural_rule键
slavicsingular、dual、plural
arabic、hebrew2、ten、higher
doubledouble、higher
maltesedual、plural
czechzero、past,以及 future 或 future-singular/future-paucal
future_if_positive、past_if_negative、icelandicpast、future
var keys: List[String] = ["singular", "dual", "plural"]
var forms: List[String] = ["{0} dzień", "{0} dni", "{0} dni"]
pirate.plural_rule = "slavic"
pirate.set_timeframe("days", keys, forms)

Locale.describe(frame, delta) 和 describe_multi(frames, deltas) 可以直接格式化一个或多个带符号的时间单位,例如 describe("hours", -2)。

内置语言​

名称语言名称语言
af南非荷兰语lo老挝语
am阿姆哈拉语lt立陶宛语
ar阿拉伯语lv拉脱维亚语
ar-iq黎凡特阿拉伯语mk马其顿语
ar-ma摩洛哥阿拉伯语mk-latn马其顿语(拉丁字母)
ar-mr毛里塔尼亚阿拉伯语ml马拉雅拉姆语
ar-tn阿尔及利亚/突尼斯阿拉伯语mr马拉地语
az阿塞拜疆语ms马来语
be白俄罗斯语mt马耳他语
bg保加利亚语nb书面挪威语
bn孟加拉语ne尼泊尔语
ca加泰罗尼亚语nl荷兰语
cs捷克语nn新挪威语
da丹麦语or奥里亚语
de德语pl波兰语
de-at奥地利德语pt葡萄牙语
de-ch瑞士德语pt-br巴西葡萄牙语
ee爱沙尼亚语rm罗曼什语
el希腊语ro罗马尼亚语
en英语ru俄语
eo世界语se萨米语
es西班牙语si僧伽罗语
eu巴斯克语sk斯洛伐克语
fa波斯语sl斯洛文尼亚语
fi芬兰语sq阿尔巴尼亚语
fr法语sr塞尔维亚语
fr-ca加拿大法语sv瑞典语
he希伯来语sw斯瓦希里语
hi印地语ta泰米尔语
hr克罗地亚语th泰语
hu匈牙利语tl他加禄语
hy亚美尼亚语tr土耳其语
id印度尼西亚语ua乌克兰语
is冰岛语ur乌尔都语
it意大利语uz乌兹别克语
ja日语vi越南语
ka格鲁吉亚语zh-cn简体中文
kk哈萨克语zh-hk香港中文
ko韩语zh-tw繁体中文
la拉丁语zu祖鲁语
lb卢森堡语

地区别名与 Arrow 一致,例如 en-gb、es-es、ar-eg、sr-rs。zh、zh-hans 和 zh-hant 选择对应的中文。

与 Arrow 的差异​

  • 泰语和老挝语按佛历(+543 年)格式化年份,解析时换算回公历年份。YY 的 00–99 对应佛历 2500–2599 年。
  • 有 16 种语言没有“周”的文本。自动 humanize 在这些语言中改用天数,而 Arrow 会报错。显式指定周或季度粒度时,如果该语言没有对应文本,仍会报 not translated。
  • dehumanize 支持全部内置语言,包括 Arrow 不支持的 18 种(如阿拉伯语、希伯来语、韩语、泰语),可以读取 humanize 生成的文本。冰岛语 “nokkrar sekúndur”(几秒)不含数字,按 1 秒处理。
  • Do 也能解析 format 输出的序数,例如德语 3. 和韩语 세번째。
  • 希伯来语多单位文本按整体距离判断方向,而不是按最后一个单位。
  • 阿姆哈拉语将来时的“小时”使用小时一词;Arrow 1.4.0 在此处误用了“秒”。

英文和中文的 dehumanize 保持 1.0 的语法。