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