在构建多语言网站时,如何确保模板中的动态文本能够根据访问者的语言设置正确显示,是网站运营者经常面临的挑战。安企CMS(AnQiCMS)凭借其灵活的模板引擎和强大的多语言支持,提供了优雅的解决方案。今天,我们就来深入探讨在多语言网站中,AnQiCMS 模板的 yesno 过滤器如何与国际化机制相结合,实现三种状态文本的精准呈现。

认识 yesno 过滤器及其三种状态

在处理布尔值或类布尔值数据时,我们常常需要将其转换为用户友好的文本。安企CMS 模板中的 yesno 过滤器便是为此而生。它的基本作用是根据输入值的真假或空值状态,输出三种预设文本中的一种。

具体来说,yesno 过滤器会按照以下规则判断并输出:

  • 如果输入值被判定为 true(例如,一个非零数字、非空字符串、布尔值 true),它将输出第一个参数对应的文本。
  • 如果输入值被判定为 false(例如,零、空字符串、布尔值 false),它将输出第二个参数对应的文本。
  • 如果输入值是 nil(空值)或者是一个不确定的状态,它将输出第三个参数对应的文本。

如果没有为 yesno 过滤器提供自定义参数,它会默认输出 “yes”、”no” 和 “maybe”。例如,假设我们有一个 archive.Status 字段,其值可能是 truefalsenil

{{ archive.Status|yesno }}

如果 archive.Statustrue,输出 “yes”;为 false,输出 “no”;为 nil,输出 “maybe”。

国际化文本的挑战

尽管 yesno 过滤器能方便地展示三种状态,但其默认输出的 “yes”、”no”、”maybe” 是英文,这对于多语言网站显然不够。我们希望在中文环境下显示 “是”、”否”、”未知”,在法文环境下显示 “Oui”、”Non”、”Peut-être” 等。直接在模板中写死这些翻译,不仅会使模板代码冗长难以维护,更无法实现自动切换语言。

这时,安企CMS 的国际化翻译机制就派上用场了。

安企CMS 的国际化翻译机制 (tr 标签)

安企CMS 提供了一个 tr(translate)标签,用于从预定义的语言包中获取翻译文本。为了使用它,我们需要在模板根目录下的 locales 文件夹中创建对应语言的 YAML 文件。例如,对于中文,可以创建 zh-cn/default.yml;对于英文,创建 en-us/default.yml

zh-cn/default.yml 示例:

"status_active": "已启用"
"status_inactive": "已禁用"
"status_unknown": "状态未知"
"approved": "已通过"
"rejected": "已拒绝"
"pending": "待处理"

en-us/default.yml 示例:

"status_active": "Active"
"status_inactive": "Inactive"
"status_unknown": "Unknown Status"
"approved": "Approved"
"rejected": "Rejected"
"pending": "Pending"

在模板中,我们可以通过 {% tr "翻译键名" %} 的方式来调用对应的翻译文本。安企CMS 会根据当前网站的语言设置(或用户选择的语言)自动加载正确的语言文件并返回翻译后的字符串。

<p>当前状态:{% tr "status_active" %}</p>

如果当前网站语言设置为中文,将输出 “当前状态:已启用”;如果设置为英文,则输出 “当前状态:Active”。

yesno 过滤器与 tr 标签的完美结合

现在,让我们把 yesno 过滤器的三种状态参数与 tr 标签结合起来,实现真正的国际化。yesno 过滤器允许我们自定义输出的三种状态文本,而 tr 标签正好可以为这些状态提供多语言的文本。

假设我们的 archive.IsPublished 字段表示文章是否已发布(true 表示已发布,false 表示未发布,nil 表示草稿或待审核)。我们可以定义以下翻译键:

zh-cn/default.yml 中:

"published": "已发布"
"unpublished": "未发布"
"draft_or_pending": "草稿/待审核"

en-us/default.yml 中:

"published": "Published"
"unpublished": "Unpublished"
"draft_or_pending": "Draft/Pending"

在模板中,我们就可以这样使用:

<p>发布状态:{{ archive.IsPublished|yesno:"{% tr 'published' %},{% tr 'unpublished' %},{% tr 'draft_or_pending' %}" }}</p>

在这里,"published""unpublished""draft_or_pending"tr 标签的参数,而整个 {% tr '...' %} 表达式的计算结果,会作为 yesno 过滤器的一个状态参数。

  • archive.IsPublishedtrue 时,yesno 过滤器将调用 {% tr 'published' %} 返回的文本。
  • archive.IsPublishedfalse 时,yesno 过滤器将调用 {% tr 'unpublished' %} 返回的文本。
  • archive.IsPublishednil 时,yesno 过滤器将调用 {% tr 'draft_or_pending' %} 返回的文本。

这样一来,无论网站当前显示的是哪种语言,这三种状态的文本都能被精确地翻译并呈现给用户,大大提升了多语言网站的用户体验和可维护性。

实践中的小贴士

  • 翻译键名统一:保持翻译键名(如 publishedunpublished)在所有语言文件中一致,这是实现国际化的基础。
  • 默认语言包设置:在安企CMS 后台的“全局功能设置”中,可以设置网站的默认语言包。同时,通过 tag-languages.md 文档中提到的方法,可以在前端提供语言切换功能,让用户自由选择。
  • 测试多语言环境:在开发和部署过程中,务必切换不同语言进行测试,确保所有 yesno 过滤器结合 tr 标签的地方都能正确显示对应的翻译文本。
  • 处理缺失翻译:如果某个翻译键在当前语言文件中不存在,安企CMS 的 tr 标签通常会直接输出键名本身(例如 published),这有助于我们发现并补充遗漏的翻译。

通过这种方式,安企CMS 不仅简化了多语言内容管理,也为模板开发者提供了强大且直观的工具,以应对各种复杂的国际化显示需求。


常见问题 (FAQ)

  1. 安企CMS 是如何知道要使用哪个语言包进行翻译的? 安企CMS 会根据网站的当前语言设置来加载对应的语言包。这个设置可以在后台的“全局功能设置”中配置,也可以通过前端提供的语言切换功能(如果模板支持)来动态改变。当请求到达时,系统会识别当前会话或 URL 参数中的语言标识,从而选择正确的 locales 文件夹下的语言文件进行匹配。

  2. 如果我只需要“是”和“否”两种状态,yesno 过滤器中的第三个参数可以省略吗? yesno 过滤器设计上期望接收三个参数来对应三种状态