Mehrsprachigkeit

Mehrsprachigkeit wird durch das symfony/translation Komponente realisiert.

Installation

composer require symfony/translation

Erstellung von Sprachdateien

Standardmäßig werden die Sprachdateien von webman im Verzeichnis resource/translations abgelegt (falls nicht vorhanden, bitte manuell erstellen). Sollte das Verzeichnis geändert werden, kann dies in der Datei config/translation.php eingestellt werden.
Jede Sprache entspricht einem Unterordner, und die Sprachdefinitionen werden standardmäßig in der Datei messages.php abgelegt. Hier ist ein Beispiel:

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

Alle Sprachdateien geben ein Array zurück, zum Beispiel:

// resource/translations/en/messages.php

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

Konfiguration

config/translation.php

return [
    // Standardsprache
    'locale' => 'zh_CN',
    // Fallback-Sprache: Wenn eine Übersetzung in der aktuellen Sprache nicht gefunden wird, wird versucht, die Übersetzung in der Fallback-Sprache zu finden.
    'fallback_locale' => ['zh_CN', 'en'],
    // Verzeichnis für Sprachdateien
    'path' => base_path() . '/resource/translations',
];

Übersetzung

Die Übersetzung erfolgt mithilfe der trans()-Methode.

Erstellen Sie die Sprachdatei resource/translations/zh_CN/messages.php wie folgt:

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

Erstellen Sie die Datei app/controller/UserController.php

<?php
namespace app\controller;

use support\Request;

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

Ein Aufruf von http://127.0.0.1:8787/user/get gibt "你好 世界!" zurück.

Ändern der Standardsprache

Die Sprache kann mit der Methode locale() geändert werden.

Erstellen Sie eine neue Sprachdatei resource/translations/en/messages.php, wie folgt:

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

use support\Request;

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

Ein Aufruf von http://127.0.0.1:8787/user/get gibt "hello world!" zurück.

Sie können auch das vierte Argument der trans()-Funktion verwenden, um die Sprache temporär zu ändern. Das folgende Beispiel ist äquivalent zu dem obigen:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // Sprache durch das vierte Argument ändern
        $hello = trans('hello', [], null, 'en'); // hello world!
        return response($hello);
    }
}

Festlegen der Sprache für jede Anfrage explizit

Translation ist ein Singleton, was bedeutet, dass alle Anfragen diese Instanz gemeinsam nutzen. Wenn eine Anfrage die Standardsprache mit locale() festlegt, wirkt sich dies auf alle folgenden Anfragen in diesem Prozess aus. Daher sollten wir die Sprache für jede Anfrage explizit festlegen. Zum Beispiel mit dem folgenden Middleware:

Erstellen Sie die Datei app/middleware/Lang.php (falls das Verzeichnis nicht existiert, bitte manuell erstellen) wie folgt:

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

Fügen Sie in der Datei config/middleware.php globale Middleware wie folgt hinzu:

return [
    // Globale Middleware
    '' => [
        // ... andere Middleware hier
        app\middleware\Lang::class,
    ]
];

Verwendung von Platzhaltern

Manchmal enthält eine Nachricht Variablen, die übersetzt werden müssen, zum Beispiel

trans('hello ' . $name);

In solchen Fällen verwenden wir Platzhalter.

Ändern Sie resource/translations/zh_CN/messages.php wie folgt:

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

Übergeben Sie die Daten beim Aufruf der Übersetzungsfunktion als Wert des Platzhalters durch das zweite Argument weiter:

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

Behandeln von Pluralformen

In manchen Sprachen muss aufgrund der Anzahl unterschiedlicher Satzstrukturen unterschieden werden, z.B. There is %count% apple. Diese Satzstruktur ist richtig, wenn %count% gleich 1 ist, aber falsch, wenn sie größer als 1 ist.

In solchen Fällen verwenden wir Pipes (|), um die verschiedenen Pluralformen anzugeben.

Fügen Sie in der Sprachdatei resource/translations/en/messages.php die Schlüssel-Wert-Paare für apple_count hinzu, wie folgt:

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

Sie können sogar Zahlenbereiche angeben, um komplexere Regeln für Pluralformen zu erstellen:

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

Spezifische Sprachdateien verwenden

Der Standardname für eine Sprachdatei ist messages.php, aber in Wirklichkeit können Sie Sprachdateien mit anderen Namen erstellen.

Erstellen Sie eine Sprachdatei resource/translations/zh_CN/admin.php wie folgt:

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

Verwenden Sie das dritte Argument von trans() um die Sprachdatei (ohne die .php-Erweiterung) anzugeben.

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

Weitere Informationen

Siehe Symfony/Translation-Dokumentation