লারাভেল মাল্টিলিঙ্গুয়াল ওয়েবসাইট করার প্রসেস টা বেশ সহজ
মাল্টিলিঙ্গুয়াল বা লোকালাইজেশন বলতে যেটা বোঝাচ্ছি তা হচ্ছে আপনার 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>
</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 এই ফোল্ডার এর মধ্যে ফাইল গুলো হলো
আমাদের view file এ ফেরত যাই এবং লিখা গুলোকে রিপ্লেস করে @lang(”) ব্যাবহার করে লিখি
<html> <head> </head> <body> <h1>@lang('Welcome')</h1>
<a href=”http://www.google.com”>@lang(‘Click Here’)</a>
</body>
</html>
এখন localhost/multilang/public এ গেলে আমরা আমাদের পুরনো লিখা গুলো দেখতে পারব কারন by default লারাভেল এ en সেট করা থাকে তাই আমরা এখন যদি লাঙ্গুয়ায়েজ query করি তাহলে English লিখা গুলো পাবো।
আমরা জদি ভাষা পরিবর্তন করতে চাই তাহলে config/app.php এখানে
'locale' => 'en',
change করে
'locale' => 'bn',
এবার রিফ্রেশ দেই
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 এর বইরে তার কোন পরিবর্তন হবে না
Download
পুরে প্রোজেক্ট টা ডাউনলোড করুন এখানে