国际化
优质
小牛编辑
135浏览
2023-12-01
一般用于根据用户语言,需要输出不同的文案。如果没有国际化的封装,业务里面会有大量的判断,并且业务也不好维护,没法统一管理所有文案。
安装
composer require swoft/i18n
Git 仓库
参与贡献
欢迎参与贡献,您可以
- fork 我们的开发仓库 swoft/component
- 修改代码然后发起 PR
- 阅读 提交代码 的注意事项
配置参数
使用 i18n
功能,一共需要三步
- 资源文件夹中导入语言文本
- 配置文件中配置相关参数
- 调用相关方法完成文本转换
导入文本
我们在 resource/language/ 文件夹下可创建语言组文件夹与文本文件,一个语言组中可以有多个模板文件,如下所示。
# resource/language
|-- zh
|-- default.php
|-- msg.php
`-- en
|-- default.php
|-- msg.php
而文本格式是由关联数组组成. 键值为文本,我们可以在其中插入参数,格式大致如下:
// ../en/default.php
return [
// 文本中可用大括号注入参数
'sayhello' => 'Hey {name}!',
'saygoodbye' => 'Bye!',
];
// ../en/msg.php
return [
'sayhello' => "Wath's up! {name}",
'saygoodbye' => 'See you tomorrow!',
];
// ../zh/default.php
return [
'sayhello' => "早上好,{name}",
'saygoodbye' => '再见',
];
// ../zh/msg.php
return [
'sayhello' => "晚上好,{name}",
'saygoodbye' => '明天见',
];
相关配置
i18n
相关功能配置非常简单, 只需要在 app/bean.php
配置文件中,配置以下参数,即可开启国际化功能.参数描述见注释。
return [
// .... 其他配置
'i18n' => [
// 设置到文本资源目录
'resoucePath' => '@resource/language/', // 结尾斜线必须
// 设置默认文本文件夹名称
// 未填写则默认 en 文件夹
'defaultLanguage' => 'en',
// 设置默认文本文件名称
// 未填写则默认 default.php
'defualtCategory' => 'default',
],
// .... 其他配置
];
至此相关参数已配置完毕,下面就可以使用该功能了.
使用案例
语言转换仅仅至于要调用一个简单的方法, 下面是方法描述:
/**
* @param string $key 文本数组中,对应文本键值
* @param array $params 注入到文本中的参数,以关联数组的形式
[
'param1' => 'str1',
'param2' => 'str2'
]
* @param string $locale 资源文件夹下, 分组文件名称.
*/
\Swoft::t(string $key, array $params, string $locale): string
实例演示:
<?php declare(strict_types=1);
namespace App\Http\Controller;
use Swoft\Http\Server\Annotation\Mapping\Controller;
use Swoft\Http\Message\Request;
use Swoft\Http\Server\Annotation\Mapping\RequestMapping;
use Swoft\Http\Server\Annotation\Mapping\RequestMethod;
/**
* Test 用演示实例
*
* @since 1.0.0
*
* @Controller(perfix="test")
*/
class TestController
{
/**
* i18n 示例
*
* @RequestMapping(route="i18n", method={RequestMethod::GET})
*
* @return array
*/
public function i18n(Request $request):array
{
// 显示 language/en/default.php 文本模板:
// 'sayhello' => 'Hey {name}!',
$res['en'] = \Swoft::t('sayhello', ['name' => 'man']);
// 更换模板可以使用 '.'
// 显示 language/en/msg.php 模板
$res['en-msg'] = \Swoft::t('msg.sayhello', ['name' => 'man'], 'en');
// 显示 language/zh/default.php 模板
$res['zh'] = \Swoft::t('sayhello', ['name' => '李华'], 'zh');
// 显示 language/zh/msg.php 模板
$res['zh-msg'] = \Swoft::t('msg.sayhello', ['name' => '李华'], 'zh');
return $res;
}
// ...
}
结果输出:
{
"en": "Hey man!",
"en-msg": "Wath's up! man",
"zh": "早上好,李华",
"zh-msg": "晚上好,李华"
}