Mehrsprachigkeit
Die Mehrsprachigkeit verwendet die symfony/translation Komponente.
Installation
composer require symfony/translation
Erstellen von Sprachpaketen
Webman legt Sprachpakete standardmäßig im Verzeichnis resource/translations
ab (falls nicht vorhanden, bitte selbst erstellen). Um das Verzeichnis zu ändern, setzen Sie dies in config/translation.php
.
Jede Sprache entspricht einem der Unterverzeichnisse, wobei die Sprachdefinitionen standardmäßig in messages.php
abgelegt werden. Ein Beispiel sieht wie folgt aus:
resource/
└── translations
├── en
│ └── messages.php
└── zh_CN
└── messages.php
Alle Sprachdateien geben ein Array zurück, z. B.:
// resource/translations/en/messages.php
return [
'hello' => 'Hello webman',
];
Konfiguration
config/translation.php
return [
// Standardsprache
'locale' => 'zh_CN',
// Rückfall-Sprache, wenn die Übersetzung in der aktuellen Sprache nicht gefunden wird, wird die Übersetzung in der Rückfall-Sprache verwendet
'fallback_locale' => ['zh_CN', 'en'],
// Ordner, in dem die Sprachdateien gespeichert sind
'path' => base_path() . '/resource/translations',
];
Übersetzung
Die Übersetzung erfolgt über die Methode trans()
.
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);
}
}
Der Zugriff auf http://127.0.0.1:8787/user/get
gibt "你好 世界!" zurück.
Ändern der Standardsprache
Die Sprache wird mit der Methode locale()
gewechselt.
Fügen Sie die Sprachdatei resource/translations/en/messages.php
hinzu:
return [
'hello' => 'hello world!',
];
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// Sprache wechseln
locale('en');
$hello = trans('hello'); // hello world!
return response($hello);
}
}
Der Zugriff auf http://127.0.0.1:8787/user/get
wird "hello world!" zurückgeben!
Sie können auch das 4. Argument der trans()
-Funktion verwenden, um die Sprache vorübergehend zu wechseln, zum Beispiel ist das obige Beispiel gleichwertig mit diesem:
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// 4. Argument zur Sprachwechsel
$hello = trans('hello', [], null, 'en'); // hello world!
return response($hello);
}
}
Sprache für jede Anfrage explizit festlegen
Die Übersetzung ist ein Singleton, was bedeutet, dass alle Anfragen diese Instanz teilen. Wenn eine Anfrage die Standardsprache mit locale()
festlegt, beeinflusst dies alle nachfolgenden Anfragen in diesem Prozess. Deshalb sollten wir die Sprache für jede Anfrage explizit festlegen. Zum Beispiel mit dem folgenden Middleware.
Erstellen Sie die Datei app/middleware/Lang.php
(bitte das Verzeichnis selbst erstellen, falls nicht vorhanden) 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 config/middleware.php
die globale Middleware wie folgt hinzu:
return [
// Globale Middleware
'' => [
// ... Hier sind andere Middleware ausgelassen
app\middleware\Lang::class,
]
];
Verwendung von Platzhaltern
Manchmal enthält eine Nachricht Variablen, die übersetzt werden müssen, z. B.
trans('hello ' . $name);
In solchen Fällen verwenden wir Platzhalter.
Ändern Sie resource/translations/zh_CN/messages.php
wie folgt:
return [
'hello' => '你好 %name%!',
];
Beim Übersetzen übergeben Sie die entsprechenden Werte der Platzhalter als zweiten Parameter:
trans('hello', ['%name%' => 'webman']); // 你好 webman!
Umgang mit Pluralformen
Einige Sprachen verwenden unterschiedliche Satzstrukturen je nach Anzahl der Objekte, z. B. There is %count% apple
, wobei der Satz korrekt ist, wenn %count%
1 ist, aber falsch, wenn es größer als 1 ist.
In solchen Fällen verwenden wir die Pipe (|
), um die Pluralformen aufzulisten.
Fügen Sie der Sprachdatei resource/translations/en/messages.php
apple_count
hinzu:
return [
// ...
'apple_count' => 'There is one apple|There are %count% apples',
];
trans('apple_count', ['%count%' => 10]); // There are 10 apples
Wir können sogar Zahlenbereiche angeben und komplexere Pluralregeln 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
Bestimmen von Sprachdateien
Der Standardname der Sprachdatei ist messages.php
, in Wirklichkeit können Sie auch andere Namen für Sprachdateien erstellen.
Erstellen Sie die Sprachdatei resource/translations/zh_CN/admin.php
wie folgt:
return [
'hello_admin' => '你好 管理员!',
];
Verwenden Sie den dritten Parameter von trans()
, um die Sprachdatei anzugeben (das .php
-Suffix wird weggelassen).
trans('hello', [], 'admin', 'zh_CN'); // 你好 管理员!
Weitere Informationen
Siehe das symfony/translation Handbuch