Doing Multilingual or localizaiton in Laravel

লারাভেল মাল্টিলিঙ্গুয়াল ওয়েবসাইট করার প্রসেস টা বেশ সহজ

মাল্টিলিঙ্গুয়াল বা লোকালাইজেশন বলতে যেটা বোঝাচ্ছি তা হচ্ছে আপনার website এ আপনি চাইলে এমন ব্যাবস্থা করতে পারেন যাতে কোন ভিসিটর site এর ভাষা তার প্রয়োজন মত পরিবর্তন করতে পারে।

উদাহরন ঃ bikroy.com

এটা হতে পারে একটা Dropdown বা link এর মাধ্যমে । অনেকে তা subdomain দিয়েও করে থাকে

লারাভেল এ কিভাবে করা হয় তা একটু একটা ছোট প্রজেক্ট দিয়ে করার চেষ্টা করি

composer create-project –prefer-dist laravel/laravel multilang

আমাদের এই নতুন প্রজেক্ট টা হল multilang

আমাদের যে resources/views/welcome.blade ফাইল টা আছে আমরা  ওটাকে edit করে সামান্য কিছু লিখা দেই

<html>
    <head>
    </head>
    <body>
         <h1>Welcome</h1>
I would like to say something. It could be anything i need

</body> </html>

আমাদের কাজ হবে আমারা যখন localhost/multilang/public/en লিঙ্ক এ যাব তখন যেন English দেখায়

এবং localhost/multilang/public/bn এ গেলে যেন বাংলা দেখায়

Language Files

লারাভেল এর বিল্ট ইন কিছু Translation ফিচার আছে যেটা দিয়ে আমারা অনেক কিছু করে নিতে পারি ।

ওয়েব সাইট এ লাংগুয়েজ সাধারনন্ত কিছু lang ফাইল এর মধ্যে লিখে রাখা হয়। প্রতিটি ভাষার জন্য আলাদা আলাদা lang file অথবা folder রেখে দিতে হয়। লারাভেল এ এই ফাইল গুলো থাকে – resources/lang/* এর ভেতর। এখানে উল্লেখ্য লারাভেল ২ রকমের language ফাইল সাপোর্ট করে।

১) Raw PHP array – এই ফাইল গুলো দেখতে এমন

<?php
return [
   'greet' => 'স্বাগতম',
   'msg' => 'আমি এখানে কিছু বলতে চাই। আমার যা প্রয়োজন তাই',
   'link' => "এখানে ক্লিক করুন"
];

২) json array – এই ফাইল গুলে দেখতে এমন

{ 
     "Welcome": "স্বাগতম", 
     "I would like to say something. It could be anything i need": "আমি এখানে কিছু বলতে চাই। আমার যা প্রয়োজন তাই",
     "Click Here": "এখানে ক্লিক করুন"
}

দুই ভাবেই আপনি কাজ করতে পারেন তবে এই লিখাতে আমি json ব্যাবহার করবো। এর শুবিধা হচ্ছে আপনি খেয়াল করবেন json এর key এবং value দুটাই হচ্ছে আমাদের string টা। এতে মনে রাখার সুবিধা এবং কোন ট্রান্সলেসন যদি missing থাকে তাহলে সে অর্থহীন কোন key না দেখিয়ে তার English string টা দেখাবে

আমরা শুরুতেই ২ টা json file তৈরি করে ফেলি resources/lang এই ফোল্ডার এর মধ্যে ফাইল গুলো হলো

en.json and bn.json

আমাদের view file এ ফেরত যাই এবং লিখা গুলোকে রিপ্লেস করে @lang(”) ব্যাবহার করে লিখি

<html>
  <head>
  </head>
  <body>
    <h1>@lang('Welcome')</h1>
@lang(‘I would like to say something. It could be anything i need’)

<a href=”http://www.google.com”>@lang(‘Click Here’)</a>

</body>

</html>

এখন localhost/multilang/public এ গেলে আমরা আমাদের পুরনো লিখা গুলো দেখতে পারব কারন by default লারাভেল এ en সেট করা থাকে তাই আমরা এখন যদি লাঙ্গুয়ায়েজ query করি তাহলে English লিখা গুলো পাবো।

Cap2ture

আমরা জদি ভাষা পরিবর্তন করতে চাই তাহলে config/app.php এখানে

'locale' => 'en',

change করে

'locale' => 'bn',

এবার রিফ্রেশ দেই

Capture

Installing Mcamara Vendor

আমাদের site এখন ২ ভাষায় কাজ করতে পারে। এখন এই ল্যাংগুয়েজ লিঙ্ক এর ভিত্তিতে change করতে আমাদের একটা আলাদা vendor এর প্রয়োজন হবে ।

composer require mcamara/laravel-localization

এই ভেন্ডর টার github page documentation টা দেখে নিবেন

vendor install হয়ে গেলে config/app.php ফাইলে provider এবং alias ঠিক করে দিবেন

        'providers' => [
		// [...]
                Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider::class,
        ],

 

        'aliases' => [
		// [...]
                'LaravelLocalization' => Mcamara\LaravelLocalization\Facades\LaravelLocalization::class,
        ],

এখন command line এ যেয়ে

php artisan vendor:publish --provider="Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider"

এতে config folder এর মধ্যে laravellocalization নামে একটা ফাইল তৈরি হবে। অই ফাইল টা তে জেয়ে

//'bn' => ['name' => 'Bengali', 'script' => 'Beng', 'native' => 'বাংলা', 'regional' => 'bn_BD'],

খুজে বের করুন এবং কমেন্ট  উঠিয়ে দিন, এবং স্পানিশ “es” লাইন টা কমেন্ট করে দিন

'bn' => ['name' => 'Bengali', 'script' => 'Beng', 'native' => 'বাংলা', 'regional' => 'bn_BD'],

 

Making the language selector

আমাদের ব্লেড ফাইল এ

<ul>
   @foreach(LaravelLocalization::getSupportedLocales() as $localeCode => $properties)
     <li>
         <a rel="alternate" hreflang="{{ $localeCode }}" href="{{ LaravelLocalization::getLocalizedURL($localeCode, null, [], true) }}">
         {{ $properties['native'] }}
         </a>
     </li>
   @endforeach
 </ul>

এতে ভাষা পরিবর্তন করার লিঙ্ক তৈরি হবে। আমাদের এখন একটা middleware বানাতে হবে যা এই লিঙ্ক এ ক্লিক করলে ভাষা পরিবর্তন করতে পারবে

app/http/kernel.php এই ফাইল এ $routeMiddleware array টাতে কয়টা লাইন যোগ করুন

'localize' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class, 
'localizationRedirect' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
'localeSessionRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
'localeViewPath' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class

এবার আপনার route ফাইল এ একটা route group তৈরি করুন

 

Route::group([
 'prefix' => LaravelLocalization::setLocale(),
 'middleware' => [ 'localeSessionRedirect', 'localizationRedirect', 'localeViewPath' ]
 ], function() {

    /** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP * */
     Route::get('/', function () {
        return view('welcome');
     });
     
     Route::get('/translated', function () {
        return view('translated');
     });

});

Route::get('/other', function () {
    return view('other');
});

এখন এই route groupএর মধ্যে যে সকল route declare করা হয়েছে সেগুলে লারাভেল ভাষা পরিবর্তন করবে।

আর বাইরের গুলোকে করবে না। আপনার form submit, ajax, post requests, গুলোকে এখানে রাখতে পাড়বেন

Lets Test

টেস্ট করার জন্য আমি আরও কিছু পেইজ বানিয়ে নিলাম কিছু বিষয় দেখবার

আমি একবার বাংলায় switch করলে সে আমাকে যে দুটো পেজ route group এর ভেতর সেগুলো বাংলায় দেখায় এভাবে আবার english switch করলে আমার সাইট এর যে সমস্ত লিঙ্ক route group এর ভেতর ওগুলে english এ দেখাবে এবং লিঙ্ক এর মাঝে /en অথবা /bn দেখাবে

আর যে লিঙ্ক আমাদের route group এর বইরে তার কোন পরিবর্তন হবে না

27mv85

Download

পুরে প্রোজেক্ট টা ডাউনলোড করুন এখানে

multilang.zip

 

One thought on “Doing Multilingual or localizaiton in Laravel

মন্তব্য করুন

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  পরিবর্তন )

Twitter picture

You are commenting using your Twitter account. Log Out /  পরিবর্তন )

Facebook photo

You are commenting using your Facebook account. Log Out /  পরিবর্তন )

Connecting to %s