Çok Dilli
Çok dilli destek için symfony/translation bileşeni kullanılmaktadır.
Kurulum
composer require symfony/translation
Dil Paketi Oluşturma
webman varsayılan olarak dil paketlerini resource/translations
dizinine yerleştirir (eğer yoksa kendiniz oluşturmalısınız), dizini değiştirmek isterseniz config/translation.php
dosyasında ayar yapabilirsiniz.
Her bir dil, bu dizinde bir alt klasöre karşılık gelir, dil tanımları varsayılan olarak messages.php
dosyasında bulunur. Aşağıda bir örnek verilmiştir:
resource/
└── translations
├── en
│ └── messages.php
└── zh_CN
└── messages.php
Tüm dil dosyaları aşağıdaki gibi bir dizi döndürür:
// resource/translations/en/messages.php
return [
'hello' => 'Hello webman',
];
Konfigürasyon
config/translation.php
return [
// Varsayılan dil
'locale' => 'zh_CN',
// Yedek dil, mevcut dilde çeviri bulunamadığında yedek dilden çeviri kullanılmaya çalışılır
'fallback_locale' => ['zh_CN', 'en'],
// Dil dosyalarının bulunduğu klasör
'path' => base_path() . '/resource/translations',
];
Çeviri
Çeviri için trans()
yöntemi kullanılır.
Dil dosyası resource/translations/zh_CN/messages.php
şu şekilde oluşturulur:
return [
'hello' => '你好 世界!',
];
Dosyayı app/controller/UserController.php
olarak 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önecektir.
Varsayılan Dili Değiştirme
Dili değiştirmek için locale()
yöntemini kullanın.
Yeni bir dil dosyası resource/translations/en/messages.php
şu şekilde oluşturulur:
return [
'hello' => 'hello world!',
];
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// Dili değiştirme
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önecektir.
Ayrıca trans()
fonksiyonunun dördüncü parametresini geçici olarak dili değiştirmek için kullanabilirsiniz, örneğin yukarıdaki örnek ile aşağıdaki eşdeğerdir:
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function get(Request $request)
{
// Dördüncü parametre ile dili değiştirme
$hello = trans('hello', [], null, 'en'); // hello world!
return response($hello);
}
}
Her İstek İçin Açıkça Dil Ayarlama
translation bir singleton'dır, bu da tüm isteklerin bu örneği paylaştığı anlamına gelir, eğer bir istek locale()
kullanarak varsayılan dili ayarladıysa, bu, bu işlemin sonraki tüm isteklerini etkiler. Bu yüzden her istekte açıkça dil ayarını yapmak önemlidir. Örneğin aşağıdaki ara yazılımı kullanabilirsiniz.
Dosyayı app/middleware/Lang.php
olarak oluşturun (eğer dizin yoksa kendiniz oluşturmalısınız) şöyle:
<?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
dosyasında genel ara yazılım olarak aşağıdaki gibi ekleyin:
return [
// Genel ara yazılım
'' => [
// ... Diğer ara yazılımlar burada atlanmıştır
app\middleware\Lang::class,
]
];
Yer Tutucu Kullanımı
Bazen, bir bilgi çevirilmesi gereken değişkenler içerir, örneğin
trans('hello ' . $name);
Böyle bir durumla karşılaştığımızda yer tutucular kullanarak işlemi gerçekleştiririz.
resource/translations/zh_CN/messages.php
dosyasını şu şekilde değiştirin:
return [
'hello' => '你好 %name%!',
];
Çeviri sırasında verileri ikinci parametre ile yer tutucunun karşılık gelen değerini geçebilirsiniz:
trans('hello', ['%name%' => 'webman']); // 你好 webman!
Çoğulları İşleme
Bazı dillerde nesne sayısına bağlı olarak farklı cümle yapıları ortaya çıkabilir, örneğin There is %count% apple
, %count%
1 olduğunda cümle doğru, 1'den büyük olduğunda ise yanlış olur.
Böyle bir durumda, pipe (|
) kullanarak çoğul formları listeleyebiliriz.
Dil dosyası resource/translations/en/messages.php
dosyasına apple_count
ekleyin:
return [
// ...
'apple_count' => 'There is one apple|There are %count% apples',
];
trans('apple_count', ['%count%' => 10]); // There are 10 apples
Hatta sayı aralıklarını belirleyerek daha karmaşık çoğul kuralları 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
Belirtilen Dil Dosyası
Dil dosyalarının varsayılan adı messages.php
olarak belirlenmiştir, aslında farklı adlarla dil dosyaları oluşturabilirsiniz.
Dil dosyası resource/translations/zh_CN/admin.php
dosyasını şu şekilde oluşturun:
return [
'hello_admin' => '你好 管理员!',
];
trans()
fonksiyonunun üçüncü parametresi ile dil dosyasını belirtebilirsiniz (.php
uzantısını atlayabilirsiniz).
trans('hello', [], 'admin', 'zh_CN'); // 你好 管理员!
Daha Fazla Bilgi
Daha fazla bilgi için symfony/translation kılavuzuna bakınız.