用途:在 Frappe v14、v15、v16 应用中实现翻译与国际化(i18n),提供确定性的字符串翻译模式。
主要能力:Python 使用 _("Hello"),带占位符用 _("Hello {0}").format(name),带上下文用 _("Change", context="Coins"),v15+ 支持模块级惰性翻译 _lt("Pending");JavaScript 使用 __("Hello"),带替换用 __("Hello {0}", [name]),带上下文用 __("Change", null, "Coins");Jinja 模板用 {{ _("text") }},Vue 在 script 用 __()、template 用 {{ __() }}。DocType 标签、描述、Select 选项、工作流状态、打印格式标签、报表列标签等由框架自动提取,无需 _()。
翻译文件位置:v14 为 apps/{app}/{app}/translations/{lang}.csv;v15+ 为 apps/{app}/{app}/locale/{lang}/LC_MESSAGES/{app}.po;用户覆盖存于 Translation DocType,优先级最高。CSV 需 UTF-8 无 BOM,所有字段用双引号,context 列可空但必须存在。
常用命令:bench --site {site} get-untranslated {lang} {output.csv};bench update-translations {lang} {untranslated.csv} {translated.csv};v15+ 可用 bench generate-pot-file --app {app}、bench migrate-csv-to-po --app {app}、bench compile-po-to-mo --app {app}。
限制与注意:提取器基于 AST/token,无法提取 f-string、字符串拼接、% 格式化、模板字面量、变量或三元表达式内的字符串,应改用位置占位符形式;字符串首尾空格会被裁剪。RTL 语言为 ar、he、fa、ps,可用 frappe.utils.is_rtl() 判断,CSS 应使用逻辑属性。v15+ 的 PO 文件需编译为 MO 才能运行时生效,修改后需 clear-cache。
适用场景:为 Frappe 自定义应用添加多语言支持、迁移 CSV 到 PO、排查未翻译字符串。其他细节暂未提供。