# 国际化

# \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"
       }
*/
1
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 !"
1
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 !"
1
2
3
4
5

# __toString()

\Stringable接口方法,允许Language实例字符串化

  • 返回string

  • 示例

testPoint((string) new Language('你好世界!'));
// 1-1    string(13) "你好世界!"
1
2

# ::find()

根据ID找实例

  • 参数

    • string|int $id
  • 返回self

  • 示例

new Language('你好世界!', 1);
testPoint((string) Language::find(1));
// 1-1    string(13) "你好世界!"
1
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 !"
1
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!"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

提示

你可能发现上面一些地方传入了纯数组,而非语种文本映射数组。那是因为Dce配置了汉英语种数字键,0为汉1为英,这样可以更方便的配置。语种数组键配置不支持扩展,所以任何其他语种,都必须严格按照语种为键文本为值的格式配置,如lang(['中文', 'eng', 'ru' => '乌拉ypa'])