Çok Dilli
Çok dilli destek symfony/translation bileşenini kullanır.
Kurulum
composer require symfony/translation
Dil Paketleri Oluşturma
webman varsayılan olarak dil paketlerini resource/translations dizininde saklar (yoksa oluşturun). Dizini değiştirmek için config/translation.php içinde ayarlayın.
Her dil bir alt dizine karşılık gelir, dil tanımları varsayılan olarak messages.php dosyasında tutulur. Örnek:
resource/
└── translations
├── en
│ └── messages.php
└── zh_CN
└── messages.php
Tüm dil dosyaları bir dizi döndürür, örneğin:
// resource/translations/en/messages.php
return [
'hello' => 'Hello webman',
];
Yapılandırma
config/translation.php
return [
// Varsayılan dil
'locale' => 'zh_CN',
// Yedek dil: Mevcut dilde çeviri bulunamazsa yedek dildeki çeviri denenir
'fallback_locale' => ['zh_CN', 'en'],
// Dil dosyalarının saklandığı dizin
'path' => base_path() . '/resource/translations',
];
Çeviri
Çeviri için trans() metodu kullanılır.
Dil dosyası resource/translations/zh_CN/messages.php oluşturun:
return [
'hello' => '你好 世界!',
];
Dosya app/controller/UserController.php oluşturun:
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
$hello = trans('hello'); // 你好 世界!
return response($hello);
}
}
http://127.0.0.1:8787/user/get adresine erişildiğinde "你好 世界!" döner.
Varsayılan Dili Değiştirme
Dil değiştirmek için locale() metodu kullanılır.
Dil dosyası resource/translations/en/messages.php ekleyin:
return [
'hello' => 'hello world!',
];
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// Dili değiştir
locale('en');
$hello = trans('hello'); // hello world!
return response($hello);
}
}
http://127.0.0.1:8787/user/get adresine erişildiğinde "hello world!" döner.
trans() fonksiyonunun 4. parametresiyle geçici olarak dil değiştirilebilir. Örneğin yukarıdaki örnek şununla eşdeğerdir:
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// 4. parametre dili değiştirir
$hello = trans('hello', [], null, 'en'); // hello world!
return response($hello);
}
}
Her İstek İçin Dili Açıkça Ayarlama
translation bir singleton olduğundan tüm istekler aynı örneği paylaşır. Bir istek locale() ile varsayılan dili ayarlarsa, bu süreçteki sonraki tüm istekleri etkiler. Bu nedenle her istek için dili açıkça ayarlamalıyız. Örneğin aşağıdaki middleware kullanılır:
Dosya app/middleware/Lang.php oluşturun (dizin yoksa oluşturun):
<?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);
}
}
config/middleware.php içinde global middleware ekleyin:
return [
// Global middleware
'' => [
// ... diğer middleware'ler atlandı
app\middleware\Lang::class,
]
];
Yer Tutucu Kullanma
Bazen bir mesajda çevrilmesi gereken değişkenler bulunur, örneğin
trans('hello ' . $name);
Bu durumda yer tutucu kullanılır.
resource/translations/zh_CN/messages.php dosyasını güncelleyin:
return [
'hello' => '你好 %name%!',
];
Çeviri sırasında değerler ikinci parametreyle aktarılır:
trans('hello', ['%name%' => 'webman']); // 你好 webman!
Çoğul Biçimlerle Çalışma
Bazı dillerde cümle yapısı miktara göre değişir. Örneğin There is %count% apple, %count% 1 olduğunda doğrudur, 1'den büyük olduğunda yanlıştır.
Bu durumda çoğul biçimleri listelemek için pipe (|) kullanılır.
Dil dosyası resource/translations/en/messages.php içine apple_count ekleyin:
return [
// ...
'apple_count' => 'There is one apple|There are %count% apples',
];
trans('apple_count', ['%count%' => 10]); // There are 10 apples
Sayı aralıkları belirleyerek daha karmaşık çoğul kuralları da oluşturabiliriz:
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
Dil Dosyası Belirtme
Varsayılan dil dosyası adı messages.php'dir, ancak başka isimli dil dosyaları da oluşturulabilir.
Dil dosyası resource/translations/zh_CN/admin.php oluşturun:
return [
'hello_admin' => '你好 管理员!',
];
Dil dosyası trans() fonksiyonunun 3. parametresiyle belirtilir (.php uzantısı yazılmaz).
trans('hello', [], 'admin', 'zh_CN'); // 你好 管理员!