Multilingual Processing โ
TIP
MineAdmin's multilingual processing relies on hyperf/translation.
Therefore, this document will not separately explain how to load multilingual configurations.
Client Language Detection โ
In MineAdmin, client language detection is handled by the Mine\Support\Middleware\TranslationMiddleware
middleware,
which is registered in config/autoload/middlewares.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);
}
// Get the language identifier
protected function getLocale(ServerRequestInterface $request): string
{
$locale = null;
// Check if the request header has an Accept-Language identifier. If so, set it; otherwise, default to Simplified Chinese.
if ($request->hasHeader('Accept-Language')) {
$locale = $request->getHeaderLine('Accept-Language');
}
return $locale ?: 'zh_CN';
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?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' => [
// Request ID middleware
RequestIdMiddleware::class,
// Multilingual detection middleware
TranslationMiddleware::class,
// CORS middleware. For production environments, it is recommended to disable this and handle CORS via proxy servers like Nginx.
CorsMiddleware::class,
// Validator middleware, handles formRequest validation
ValidationMiddleware::class,
],
];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Usage โ
Take a classic business development scenarioโuser login in the user centerโas an example. Suppose during login, responses like Login Success
, Login Fail
, Incorrect Password
, and Account Locked
need to be returned.
Additionally, translations for Simplified Chinese
, Traditional Chinese
, and English
are required. Following the example below, create three translation files:
File Name | Directory | Explanation |
---|---|---|
user-center.php | storage/en | English translation file |
user-center.php | storage/zh_CN | Simplified Chinese translation file |
user-center.php | storage/ZH_TW | Traditional Chinese translation file |
In the user processing class, directly return business error messages via throw new BusinessException(ResultCode::Fail, 'translation_key')
.
// storage/en/user-center.php
return [
'success' => 'Login Success.',
'fail' => 'Login Fail.',
โpassport_eror' => 'Incorrect password.',
'user_lock' => 'The account has been locked.'
];
2
3
4
5
6
7
// storage/zh_CN/user-center.php
return [
'success' => '็ปๅฝๆๅ',
'fail' => '็ปๅฝๅคฑ่ดฅ',
โpassport_eror' => 'ๅฏ็ ้่ฏฏ',
'user_lock' => '่ดฆๅทๅทฒ่ขซ้ๅฎ'
];
2
3
4
5
6
7
// storage/zh_TW/user-center.php
return [
'success' => ' ็ป้ๆๅ ',
'fail' => ' ็ป้ๅคฑๆ ',
'passport_eror' => ' ๅฏ็ขผ้ฏ่ชค ',
'user_lock' => ' ่ณฌ่ๅทฒ่ขซ้ๅฎ '
];
2
3
4
5
6
7
8
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'));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16