店面本地化文件

店面本地化文件是以 .json 文件为扩展名的 JSON 文件。它们承载了整个主题中店面显示内容的翻译字符串。商家可以通过 Shopify 语言编辑器访问这些翻译。

注意事项
Shopify 通过 Shopify 语言编辑器提供结账和系统消息的翻译。但是,Shopify 将这些数据存储在店面语言文件之外。

主题布局、模板、片段和 Liquid 资产可以使用 Liquid translation filter (t filter) 引用这些翻译,而不是硬编码文本字符串。这会从本地文件中返回活动语言的相应翻译字符串。

使用 t filter时,可以对翻译进行插值和复数化处理,也可以对任何日期和时间进行本地化处理。

位置

店面本地化文件位于主题的 locales 目录中:

└── theme
    ...
    ├── config
    └── locales
      ├── en.default.json
      ...

Schema

店面本地化文件需要遵循特定的命名结构。它们还遵循基本的组织结构:

  • 类别: 翻译的顶级类别。
  • 组: 类别内翻译的二级分组。
  • 描述: 第三级,表示单个翻译。
{
  "my_category": {
    "my_group": {
      "my_description": "translation text",
      ...
    },
    ...
  },
  ...
}

提示
在命名翻译描述时,尽量使用足够的描述性文字,例如,blogs.article_comment.submit_button_text 就比 blogs.article_comment.submit 要好。

名称结构

本地文件命名必须遵循标准的 IETF 语言标记命名法,其中第一个小写字母代码代表语言,第二个大写字母代码代表地区。
例如

LanguageFormat
English – Great Britainen-GB.json
Spanish – Spaines-ES.json
French – Canadafr-CA.json

如果语言不针对特定地区,可以使用 2 个字母的小写语言表示法。
例如

LanguageFormat
Finnish – All regionsfi.json

此外,您还必须指定一个默认本地化文件。

默认本地化文件

您必须指定一个默认本地化文件,文件格式为 *.default.json,其中 * 是您选择的语言。该文件包含主题默认语言的翻译。只允许使用一个默认文件。
大多数主题使用 en.default.json,将主题的默认语言设置为英语。

内容

为确保正确映射翻译,并使商家的翻译过程尽可能简单,您应组织关键字结构以反映主题结构。
例如,结构的前两层可能如下所示:

1st level2nd level
general404, breadcrumbs, search (results page and blank slates), pagination
blogsarticle, article comments, blog sidebar
cartcart contents, updates, notes, link to checkout
collectioncollection, collection loop
productsproduct, product loop, related products
layoutgeneral field titles and identifiers
customeraccount, orders (list and details), account activation, addresses, login, password, registration
contactcontact form, form errors
home_pageblank slate, featured, help
gift_cardstitle, usage terms

注意事项
如果您在片段中使用翻译,则应将其归入与片段角色最相关的类别。例如,如果您有一个 related-products.liquid 片段,那么任何相关的翻译都应包含在产品组中。

应用

  • 在使用店面本地化文件时,请注意以下几点:
  • 引用店面翻译
  • 插值
  • 防止翻译被转义
  • 翻译复数化
  • 日期和时间本地化
  • 结账和系统消息

引用店面翻译

要从店面本地化文件中引用主题活动语言的翻译,可以使用翻译key和Liquid translation filter (t filter).

例如,假设您有英语、法语和西班牙语的本地化文件。在这种情况下,您可能会在每个相关的本地化文件中包含以下内容:

/locales/en.default.json (English)

{
  "blog": {
    "comment": {
      "email": "Your email"
    }
  }
}

/locales/fr.json (French)

{
  "blog": {
    "comment": {
      "email": "Votre adresse courriel"
    }
  }
}

/locales/es-ES.json (Spanish)

{
  "blog": {
    "comment": {
      "email": "Su correo electrónico"
    }
  }
}

要引用这个译文,可以使用类似下面的方法:

<span>{{ 'blog.comment.email' | t }}</span>

提示
在 Liquid 中引用翻译key时,必须用单引号(’)封装。

输出结果根据每个本地文件中的设置进行定制:

// English
<span>Your email</span>
// French
<span>Votre adresse courriel</span>
// Spanish
<span>Su correo electrónico</span>

插值

翻译字符串可以进行插值,这意味着您可以在字符串中包含变量,在Liquid代码引用该字符串时,变量将动态填充。例如,您可以在区域文件中包含以下内容:

/locales/en.default.json

{
  "layout": {
    "header": {
      "hello_user": "Hello {{ name }}!"
    }
  }
}

在主题中引用该翻译时,可以为name变量指定一个值:

/layout/theme.liquid

{% if customer %}
  <h1>{{ 'layout.header.hello_user' | t: name: customer.first_name }}</h1>
{% endif %}

对于一个名为“Jane”的顾客,此代码将输出以下内容:

<h1>Hello Jane!</h1>

传递多个参数

使用插值法可以传递多个参数,参数之间用逗号(,)隔开。例如,如果您想扩展上面的示例以显示客户的姓和名,那么您可以将翻译字符串和主题引用调整为以下内容:

/locales/en.default.json

{
  "layout": {
    "header": {
      "hello_user": "Hello {{ first_name }} {{ last_name }}!"
    }
  }
}

/layout/theme.liquid

{% if customer %}
  <h1>
    {{ 'layout.header.hello_user' | t: first_name: customer.first_name, last_name: customer.last_name }}
  </h1>
{% endif %}

如果客户名为 “Jane Doe”,则代码输出如下:

<h1>Hello Jane Doe!</h1>

防止翻译被转义

默认情况下,翻译的内容会被转义,即任何HTML字符都会转换为其等价实体。

您可以在翻译键的描述级别后添加后缀_html 以防止翻译内容被转义。例如,以下翻译输出的内容会被转义,导致<strong>标签显示为纯文本:

{
  "layout": {
    "header": {
      "announcement_bar_text": "Spend $50 and get <strong>FREE</strong> shipping",
    }
  }
}

添加 _html 后缀可防止输出内容被转义,从而使<strong>标记渲染为正确的 HTML:

{
  "layout": {
    "header": {
      "announcement_bar_text_html": "Spend $50 and get <strong>FREE</strong> shipping",
    }
  }
}

提示
_html 后缀对于在翻译中包含 HTML 字符或在 JavaScript 中使用翻译很有用

翻译复数化

通过向translation filter (t filter) 传递count属性,可以将复数化应用于翻译。
支持由 Unicode Consortium 的 CLDR 定义的以下复数化key:

  • few
  • many
  • one
  • other
  • two
  • zero

例如,下面的翻译和翻译参考会返回以下输出结果:

/locales/en.default.json

{
  "customers": {
    "orders": {
      "order_count": {
        "one": "You've made {{ count }} order with us",
        "other": "You've made {{ count }} orders with us"
      }
    }
  }
}

/layout/theme.liquid

{% if customer %}
  <h1>{{ 'customers.order.order_count' | t: count: customer.orders_count }}</h1>
{% endif %}

输出

// count == 1
<h1>You've made 1 order with us</h1>
// count == 12
<h1>You've made 12 orders with us</h1>

有关不同语言复数化规则的更多信息,请参阅 Unicode 语言复数规则表

日期和时间本地化

日期和时间可通过 date 和 time_tag Liquid filters呈现。每种filters都有默认格式选项,可根据商店的常用语言以适当的格式显示:

  • Date filter默认格式选项
  • time_tag filte默认格式选项

例如,以下 Liquid 会生成以下输出:

{{ order.created_at | date: format: 'abbreviated_date' }}
Dec 31, 2018

自定义格式

通过添加date_formats对象,可以在本地化文件中包含自定义格式:

locales/en.json

{
  "date_formats": {
    "month_and_year": "%B %Y"
  }
}

这些格式必须使用与 Ruby strftime 方法相同的参数。您可以在 Ruby 文档中找到这些参数的列表,或使用 strfti.me 等网站。

注意事项
确保所有 locale 文件都包含自定义格式。如果活动语言的 locale 文件中缺少自定义格式,则会出现 Liquid 错误

使用上述自定义格式,以下 Liquid 会生成以下输出:

{{ order.created_at | date: format: 'month_and_year' }}
December 2018

结账和系统信息

Shopify 提供以下语言的结账和系统信息:

  • Bulgarian (Bulgaria)
  • Chinese (Simplified)
  • Chinese (Traditional)
  • Croatian (Croatia)
  • Czech
  • Danish
  • Dutch
  • English
  • Finnish
  • French
  • German
  • Greek
  • Hindi
  • Hungarian
  • Indonesian
  • Italian
  • Japanese
  • Korean
  • Lithunian (Lithuania)
  • Malay
  • Norwegian (Bokmål)
  • Polish
  • Portuguese (Brazil)
  • Portuguese (Portugal)
  • Romania (Romanian)
  • Russian
  • Slovak
  • Slovenian
  • Spanish
  • Swedish
  • Thai
  • Turkish

注意事项
如果您使用的语言不在上述列表中,那么您需要通过 Shopify 语言编辑器手动输入结账和系统消息的翻译。

原文:https://shopify.dev/docs/themes/architecture/locales/storefront-locale-files#pluralize-translations

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注