国际化

优质
小牛编辑
135浏览
2023-12-01

一般用于根据用户语言,需要输出不同的文案。如果没有国际化的封装,业务里面会有大量的判断,并且业务也不好维护,没法统一管理所有文案。

安装

composer require swoft/i18n

Git 仓库

参与贡献

欢迎参与贡献,您可以

配置参数

使用 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": "晚上好,李华"
}