Ç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.