企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# i18n国际化 一直以来,在项目开发中,都是以硬编码方式返回中文文案或者提示信息的,如: ```php $rs['msg'] = '用户不存在'; ``` 这种写法在根本不需要考虑国际化翻译的项目中是没问题的,但当开发的项目面向的是国际化用户人群时,使用i18n则是很有必要的。 ## 语言设定 在初始化文件```./public/init.php```中,通过快速函数```\PhalApi\SL($language)```可以设定当前所使用的语言。例如设置语言为简体中文,可以: ```php // 翻译语言包设定 \PhalApi\SL('zh_cn'); ``` 设定的语言即为语言目录下对应语言的目录名称,例如可以是:de、en、zh_cn、zh_tw等。 ```bash $ tree ./language/ ./Language/ ├── de ├── en ... ├── zh_cn └── zh_tw ``` 此处,也可以通过客户端传递参数动态选择语言。简单地: ```php \PhalApi\SL(isset($_GET['lan'] ? $_GET['lan'] : 'zh_cn'); ``` ## 翻译包 翻译包的文件路径为:```./language/语言/common.php```,例如简体中文zh_cn对应的翻译包文件为:```./Language/zh_cn/common.php```。此翻译包文件返回的是一个数组,其中键为待翻译的内容,值为翻译后的内容。例如: ```php return array( 'Hi {name}, welcome to use PhalApi!' => '{name}您好,欢迎使用PhalApi!', 'user not exists' => '用户不存在', ); ``` 对于需要动态替换的参数,可以使用大括号括起来,如名字参数name对应为{name}。除了这种关联数组的方式,还可以使用索引数组的方式来传递动态参数。例如: ```php return array( ... ... 'I love {0} because {1}' => '我爱{0},因为{1}', ); ``` ## 通用的翻译写法 当需要进行翻译时,可以使用快速函数[\PhalApi\T($msg, $params = array())](https://github.com/phalapi/kernal/blob/master/src/functions.php),第一个参数为待翻译的内容,第二个参数为可选的动态参数。例如前面的文案调整成: ```php $rs['msg'] = \PhalApi\T('user not exists'); ``` 最后显示的内容将是对应翻译包里的翻译内容,如这里对应的是: ```php // 文件 ./language/zh_cn/common.php return array( ... ... 'user not exists' => '用户不存在', ); ``` 当翻译中存在动态参数时,根据待翻译中参数的传递方式,可以相应提供对应的动态参数。例如对于关联数组方式,可以: ```php // 输出:dogstar您好,欢迎使用PhalApi! echo \PhalApi\T('Hi {name}, welcome to use PhalApi!', array('name' => 'dogstar')); ``` 关联数组方式中参数的对应关系由键名对应,而索引数组方式则要严格按参数出现的顺序对应传值,例如: ```php // 输出:我爱PhalApi,因为它专注于接口开发 echo \PhalApi\T('I love {0} because {1}', array('PhalApi', '它专注于接口开发')); ``` 若是翻译不存在时怎么办?翻译不存在,有两种情况:一种是指定的语言包不存在;另一种是语言包存在但翻译不存在。无论何种情况,当找不到翻译时,都会返回待翻译时的内容。 ## 扩展:添加翻译包 默认的翻译包存放在项目根目录的language目录下。当需要添加其他路径的翻译包时,例如在进行扩展类库开发时。 对于也拥有翻译包的扩展类库,其翻译包文件可以放在扩展类库本身目录的language子目录中,其结构一样。但由于不在项目根目录下,这时需要手动引入翻译包目录,以便框架可以加载识别。当需要加载其他路径的翻译包时,可以使用[PhalApi/Translator::addMessage($path)](https://github.com/phalapi/kernal/blob/master/src/Translator.php)进行添加,后面添加的翻译包会覆盖前面的翻译包。例如User扩展类库中的: ```php PhalApi\Translator::addMessage('/path/to/user/language'); ``` 这样,就可以添加```/path/to/user/language```目录下的翻译包了。