বহু ভাষা

বহু ভাষা ব্যবহৃত হচ্ছে 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.phpapple_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'); // 你好 管理员!

আরও তথ্য

বার্তা/অনুবাদেরেদের নির্দেশনা দেখুন।