Multi-lingua
La multi-lingua utilizza il componente symfony/translation.
Installazione
composer require symfony/translation
Creazione del pacchetto di lingua
Webman posiziona per default il pacchetto di lingua nella directory resource/translations
(se non esiste, creala manualmente), se desideri cambiare la directory, impostala nel file config/translation.php
.
Ogni lingua corrisponde a una sottodirectory, la definizione della lingua è di default in messages.php
. Esempio:
resource/
└── translations
├── en
│ └── messages.php
└── zh_CN
└── messages.php
Tutti i file di lingua restituiscono un array, ad esempio:
// resource/translations/en/messages.php
return [
'hello' => 'Hello webman',
];
Configurazione
config/translation.php
return [
// Lingua predefinita
'locale' => 'zh_CN',
// Lingua di fallback, se la traduzione non viene trovata nella lingua corrente si tenterà di utilizzare la traduzione nella lingua di fallback
'fallback_locale' => ['zh_CN', 'en'],
// Cartella in cui si trovano i file di lingua
'path' => base_path() . '/resource/translations',
];
Traduzione
La traduzione utilizza il metodo trans()
.
Crea il file di lingua resource/translations/zh_CN/messages.php
come segue:
return [
'hello' => '你好 世界!',
];
Crea il file app/controller/UserController.php
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
$hello = trans('hello'); // 你好 世界!
return response($hello);
}
}
Visita http://127.0.0.1:8787/user/get
restituisce "你好 世界!"
Cambiare la lingua predefinita
Per cambiare lingua si utilizza il metodo locale()
.
Aggiungi il file di lingua resource/translations/en/messages.php
come segue:
return [
'hello' => 'hello world!',
];
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// Cambiare lingua
locale('en');
$hello = trans('hello'); // hello world!
return response($hello);
}
}
Visita http://127.0.0.1:8787/user/get
restituisce "hello world!"
Puoi anche usare il quarto parametro della funzione trans()
per cambiare temporaneamente la lingua, ad esempio l'esempio sopra e il seguente sono equivalenti:
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// Il quarto parametro cambia lingua
$hello = trans('hello', [], null, 'en'); // hello world!
return response($hello);
}
}
Impostare esplicitamente la lingua per ogni richiesta
La traduzione è un singleton, il che significa che tutte le richieste condividono questa istanza, se una richiesta utilizza locale()
per impostare la lingua predefinita, ciò influenzerà tutte le richieste successive in questo processo. Pertanto, dovremmo impostare esplicitamente la lingua per ogni richiesta. Ad esempio, utilizza il seguente middleware
Crea il file app/middleware/Lang.php
(se la directory non esiste, creala manualmente) come segue:
<?php
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
class Lang implements MiddlewareInterface
{
public function process(Request $request, callable $handler) : Response
{
locale(session('lang', 'zh_CN'));
return $handler($request);
}
}
Aggiungi il middleware globale in config/middleware.php
come segue:
return [
// Middleware globale
'' => [
// ... Altri middleware omessi qui
app\middleware\Lang::class,
]
];
Utilizzare i segnaposto
A volte, un'informazione contiene variabili che devono essere tradotte, ad esempio
trans('hello ' . $name);
In tali casi, utilizziamo i segnaposto.
Modifica resource/translations/zh_CN/messages.php
come segue:
return [
'hello' => '你好 %name%!',
];
Durante la traduzione, passa i valori corrispondenti ai segnaposto come secondo parametro
trans('hello', ['%name%' => 'webman']); // 你好 webman!
Gestire il plurale
Alcune lingue presentano diverse costruzioni a seconda della quantità, ad esempio There is %count% apple
, quando %count%
è 1 la costruzione è corretta, quando è maggiore di 1 è scorretta.
In questi casi utilizziamo pipe (|
) per elencare le forme plurali.
Nel file di lingua resource/translations/en/messages.php
aggiungi apple_count
come segue:
return [
// ...
'apple_count' => 'There is one apple|There are %count% apples',
];
trans('apple_count', ['%count%' => 10]); // There are 10 apples
Possiamo anche specificare intervalli numerici creando regole plurali più complesse:
return [
// ...
'apple_count' => '{0} There are no apples|{1} There is one apple|]1,19] There are %count% apples|[20,Inf[ There are many apples'
];
trans('apple_count', ['%count%' => 20]); // There are many apples
Specificare il file di lingua
Il nome predefinito del file di lingua è messages.php
, in realtà puoi creare file di lingua con altri nomi.
Crea il file di lingua resource/translations/zh_CN/admin.php
come segue:
return [
'hello_admin' => '你好 管理员!',
];
Utilizza il terzo parametro di trans()
per specificare il file di lingua (omettendo il suffisso .php
).
trans('hello', [], 'admin', 'zh_CN'); // 你好 管理员!
Maggiori informazioni
Consulta il manuale di symfony/translation