# 国际化
# \dce\i18n\Locale
本地化类,储存或获取客户端本地化信息
# ::CN
string = 'CN'
中国国家代码 ISO_3166标准
# ->lang
string
语种代码。Dce默认自动取url或cookie里的lang
参数作为用户语种,你可以通过配置自定义获取的方法。
# ->country
string
国家代码。默认为配置的默认值,你可以通过配置自定义获取的方法。
# ::client()
若在请求处理过程中调用,则返回请求客户端的本地化信息,否则返回服务器环境的本地化信息
返回
self
示例
testPoint(Locale::client());
/*
1-1 object(dce\i18n\Locale)#86 (2) {
["lang"] => string(2) "zh"
["country"] => string(2) "CN"
}
*/
2
3
4
5
6
7
# ::server()
取服务器环境的本地化实例(即默认的本地化配置值)
- 返回
self
# \dce\i18n\Language
语种文本映射类。本类实现了静态实例器接口,你可以实例化、作为静态属性的类型约束、或作为静态属性或常量的注解的形式来使用,后两种形式使用更便捷。
# ::ZH
string = 'zh'
中文语种代码 ISO_639标准
# ::EN
string = 'en'
# __construct()
构造方法
- 参数
string|Stringable|array $textMapping
语种文本映射表,若传入字符串,则作为文本自动包装为默认语种的映射string|int|null $id = null
实例ID,若传入了该参数,则将保存ID与实例的映射表,后续可以通过该ID找到语种文本实例
# ->lang()
设置渲染语种(当系统主动向用户发送信息时需要用到)
参数
string $lang
语种代码
返回
self
示例
testPoint((string) new Language(['你好 Dce !', 'Hello Dce !'])->lang('en'));
// 1-1 string(11) "Hello Dce !"
2
# ->format()
格式化语种文本
参数
string|Stringable ...$parameters
格式化用的替换参数(以PHP方法sprintf()
实现)
返回
self
示例
testPoint((string) (new Language(['zh' => '你好 %s !', 'en' => 'Hello %s !']))->format('Dce'));
// 1-1 string(12) "你好 Dce !"
// 然后你可以在命令行或url中追加lang=en的参数重试
// 1-1 string(11) "Hello Dce !"
2
3
4
5
# __toString()
\Stringable
接口方法,允许Language实例字符串化
返回
string
示例
testPoint((string) new Language('你好世界!'));
// 1-1 string(13) "你好世界!"
2
# ::find()
根据ID找实例
参数
string|int $id
返回
self
示例
new Language('你好世界!', 1);
testPoint((string) Language::find(1));
// 1-1 string(13) "你好世界!"
2
3
# 快捷方法
# lang()
快捷的构建/获取一个Language实例
参数
int|string|Stringable|array $textMapping
语种文本映射表,若传入字符串,则作为文本自动包装为默认语种的映射,若传入int且未传id,则作为id查实例string|int|null $id = null
实例ID,若传入了该参数,则将保存ID与实例的映射表,后续可以通过该ID找到语种文本实例
返回
\dce\i18n\Language
示例
lang('你好世界!', 1);
testPoint((string) lang(1));
// 1-1 string(13) "你好世界!"
testPoint((string) lang(['你好 %s !', 'Hello %s !'])->format(lang(['世界', 'world'])));
// 1-1 string(12) "你好 世界 !"
// 然后你可以在命令行或url中追加lang=en的参数重试
// 1-1 string(11) "Hello World !"
2
3
4
5
6
7
8
# 映射动态扩展
假如你的业务拓展到了俄罗斯,但之前的代码你只配置了汉英双语,现在要去拓展俄语,这将非常麻烦,你得修改所有多语种的地方。Dce当然有考虑到这个问题,所以设计了取语种文本映射表方法的配置项,你可以在该方法中从缓存或数据库等语种文本配置中,查询当前ID对应的配置,返回语种文本映射表,Dce会将该表自动缓存,下次取时不会再调用该方法。
- 示例
// config.php
return [
'app' => [
'lang_mapping' => function ($textId) {
if ($textId === 1) {
// 此处是伪代码, 实际上你应该是从数据库等配置中查询返回映射表
return ['ru' => '乌拉ypa!'];
}
return [];
}
]
];
// 使用 (在控制器方法中粘贴下述代码)
// 在命令行或url追加参数lang=ru测试
testPoint((string) lang(['中文', 'eng'], 1));
// 1-1 string(10) "乌拉ypa!"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
提示
你可能发现上面一些地方传入了纯数组,而非语种文本映射数组。那是因为Dce配置了汉英语种数字键,0为汉1为英,这样可以更方便的配置。语种数组键配置不支持扩展,所以任何其他语种,都必须严格按照语种为键文本为值的格式配置,如lang(['中文', 'eng', 'ru' => '乌拉ypa'])
。