自定义Frappe应用中的翻译

如何在自定义 Frappe 应用中添加和管理翻译:分步指南


1. 创建 translations 文件夹

步骤:
在您的自定义应用目录中,于以下位置创建一个名为 translations 的文件夹:

apps/your-app/your-app/translations/

为什么?
Frappe 会自动检测此文件夹。它遵循“约定优于配置”的原则,因此将翻译文件放在此处可确保它们无需额外设置即可被识别。


2. 添加翻译 CSV 文件

步骤:
在 translations 文件夹中为每种语言创建一个 CSV 文件。例如:

  • ar.csv(阿拉伯语)
  • es.csv(西班牙语)

CSV 结构:

"source_string","translated_string","context"
"agent","توكيل",""
"continue","إستكمال",""

为什么?

  • 第 1 列(source_string):代码中使用的原始字符串(例如:_("continue"))。
  • 第 2 列(translated_string):该字符串的翻译版本。
  • 第 3 列(context):可选。用于澄清翻译的上下文。

第三列是可选的,可以留空。


3. 在代码中使用可翻译字符串

步骤:
在您的 Python、HTML 或 JavaScript 代码中使用 _() 包裹字符串:

from frappe import _

def my_function():
    message = _("continue")  # Will be replaced with "إستكمال" for Arabic users

为什么?
_() 函数将字符串标记为可翻译。在运行时,Frappe 会根据用户的语言偏好替换它们。


4. 构建站点

仅当您在自定义前端 JS 中使用 __() 并更改了 JS 文件时才需要。

步骤:
运行构建命令:

bench --site your-site build

5. 验证翻译

步骤:

  • 在 Frappe 中将用户语言切换为阿拉伯语(或目标语言)。
  • 检查 _("continue") 现在是否显示为 "إستكمال"。

为什么?
这确认了 Frappe 能正确地将源字符串映射到其对应的翻译版本。


关键说明

语言代码

  • CSV 文件名必须与 Frappe 的语言代码匹配(例如:阿拉伯语为 ar)。
  • 您可以在 Frappe > 语言设置 中找到这些代码。

文件夹位置

  • translations 文件夹必须位于应用包目录的根目录(不能在子模块内)。

性能

  • 翻译在构建期间会被缓存。
  • 编辑翻译文件后,务必重启 bench。

回退行为

  • 如果某个字符串未被翻译,Frappe 将使用原始(源)字符串。

我需要构建或迁移站点吗?

不需要,Frappe 会根据登录用户的语言偏好,在运行时动态从您的 translations/lang.csv 文件中加载翻译。
您只需刷新浏览器或在必要时清除缓存即可。

仅当您在自定义前端 JS 中使用 __() 并更改了 JS 文件时,才需要 bench build。


示例工作流程

  1. 创建:

    apps/my_app/my_app/translations/ar.csv
    
  2. 添加条目:

    "welcome_message","مرحبا بك!",""
    
  3. 在代码中使用:

    _("welcome_message")
    
  4. 清除缓存:

  • 如果翻译未立即生效,请使用它
    bench --site my-site clear-cache
    
  1. 构建:
  • 仅当您在自定义前端 JS 中使用 __() 并更改了 JS 文件时才需要
    bench --site my-site build
    
  1. 在阿拉伯语界面中进行测试。

解释上下文?

上下文本质上是一种元数据,
用于向翻译使用者说明该翻译应在何时何地使用。
因为有时同一个词会有不同的含义。

例如:

"charge","شحن",""
"charge","رسوم",""

这里我们有相同的词,但含义不同(使用上下文不同)
因此,为了区分它们,我们需要为其提供上下文。

"charge","شحن","mobile phone charge"
"charge","رسوم","invoice line"

在代码中:

_("charge") # here we don't know which meaning (context to use)
_("charge", context="mobile phone charge") # here we mean شحن
_("charge", context="invoice line") # here we mean رسوم