店面本地化文件是以 .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 语言标记命名法,其中第一个小写字母代码代表语言,第二个大写字母代码代表地区。
例如
Language | Format |
English – Great Britain | en-GB.json |
Spanish – Spain | es-ES.json |
French – Canada | fr-CA.json |
如果语言不针对特定地区,可以使用 2 个字母的小写语言表示法。
例如
Language | Format |
Finnish – All regions | fi.json |
此外,您还必须指定一个默认本地化文件。
默认本地化文件
您必须指定一个默认本地化文件,文件格式为 *.default.json,其中 * 是您选择的语言。该文件包含主题默认语言的翻译。只允许使用一个默认文件。
大多数主题使用 en.default.json,将主题的默认语言设置为英语。
内容
为确保正确映射翻译,并使商家的翻译过程尽可能简单,您应组织关键字结构以反映主题结构。
例如,结构的前两层可能如下所示:
1st level | 2nd level |
general | 404, breadcrumbs, search (results page and blank slates), pagination |
blogs | article, article comments, blog sidebar |
cart | cart contents, updates, notes, link to checkout |
collection | collection, collection loop |
products | product, product loop, related products |
layout | general field titles and identifiers |
customer | account, orders (list and details), account activation, addresses, login, password, registration |
contact | contact form, form errors |
home_page | blank slate, featured, help |
gift_cards | title, 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
发表回复