15、Hyperf 3 快速使用 - 项目多语言-通向国际化
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
王美麗です
请登录后再评论