i18n国际化

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

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

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

语言设定

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

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

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

  1. $ tree ./language/
  2. ./Language/
  3. ├── de
  4. ├── en
  5. ...
  6. ├── zh_cn
  7. └── zh_tw

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

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

翻译包

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

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

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

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

通用的翻译写法

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

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

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

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

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

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

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

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

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

扩展:添加翻译包

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

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

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

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

原文: http://docs.phalapi.net/#/v2.0/i18n