बहुभाषा

बहुभाषा symfony/translation घटक का उपयोग करती है।

स्थापना

composer require symfony/translation

भाषा पैकेज बनाना

webman डिफ़ॉल्ट रूप से भाषा पैकेज को resource/translations निर्देशिका में रखता है (यदि नहीं है तो कृपया स्वयं बनाएं), यदि आप निर्देशिका बदलना चाहते हैं, तो कृपया config/translation.php में सेट करें।
प्रत्येक भाषा के लिए एक उप फ़ोल्डर होता है, भाषा परिभाषा डिफ़ॉल्ट रूप से messages.php में रखी जाती है। उदाहरण के लिए:

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

सभी भाषा फ़ाइलें एक एरे लौटाती हैं जैसे:

// resource/translations/en/messages.php

return [
    'hello' => 'Hello webman',
];

कॉन्फ़िगरेशन

config/translation.php

return [
    // डिफ़ॉल्ट भाषा
    'locale' => 'zh_CN',
    // बैकअप भाषा, यदि वर्तमान भाषा में अनुवाद नहीं मिलता है तो बैकअप भाषा के अनुवाद का प्रयास किया जाएगा
    'fallback_locale' => ['zh_CN', 'en'],
    // भाषा फ़ाइलें कहाँ रखी गई हैं
    'path' => base_path() . '/resource/translations',
];

अनुवाद

अनुवाद trans() विधि का उपयोग करके किया जाता है।

भाषा फ़ाइल resource/translations/zh_CN/messages.php निम्नलिखित के रूप में बनाएं:

return [
    'hello' => '你好 世界!',
];

फाइल बनाएं app/controller/UserController.php

<?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 पर जाने पर "你好 世界!" वापस मिलेगा।

डिफ़ॉल्ट भाषा बदलें

भाषा को स्विच करने के लिए locale() विधि का उपयोग करें।

नई भाषा फ़ाइल resource/translations/en/messages.php निम्नलिखित के रूप में बनाएं:

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

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // भाषा स्विच करना
        locale('en');
        $hello = trans('hello'); // hello world!
        return response($hello);
    }
}

http://127.0.0.1:8787/user/get पर जाने पर "hello world!" वापस मिलेगा।

आप trans() फ़ंक्शन के चौथे पैरामीटर का उपयोग करके अस्थायी रूप से भाषा बदल सकते हैं, जैसे ऊपर का उदाहरण और नीचे वाला समान हैं:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // चौथा पैरामीटर भाषा बदलना
        $hello = trans('hello', [], null, 'en'); // hello world!
        return response($hello);
    }
}

प्रत्येक अनुरोध के लिए स्पष्ट रूप से भाषा सेट करना

translation एक सिंगलटन है, जिसका अर्थ है कि सभी अनुरोध इस उदाहरण को साझा करते हैं, यदि किसी अनुरोध ने locale() का उपयोग करके डिफ़ॉल्ट भाषा सेट की है, तो यह इस प्रक्रिया के बाद के सभी अनुरोधों को प्रभावित करेगा। इसलिए हमें प्रत्येक अनुरोध के लिए स्पष्ट रूप से भाषा सेट करनी चाहिए। उदाहरण के लिए, निम्नलिखित मिडलवेयर का उपयोग करें।

फाइल बनाएं app/middleware/Lang.php (यदि डायरेक्टरी मौजूद नहीं है तो कृपया स्वयं बनाएं) निम्नलिखित के रूप में:

<?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 में वैश्विक मिडलवेयर जोड़ें जैसे:

return [
    // वैश्विक मिडलवेयर
    '' => [
        // ... यहाँ अन्य मिडलवेयर छोड़ें
        app\middleware\Lang::class,
    ]
];

प्लेसहोल्डर का उपयोग करें

कभी-कभी, एक सूचना में अनुवाद करने के लिए आवश्यक चर होता है, जैसे

trans('hello ' . $name);

ऐसी स्थिति में, हम प्लेसहोल्डर का उपयोग करते हैं।

resource/translations/zh_CN/messages.php को निम्नलिखित के रूप में बदलें:

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

अनुवाद करते समय डेटा को दूसरे पैरामीटर के माध्यम से प्लेसहोल्डर के अनुरूप मान पास करें

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

बेल्लिंग संभालें

कुछ भाषाओं में वस्तुओं की मात्रा के अनुसार विभिन्न वाक्यविन्यास होते हैं, जैसे There is %count% apple जब %count% 1 हो तब वाक्य सही है, जब 1 से अधिक हो तब गलत है।

ऐसी स्थिति में, हम पाइप (|) का उपयोग करके बहुवचन रूपों को सूचीबद्ध करते हैं।

भाषा फ़ाइल resource/translations/en/messages.php में apple_count जोड़ें जैसा:

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

हम यहाँ तक कि संख्याओं की रेंज निर्दिष्ट कर सकते हैं, और अधिक जटिल बहुवचन नियम बना सकते हैं:

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

निर्दिष्ट भाषा फ़ाइलें

भाषा फ़ाइल का डिफ़ॉल्ट नाम messages.php है, वास्तव में आप अन्य नामों की भाषा फ़ाइलें भी बना सकते हैं।

भाषा फ़ाइल resource/translations/zh_CN/admin.php को निम्नलिखित के रूप में बनाएं:

return [
    'hello_admin' => '你好 管理员!',
];

trans() के तीसरे पैरामीटर का उपयोग करके भाषा फ़ाइल को निर्दिष्ट करें (.php उपसर्ग छोड़ दें)।

trans('hello', [], 'admin', 'zh_CN'); // 你好 管理员!

अधिक जानकारी

symfony/translation मैनुअल को संदर्भित करें।