Multilingue

Le multilingue utilise le composant symfony/translation.

Installation

composer require symfony/translation

Création d'un paquet linguistique

Par défaut, Webman place le paquet linguistique dans le répertoire resource/translations (si ce n'est pas le cas, veuillez le créer vous-même). Si vous souhaitez modifier le répertoire, veuillez le configurer dans config/translation.php. Chaque langue correspond à un sous-dossier, la définition de la langue est placée par défaut dans messages.php. Exemple :

resource/
└── translations
    ├── en
    │   └── messages.php
    └── zh_CN
        └── messages.php

Tous les fichiers de langue retournent un tableau tel que :

// resource/translations/en/messages.php

return [
    'hello' => 'Hello webman',
];

Configuration

config/translation.php

return [
    // Langue par défaut
    'locale' => 'zh_CN',
    // Langue de secours, si la traduction n'est pas trouvée dans la langue actuelle, elle essaiera d'utiliser la traduction de la langue de secours
    'fallback_locale' => ['zh_CN', 'en'],
    // Dossier de stockage des fichiers de langue
    'path' => base_path() . '/resource/translations',
];

Traduction

La traduction utilise la méthode trans().

Créez le fichier de langue resource/translations/zh_CN/messages.php comme suit :

return [
    'hello' => '你好 世界!',
];

Créez le fichier app/controller/UserController.php

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        $hello = trans('hello'); // 你好 世界!
        return response($hello);
    }
}

Visitez http://127.0.0.1:8787/user/get, vous recevrez "你好 世界!"

Changer la langue par défaut

Pour changer la langue, utilisez la méthode locale().

Ajoutez le fichier de langue resource/translations/en/messages.php comme suit :

return [
    'hello' => 'hello world!',
];
<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // Changer la langue
        locale('en');
        $hello = trans('hello'); // hello world!
        return response($hello);
    }
}

Visitez http://127.0.0.1:8787/user/get, vous recevrez "hello world!"

Vous pouvez également utiliser le quatrième paramètre de la fonction trans() pour changer temporairement la langue, par exemple, l'exemple ci-dessus et cet exemple ci-dessous sont équivalents :

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // Quatrième paramètre pour changer la langue
        $hello = trans('hello', [], null, 'en'); // hello world!
        return response($hello);
    }
}

Définir clairement la langue pour chaque requête

La traduction est un singleton, ce qui signifie que toutes les requêtes partagent cette instance. Si une requête utilise locale() pour définir la langue par défaut, cela affectera toutes les requêtes suivantes dans ce processus. Nous devrions donc définir clairement la langue pour chaque requête. Par exemple, utilisez le middleware suivant :

Créez le fichier app/middleware/Lang.php (si le répertoire n'existe pas, créez-le vous-même) comme suit :

<?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);
    }
}

Ajoutez le middleware global dans config/middleware.php comme suit :

return [
    // Middleware global
    '' => [
        // ... D'autres middlewares omis ici
        app\middleware\Lang::class,
    ]
];

Utiliser des espaces réservés

Parfois, un message contient des variables à traduire, par exemple :

trans('hello ' . $name);

Dans ce cas, nous utilisons des espaces réservés pour les gérer.

Modifiez resource/translations/zh_CN/messages.php comme suit :

return [
    'hello' => '你好 %name%!',
];

Lors de la traduction, vous passerez les valeurs correspondant aux espaces réservés via le deuxième paramètre :

trans('hello', ['%name%' => 'webman']); // 你好 webman!

Gérer le pluriel

Certaines langues présentent différentes formulations selon le nombre d'objets, par exemple There is %count% apple. Quand %count% est 1, la formulation est correcte, mais lorsqu'elle est supérieure à 1, elle devient incorrecte.

Dans ce cas, nous utilisons un tube (|) pour lister les formes plurielles.

Ajoutez apple_count dans le fichier de langue resource/translations/en/messages.php :

return [
    // ...
    'apple_count' => 'There is one apple|There are %count% apples',
];
trans('apple_count', ['%count%' => 10]); // There are 10 apples

Nous pouvons même spécifier une plage de nombres et créer des règles de pluriel plus complexes :

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

Spécifier un fichier de langue

Le nom de fichier de langue par défaut est messages.php, mais vous pouvez en réalité créer d'autres fichiers de langue avec des noms différents.

Créez le fichier de langue resource/translations/zh_CN/admin.php comme suit :

return [
    'hello_admin' => '你好 管理员!',
];

Utilisez le troisième paramètre de trans() pour spécifier le fichier de langue (sans l'extension .php).

trans('hello', [], 'admin', 'zh_CN'); // 你好 管理员!

Plus d'informations

Référez-vous au manuel symfony/translation