اذهب إلى المحتوى

السؤال

نشر (معدل)

أحاول إضافة أكثر من لغة على موقعي المبني بلارافيل، ولقد قمت بإضافة مسارات لكل لغة:

/
/[about]
/[contact]
/ar
/ar/[about]
/ar/[contact]
/en
/en/[about]
/en/[contact]

حيث سيتم ترجمة الصفحة [ ] حسب اللغة المختارة من قبل المستخدم في الواجهة. فمثلاً ستكون about في اللغة الانكليزية و [من-نحن] في العربية.

ولكن من الصعب فعل ذلك على كامل الصفحات أو حتى في حال كان لدي عدد أكبر من اللغات، هل يوجد طريقة أفضل لوضع عدة لغات في لارافيل؟ لأن هدفي أيضاً ترجمة المسارات وليس فقط الصفحات.

تم التعديل في بواسطة Amir Alsaeed

Recommended Posts

  • 0
نشر

يمكن تبسيط العملية بالتسهيلات الموجودة في لارافيل لدعم تعدد اللغات وبوضع مسار خاص بكل لغة، ضمن المجلّد app/lang يمكننا إضافة ملف routes.php خاص بكل لغة، فبفرض لدينا 3 لغات نقوم بإنشاء 3 ملفات في 3 مجلدات مختلفة. وضمن كل ملف نضع الترجمة الخاصة باللغة على شكل مصفوفة من المفاتيح والقيم key => value بالشكل التالي:

<?php

// app/lang/ar/routes.php ضمن المسار

return array(

    'contact' => 'تواصل معنا',
    'about'   => 'من نحن'
);

وبنفس الطريقة لبقية اللغات. ثم نقوم بإضافة اللغات على ملف app/config/app.php :

'locale' => 'ar', => نقوم بتعريف اللغة الافتراضية للموقع

//ثم نقوم بإضافة اللغات الأخرى


'alt_langs' => array ('en', 'gr'),

/**
 *  Prefix of selected locale  - leave empty (set in runtime)
 */
'locale_prefix' => '',

حيث يجب وضع اسم اللغة ضمن alt_langs بشكل مطابق لأسماء الملفات التي قمنا بإنشائها.

وأخيراً، ضمن الملف app/routes.php يجب أن يكون بشكل مشابه للتالي:

<?php


if (in_array(Request::segment(1), Config::get('app.alt_langs'))) {

    App::setLocale(Request::segment(1));
    Config::set('app.locale_prefix', Request::segment(1));
}


foreach(Lang::get('routes') as $k => $v) {
    Route::pattern($k, $v);
}


Route::group(array('prefix' => Config::get('app.locale_prefix')), function()
{
    Route::get(
        '/',
        function () {
            return "Home- ".App::getLocale();
        }
    );


    Route::get(
        '/{contact}/',
        function () {
            return "contact".App::getLocale();
        }
    );

    Route::get(
        '/{about}/',
        function () {
            return "about".App::getLocale();

        }
    );

});

حيث سيتم ترجمة /{contact}/ و باقي المسارات حسب prefix التي قمنا بتعريفها ضمن اللغة والمسار.

  • 0
نشر

أفضل طريقة هي حفظ اللغة بـ Session

فنقوم بإنشاء التوجيه الآتي لتغيير اللغة وحفظ القيمة بـ session

Route::get('lang/{locale}', function ($locale) {
    if (! in_array($locale, ['en', 'ar'])) {
        return Redirect()->back();
    }

    session(['Locale'=>$locale]);
    return Redirect()->back();
})->name('Lang');

ثمّ نقوم بإنشاء Middleware باسم CheckLang ويحتوي على

public function handle($request, Closure $next){
	
	if(session()->has('Locale')){
		App::setLocale(session('Locale'));
	}
	
	return $next($request);
}

وتعريف الـ Middleware الجديد في ملف app/Http/kernal.php

protected $routeMiddleware = [
	[...]
	'checkLang' => \Illuminate\Auth\Middleware\CheckLang::class,
];

ثمّ تطبيق CheckLang  على جميع التوجيهات في المشروع

ليصبح كالآتي:

Route::middleware(['checkLang'])->group(function () {
    // Routes
});

وللتنقل بين اللغات نضيف الرابط التالي لكل لغة في الموقع

<a href="{{ route('lang', ['locale' => 'ar']) }}">اللغة العربية</a>
<a href="{{ route('lang', ['locale' => 'en']) }}">اللغة الإنجليزية</a>

 

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...