Multilingua
Il multilingua utilizza il componente symfony/translation.
Installazione
compositore richiede symfony/translation
Creare il pacchetto lingua
Per impostazione predefinita, webman mette il pacchetto lingua nella directory resource/translations
(se non esiste, crealo tu stesso). Se è necessario modificare la directory, impostala nel file config/translation.php
.
Ogni lingua corrisponde a una sottocartella, e le definizioni delle lingue vanno di default nel file messages.php
. Ecco un esempio:
resource/
└── translations
├── en
│ └── messages.php
└── zh_CN
└── messages.php
Tutti i file linguistiche restituiscono un array, ad esempio:
<?php
// 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 è disponibile nella lingua corrente, proverà a usare la traduzione nelle lingue di fallback
'fallback_locale' => ['zh_CN', 'en'],
// Percorso in cui salvare i file linguistici
'path' => base_path() . '/resource/translations',
];
Traduzione
La traduzione avviene utilizzando il metodo trans()
.
Crea il file linguistico resource/translations/zh_CN/messages.php
come segue:
<?php
return [
'hello' => 'Ciao mondo!',
];
Crea il file app/controller/UserController.php
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
$hello = trans('hello'); // Ciao mondo!
return response($hello);
}
}
Visitando http://127.0.0.1:8787/user/get
restituirà "Ciao mondo!"
Cambiare la lingua predefinita
Per cambiare la lingua, usa il metodo locale()
.
Aggiungi il file linguistico resource/translations/en/messages.php
come segue:
<?php
return [
'hello' => 'Ciao mondo!',
];
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// Cambia la lingua
locale('en');
$hello = trans('hello'); // Ciao mondo!
return response($hello);
}
}
Visitando http://127.0.0.1:8787/user/get
restituirà "Ciao mondo!"
Puoi anche utilizzare il quarto parametro della funzione trans()
per cambiare temporaneamente la lingua, ad esempio:
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// Cambia la lingua utilizzando il quarto parametro
$hello = trans('hello', [], null, 'en'); // Ciao mondo!
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 il metodo locale()
per impostare la lingua predefinita, avrà un impatto su tutte le richieste successive in quel processo. Quindi dovremmo impostare esplicitamente la lingua per ogni richiesta. Ad esempio, utilizzando il middleware seguente:
Crea il file app/middleware/Lang.php
(se la cartella non esiste, creala tu stesso) 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 globali
'' => [
// ... Altri middleware sono omessi qui
app\middleware\Lang::class,
]
];
Utilizzo dei segnaposto
A volte, un messaggio contiene variabili da tradurre, ad esempio
trans('hello ' . $name);
Quando ti trovi in questa situazione, utilizza dei segnaposto per gestire questi casi.
Modifica resource/translations/zh_CN/messages.php
come segue:
<?php
return [
'hello' => 'Ciao %name%!',
];
Nella traduzione, passa i dati corrispondenti al segnaposto attraverso il secondo parametro
trans('hello', ['%name%' => 'webman']); // Ciao webman!
Gestione dei plurali
In alcune lingue, la struttura delle frasi varia a seconda del numero di oggetti, ad esempio "Ci sono %count% mele", corretto per %count% uguale a 1, ma scorretto per valori superiori a 1.
In questi casi, utilizziamo il pipe (|
) per elencare le forme plurali.
Aggiungi la voce apple_count
al file linguistico resource/translations/en/messages.php
come segue:
<?php
return [
// ...
'apple_count' => 'There is one apple|There are %count% apples',
];
trans('apple_count', ['%count%' => 10]); // There are 10 apples
Possiamo addirittura specificare un intervallo numerico, creando così regole per i 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 linguistico
Il nome predefinito del file linguistico è messages.php
, ma in realtà è possibile creare file con nomi diversi.
Crea il file linguistico resource/translations/zh_CN/admin.php
come segue:
<?php
return [
'hello_admin' => 'Ciao Amministratore!',
];
Specificare il file linguistico tramite il terzo parametro di trans()
(senza includere l'estensione .php
).
trans('hello', [], 'admin', 'zh_CN'); // Ciao Amministratore!
Ulteriori informazioni
Consulta il manuale di symfony/translation