15、Hyperf 3 快速使用 - 项目多语言-通向国际化

作者: 温新

分类: 【Hyperf 3 基础系列】

阅读: 950

时间: 2023-04-25 12:32:55

hi,我是温新,一名 PHPer

Hypref 版本:Hyperf 3.0

学习目标:学习项目怎么实现多语言化

Hyperf 对多语言支持非常友好,很轻松就能实现国际化。本篇文章分为两个小节,快速使用和详细学习。

快速使用:就是快速上手使用,不关心中其的具体方法,把目标实现了再说其他的。

详细学习:了解其中的配置、方法等使用。

快速使用

第一步:安装语言包

composer require hyperf/translation

第二步:发布配置文件

php bin/hyperf.php vendor:publish hyperf/translation

该命令会在 config/autoload 目录下生成 translation.php 配置文件,内容如下:

<?php

declare(strict_types=1);

return [
    // 默认语言
    'locale' => 'zh_CN',
    // 回退语言,当默认语言的语言文没有提供时
    // 就会使用回退语言对应的语言文件
    'fallback_locale' => 'en',
    // 语言文件存放的文件夹
    'path' => BASE_PATH . '/storage/languages',
];

第三步:创建语言文件目录并为每个目录添加一个 message.php 文件。

1)创建语言目录

mkdir -p storage/languages/en
mkdir -p storage/languages/zh_CN
mkdir -p storage/languages/ja

2)创建语言文件

<?php
// storage/languages/en/message.php
declare(strict_types=1);
return [
    'name' => 'Wang Meili',
];
<?php
// storage/languages/zh_CN/message.php
declare(strict_types=1);
return [
    'name' => '王美丽',
];
<?php
// storage/languages/ja/message.php
declare(strict_types=1);
return [
    'name' => '王美麗です',
];

第四步:业务代码中实现

<?php

namespace App\Controller\Test;

use Hyperf\Contract\TranslatorInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
use Hyperf\HttpServer\Contract\RequestInterface;
use Psr\Container\ContainerInterface;

#[Controller]
class LanguageController
{
    #[Inject]
    private TranslatorInterface $translator;

    #[GetMapping('/language/index')]
    public function index(RequestInterface $request)
    {
        $language = $request->input('language');
        // 设置语言
        $this->translator->setLocale($language);

        // 使用全局函数获取对应的语言
        return trans('message.name');
    }
}

第五步:测试

curl http://192.168.31.90:9501/language/index?language=en
Wang Meili
curl http://192.168.31.90:9501/language/index?language=zh_CN
王美丽
curl http://192.168.31.90:9501/language/index?language=ja
王美麗です

现在就已经完成了通过多语言走向国际化的道路。下面将开始详细学习那些方法。

详细学习

语言文件

Hyperf 中,所有语言默认存放中 storage/languages 目录下。

通过 config/autoload/translation.php 配置文件可以修改语言存放位置。

每种语言都对该目录下的一个子文件,如下案例:

/storage
    /languages
        /en
            messages.php
        /zh_CN
            messages.php

所有语言都是返回一个数组,数组的键是字符串类型的:

<?php
// storage/languages/en/messages.php

return [
    'welcome' => 'Welcome to our application',
];

翻译字符串

通过 TranslatorInterface 翻译

可直接通过注入 Hyperf\Contact\TranslatorInterface 并调用实例的 trans 方法实现对字符串的翻译:

#[GetMapping('/language/index')]
public function index(RequestInterface $request)
{
    $language = $request->input('language');

    return $this->translator->trans('message.name', [], $language);
}

通过全局函数翻译

#[GetMapping('/language/index')]
public function index(RequestInterface $request)
{
    $language = $request->input('language');
    $this->translator->setLocale($language);
    
    return __('message.name');
}

翻译字符串中定义占位符

语言文件中使用 : 作为前缀定义占位符,如下案例:

<?php
// storage/languages/en/message.php
declare(strict_types=1);

return [
    'name' => 'Wang Meili :desc',
];

替换占位符

#[GetMapping('/language/index')]
public function index(RequestInterface $request)
{
    $language = $request->input('language');
    $language == 'en' ? $desc = 'Pretty girl' : $desc = '';
    $this->translator->setLocale($language);
    
    return __('message.name', ['desc'=>$desc]);
}

效果

curl http://192.168.31.90:9501/language/index?language=en
Wang Meili Pretty girl
curl http://192.168.31.90:9501/language/index?language=ja
王美麗です
请登录后再评论