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');