# 多语言

这里先讨论 PHP 端的多语言,关于 JavaScript 的前端多语言,我们留在最后讲。

所有的语言文件都要按语种放在插件目录下的 lang 目录内,目前 Blessing Skin Server 支持英文(en)和简体中文(zh_CN)两种语言。所有的语言文件均为 YAML 文件,以 .yml 的后缀保存。

# 目录结构

lang 目录内可以根据您的需要继续建立更深层次的目录。访问时,只需用小数点.来表示目录结构。

如,lang 目录有如下结构:

/lang
    /en
        /user
            /baby
                /info.yml
    /zh_CN
        /user
            /baby
                /info.yml

访问 info.yml 时,您需要像这样来定位:user.baby.info

# 语言文件结构

语言文件内以键-值对的形式记录文本,下面是一个例子:

title: 欢迎访问

content:
    header: 您好,:name
    footer: '某些时候您可以用引号包住语言值'
    body: |
        这是
        多行
        文本

# 多级结构

语言文件内也可以根据需要进行层级分类,访问时,仍然使用小数点.。如,若您需要访问 contentfooter 的值,则应该是:content.footer

我们假设上面这个例子就是前文所提的 info.yml,那么实际应用中,就应该是:

user.baby.info.content.footer

切记,上面只是例子,在实际的应用中,您必须加上命名空间

# 占位符

就像上面的例子那样,您可能希望在某些时候动态地显示一些内容。使用字符串拼接是不恰当的,您应该使用占位符。

使用一个英文冒号:以及变量名即可成为一个占位符

# 多行文本

您可以使用|来表示多行文本的开头

# 调用语言文件

通过 trans 函数,您就能方便地使用您的语言文件,如,您可以在您的视图文件中这样使用(以 Twig 为例):

{{ trans('user.baby.info.content.footer') }}

对于占位符,则需要您相应地传递数据(以 Twig 为例):

{{ trans('user.baby.info.content.header', {name: username}) }}

# 前端的多语言(Blessing Skin v3)

JavaScript 的语言文件名必须为 locale.js,并且位于各个语种的目录下,即:

/lang
    /en
        /locale.js
    /zh_CN
        /locale.js

JavaScript 的多语言以 JavaScript 对象的形式保存,如:

$.locales['zh_CN'].hello = {
  title: '欢迎访问',
  content: {
    header: '您好,:name',
    footer: '没有了',
    body: '这是' +
      '多行' +
      '文本'
  }
}

其中,$.locales['zh_CN'] 表示简体中文,$.locales['en'] 表示英文。

例子中的 hello 类似于命名空间,起区分的作用。

占位符的用法与上文的 YAML 文件的用法一致,即使用一个英文冒号:以及变量名。

使用语言文件也同样使用 trans 函数,基本用法与 PHP 中的多语言相同。注意对于向占位符传递数据,应该使用 JavaScript 对象,如:

trans('hello.content.header', { name: userName })

注意,不要忘了 注册多语言

# 前端的多语言(Blessing Skin v4)

在 Blessing Skin v4 中使用多语言与在 v3 中类似。不同之处在于,语言文件中不需要声明语种:

- $.locales['zh_CN'].hello = {
+ blessing.i18n.hello = {
    title: '欢迎访问',
    content: {
      header: '您好,:name',
      footer: '没有了',
      body: '这是' +
        '多行' +
        '文本'
    }
  }

使用 trans 函数的方式也相同。

# 前端的多语言(Blessing Skin v5)

在 Blessing Skin v5 中不再需要编写 JavaScript 代码。 直接在 lang/{locale} 目录下创建一个 front-end.yml,并在其中像其它的 l10n 文件那样编写文本即可,不再需要手动注册

接下来在需要使用 l10n 的地方,同样调用 trans 全局函数即可。注意 front-end.yml 下的文本条目会被保存在以插件 name 为键的对象下。

如,假设插件 name 为 testfront-end.yml 有如下内容:

name: kumiko

则只需要在其它 JavaScript 代码中像这样写:

trans('test.name')  // ==> kumiko