# 多语言
这里先讨论 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: |
这是
多行
文本
# 多级结构
语言文件内也可以根据需要进行层级分类,访问时,仍然使用小数点.
。如,若您需要访问 content
内 footer
的值,则应该是: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 为 test
,front-end.yml
有如下内容:
name: kumiko
则只需要在其它 JavaScript 代码中像这样写:
trans('test.name') // ==> kumiko