2.7 PhalApi 2.x 国际化

2018-07-28 21:25 更新

i18n国际化

一直以来,在项目开发中,都是以硬编码方式返回中文文案或者提示信息的,如:

$rs['msg'] = '用户不存在';

这种写法在根本不需要考虑国际化翻译的项目中是没问题的,但当开发的项目面向的是国际化用户人群时,使用i18n则是很有必要的。

语言设定

在初始化文件./public/init.php中,通过快速函数\PhalApi\SL($language)可以设定当前所使用的语言。例如设置语言为简体中文,可以:

// 翻译语言包设定
\PhalApi\SL('zh_cn');   

设定的语言即为语言目录下对应语言的目录名称,例如可以是:de、en、zh_cn、zh_tw等。

$ tree ./language/
./Language/
├── de
├── en
...
├── zh_cn
└── zh_tw

此处,也可以通过客户端传递参数动态选择语言。简单地:

\PhalApi\SL(isset($_GET['lan'] ? $_GET['lan'] : 'zh_cn');

翻译包

翻译包的文件路径为:./language/语言/common.php,例如简体中文zh_cn对应的翻译包文件为:./Language/zh_cn/common.php。此翻译包文件返回的是一个数组,其中键为待翻译的内容,值为翻译后的内容。例如:

return array(
    'Hi {name}, welcome to use PhalApi!' => '{name}您好,欢迎使用PhalApi!',
    'user not exists' => '用户不存在',
);

对于需要动态替换的参数,可以使用大括号括起来,如名字参数name对应为{name}。除了这种关联数组的方式,还可以使用索引数组的方式来传递动态参数。例如:

return array(
    ... ...
    'I love {0} because {1}' => '我爱{0},因为{1}',
);

通用的翻译写法

当需要进行翻译时,可以使用快速函数\PhalApi\T($msg, $params = array()),第一个参数为待翻译的内容,第二个参数为可选的动态参数。例如前面的文案调整成:

$rs['msg'] = \PhalApi\T('user not exists');

最后显示的内容将是对应翻译包里的翻译内容,如这里对应的是:

// 文件 ./language/zh_cn/common.php
return array(
    ... ...
    'user not exists' => '用户不存在',
);

当翻译中存在动态参数时,根据待翻译中参数的传递方式,可以相应提供对应的动态参数。例如对于关联数组方式,可以:

// 输出:dogstar您好,欢迎使用PhalApi!
echo \PhalApi\T('Hi {name}, welcome to use PhalApi!', array('name' => 'dogstar'));

关联数组方式中参数的对应关系由键名对应,而索引数组方式则要严格按参数出现的顺序对应传值,例如:

// 输出:我爱PhalApi,因为它专注于接口开发
echo \PhalApi\T('I love {0} because {1}', array('PhalApi', '它专注于接口开发'));

若是翻译不存在时怎么办?翻译不存在,有两种情况:一种是指定的语言包不存在;另一种是语言包存在但翻译不存在。无论何种情况,当找不到翻译时,都会返回待翻译时的内容。

扩展:添加翻译包

默认的翻译包存放在项目根目录的language目录下。当需要添加其他路径的翻译包时,例如在进行扩展类库开发时。

对于也拥有翻译包的扩展类库,其翻译包文件可以放在扩展类库本身目录的language子目录中,其结构一样。但由于不在项目根目录下,这时需要手动引入翻译包目录,以便框架可以加载识别。当需要加载其他路径的翻译包时,可以使用PhalApi/Translator::addMessage($path)进行添加,后面添加的翻译包会覆盖前面的翻译包。例如User扩展类库中的:

PhalApi\Translator::addMessage('/path/to/user/language');

这样,就可以添加/path/to/user/language目录下的翻译包了。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号