多語言處理
TIP
MineAdmin 的多語言處理依賴 hyperf/translation。 因此關於如何載入多語言本文不再另行講述。
客戶端語言識別
在 MineAdmin 中。識別客戶端的語言交由了 Mine\Support\Middleware\TranslationMiddleware
中介軟體識別 並在 config/autoload/middlewares.php
中進行了中介軟體註冊
php
declare(strict_types=1);
/**
* This file is part of MineAdmin.
*
* @link https://www.mineadmin.com
* @document https://doc.mineadmin.com
* @contact root@imoi.cn
* @license https://github.com/mineadmin/MineAdmin/blob/master/LICENSE
*/
namespace Mine\Support\Middleware;
use Hyperf\Contract\TranslatorInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class TranslationMiddleware implements MiddlewareInterface
{
public function __construct(
private readonly TranslatorInterface $translator
) {}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$this->translator->setLocale($this->getLocale($request));
return $handler->handle($request);
}
// 獲取語言標識
protected function getLocale(ServerRequestInterface $request): string
{
$locale = null;
// 判斷請求頭是否有 Accept-Language 語言標識。如果有則設定。如果沒有則設定為簡體中文
if ($request->hasHeader('Accept-Language')) {
$locale = $request->getHeaderLine('Accept-Language');
}
return $locale ?: 'zh_CN';
}
}
php
<?php
declare(strict_types=1);
/**
* This file is part of MineAdmin.
*
* @link https://www.mineadmin.com
* @document https://doc.mineadmin.com
* @contact root@imoi.cn
* @license https://github.com/mineadmin/MineAdmin/blob/master/LICENSE
*/
use Hyperf\Validation\Middleware\ValidationMiddleware;
use Mine\Support\Middleware\CorsMiddleware;
use Mine\Support\Middleware\RequestIdMiddleware;
use Mine\Support\Middleware\TranslationMiddleware;
return [
'http' => [
// 請求ID中介軟體
RequestIdMiddleware::class,
// 多語言識別中介軟體
TranslationMiddleware::class,
// 跨域中介軟體,正式環境建議關閉。使用 Nginx 等代理伺服器處理跨域問題。
CorsMiddleware::class,
// 驗證器中介軟體,處理 formRequest 驗證器
ValidationMiddleware::class,
],
];
使用
以經典的業務開發場景-使用者中心使用者登入來說。假設在登入時。需要返回 登入成功
登入失敗
密碼錯誤
使用者已被鎖定
並且需要做 簡體中文
繁體中文
英語
三個語言翻譯。以下方示例為準。建立三個翻譯檔案
檔名稱 | 檔案所在目錄 | 解釋 |
---|---|---|
user-center.php | storage/en | 英文翻譯檔案 |
user-center.php | storage/zh_CN | 簡體中文翻譯檔案 |
user-center.php | storage/ZH_TW | 繁體中文翻譯檔案 |
同時在使用者處理類中直接透過 throw new BusinessException(ResultCode::Fail,'翻譯標識')
返回業務端錯誤資訊
php
// storage/en/user-center.php
return [
'success' => 'Login Success.',
'fail' => 'Login Fail.',
’passport_eror' => 'Incorrect password.',
'user_lock' => 'The account has been locked.'
];
php
// storage/zh_CN/user-center.php
return [
'success' => '登入成功',
'fail' => '登入失敗',
’passport_eror' => '密碼錯誤',
'user_lock' => '賬號已被鎖定'
];
php
// storage/zh_TW/user-center.php
return [
'success' => ' 登入成功 ',
'fail' => ' 登入失敗 ',
'passport_eror' => ' 密碼錯誤 ',
'user_lock' => ' 賬號已被鎖定 '
];
php
class UserController extends AbstractController {
public function Login(string $username,string $password){
$entity = UserModel::query->where('username',$username)->first();
if(!$entity){
throw new BusinessException(ResultCode::Fail,trans('user-center.fail');
}
if(!password_verify($password,$entity->password)){
throw new BusinessException(ResultCode::Fail,trans('user-center.passport_error');
}
if($user->status !== StatusEnum::Normal){
throw new BusinessException(ResultCode::Fail,trans('user-center.user_lock');
}
return $this->success(trans('user-center.success'));
}
}