Çoklu Dil Desteği

Çoklu dil desteği için symfony/translation bileşeni kullanılı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şturun), dizini değiştirmek isterseniz config/translation.php dosyasında ayarlayabilirsiniz.
Her dil için bir alt dizin oluşturulur ve dil tanımları genellikle messages.php dosyasında bulunur. Örnek dizin yapısı şöyle olabilir:

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

Tüm dil dosyaları genellikle bir dizi döndürülecek şekilde oluşturulur. Ö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 çeviriyi deneyecek
    '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.

resource/translations/zh_CN/messages.php dosyası aşağıdaki gibi oluşturulur:

return [
    'hello' => 'Merhaba Dünya!',
];

app/controller/UserController.php dosyası şu şekilde oluşturulur:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        $hello = trans('hello'); // Merhaba Dünya!
        return response($hello);
    }
}

http://127.0.0.1:8787/user/get adresine gidildiğinde "Merhaba Dünya!" dönecektir.

Varsayılan Dili Değiştirmek

Dil değişikliği için locale() yöntemi kullanılır.

resource/translations/en/messages.php dosyasına aşağıdaki gibi ek yapılır:

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

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // Dil değiştir
        locale('en');
        $hello = trans('hello'); // hello world!
        return response($hello);
    }
}

http://127.0.0.1:8787/user/get adresine gidildiğinde "hello world!" dönecektir.

Ayrıca dil geçici olarak değiştirmek için trans() fonksiyonunun dördüncü parametresini kullanabilirsiniz. Örneğin yukarıdaki örnek ile aşağıdaki örnek aynıdır:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // Dil değiştirme için dördüncü parametre
        $hello = trans('hello', [], null, 'en'); // hello world!
        return response($hello);
    }
}

Her İstek İçin Ayrı Ayrı Dil Belirleme

Çeviri bir örnektir ve bu nedenle tüm istekler bu örneği paylaşır. Bu nedenle, yalnızca belirli bir istek için dil belirlemek önemlidir. Bunun için aşağıdaki gibi bir ara yazılım kullanabilirsiniz:

app/middleware/Lang.php dosyası oluşturulur (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 dosyasına genel bir ara yazılım ekleyin:

return [
    // Global ara yazılımlar
    '' => [
        // ... Diğer ara yazılımlar buraya eklenir
        app\middleware\Lang::class,
    ]
];

Yer Tutucu Kullanımı

Bazı durumlarda, bir çevirilecek olan ifadenin içinde değişkenler bulunabilir. Örneğin:

trans('hello ' . $name);

Bu durumla karşılaşıldığında yer tutucular kullanılır.

resource/translations/zh_CN/messages.php dosyası aşağıdaki gibi değiştirilir:

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

Çeviri yapılırken ikinci parametre olarak yer tutucuların değerleri aktarılır.

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

Çoğul Durumları Kullanımı

Bazı dillerde miktar durumuna göre cümle yapısı değişebilir, örneğin There is %count% apple, %count% değeri 1 ise cümlenin yapısı doğrudur, 1'den büyükse yanlıştır.

Bu durumlar için | işareti kullanarak çoğul durumları belirtebiliriz.

resource/translations/en/messages.php dosyasına apple_count örneği aşağıdaki gibi ekleyebiliriz:

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

Ayrıca, sayısal aralıkları da belirterek daha karmaşık 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

Belirli Dil Dosyasını Kullanma

Dil dosyalarının varsayılan adı messages.phpdir, ancak aslında farklı adlarda da oluşturabilirsiniz.

Aşağıdaki gibi trans() fonksiyonunun üçüncü parametresi ile dil dosyasını belirleyebilirsiniz (.php uzantısını dahil etmeyin).

trans('hello', [], 'admin', 'zh_CN'); // Merhaba Admin!

Daha Fazla Bilgi

symfony/translation belgeleri sayfasına bakabilirsiniz.