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

ترجمة المشروع لا تتم بشكل كامل لارافل

Mohammad Kiblawi

السؤال

السلام عليكم 

اريد ان اترجم المشروع الذي اعمل عليه و لكن هنالك مشكلة و هي ان الترجمة تتم فقط عند  صفحة ال login , اما في الصفحات داخل الموقع لا تتم الترجمة.

كما تعلمنا في فيديو الخاص بترجمة موقع ال instagram  قام المدرب باضافة input من نوع dropdown box حيث يدخل فيه options و من ثم يحفظ ما اختاره المستخدم من لغة داخل الدالة store 

اما في مشروعي لقد قمت بعمل dropdown list (unordered list)  و فيها خياران للغة فعند الضغط على احد اللغات لا يتغير لفة الموقع و عند الذهاب مثلا الى صفحة انشاء المشروع   يكون ال url في الاعلى هكذا http://127.0.0.1:8000/project/setlang/ar و يظهر خطأ 404 اي ان الصفحة غير موجودة  

هذا code ال route

 

Route::get('/', function () {
    return view('auth.login');
})->middleware('language');

Route::middleware(['auth:sanctum', 'verified', 'language'])->get('/home', function () {
    return view('home');
})->name('home');



// Route::get('/project', [ProjectController::class, 'index'])->name('index');
Route::resource('projects', ProjectController::class)->middleware('language');
Route::get('/project/create', [ProjectController::class, 'create'])->middleware('language');
Route::get('/project/{{project}}/edit', [ProjectController::class, 'edit'])->middleware('language');
Route::get('/users', [UserController::class, 'index'])->middleware('language');
Route::post('/users', [UserController::class, 'update'])->middleware('language');
Route::get('setlang/{language}', function ($lang) {
    if ($lang == "ar" || $lang == "en") {
        session(['language' => $lang]);
    } else {
        abort(404);
    }
    return redirect()->back();
});

 

و هذا كود ال navigation 

 <!-- Navigation Links -->

                <div class="hidden md:flex items-center space-x-1 ml-3 ">
                    <a href="/home" class="py-4 px-2 text-green-500 border-b-4 border-green-500 font-semibold ">{{__('Home')}}</a>
                    @if(Auth::user()->role == 1)
                    <a href="/users" class="py-4 px-2 text-gray-500 font-semibold hover:text-green-500 transition duration-300">{{__('Users')}}</a>
                    @endif
                    <div class="dropdown inline-block relative">
                        <button class=" text-gray-500 font-semibold py-2 px-4 rounded inline-flex items-center hover:text-green-500 transition duration-300"">
                            <span class=" mr-1 text-gray-500 font-semibold hover:text-green-500 transition duration-300">{{__('Languages')}}</span>
                            <svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
                                <path d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z" />
                            </svg>
                        </button>
                        <ul class="dropdown-menu absolute hidden text-gray-700 pt-1">
                            <li class=""><a class=" bg-gray-200 hover:bg-gray-400 py-2 px-4 block whitespace-no-wrap" href="setlang/ar">{{__('Arabic')}}</a></li>
                            <li class=""><a class="bg-gray-200 hover:bg-gray-400 py-2 px-4 block whitespace-no-wrap" href="setlang/en">{{__('English')}}</a></li>

                        </ul>
                    </div>

                    <a href="" class="py-4 px-2 text-gray-500 font-semibold hover:text-green-500 transition duration-300">{{__('Contact Us')}}</a>
                </div>
            </div>

 و هذا كود ال middleware  الخاص باللغة

  public function handle(Request $request, Closure $next)
    {
        $lang = $request->session()->get('language', 'en');
        if (Auth::user() != null) {
            App::setLocale(Auth::user()->language);
            if (Auth::user()->language == "ar") {
                View::share('rtl', 'true');
            }
        } else if (isset($lang)) {
            App::setLocale($lang);
            if ($lang == "ar") {
                View::share('rtl', 'true');
            }
        }
        return $next($request);
    }
}

 

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

المشكلة في الروابط href في القائمة المنسدلة فهي روابط نسبية (تبدأ من الصفحة الحالية) وليست مطلقة (تبدأ من بداية العنوان)
فعندما تمرر "setlang/ar"مثلا سيقوم المتصفح عند الضغط على هذا الرابط باضافته لنهاية رابط الصفحة الحالية والذهاب اليها 
في حالتك كانت الصفحة هي projects الرابط الناتج سيكون "projects/setlang/ar" وهو عنوان صفحة غير موجودة في مشروعك (سبب الخطأ 404)

لجعل الرابط مطلق قم بإضافة "/" في بداية العنوان بالشكل التالي

<li class=""><a class=" bg-gray-200 hover:bg-gray-400 py-2 px-4 block whitespace-no-wrap" href="/setlang/ar">{{__('Arabic')}}</a></li>
<li class=""><a class="bg-gray-200 hover:bg-gray-400 py-2 px-4 block whitespace-no-wrap" href="/setlang/en">{{__('English')}}</a></li>


 

 

تم التعديل في بواسطة Hassan Hedr
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في ال middleware الخاص بالترجمة اذا كان المستخدم مسجل دخول فأنت تعين لغة التطبيق كما هي محفوظة في قاعدة البيانات للمستخدم (وتتجاهل بيانات الجلسة التي حددتها بالضغط على خيار اللغة)
يجب حفظ خيار اللغة الموجود في بيانات الجلسة في بيانات المستخدم الحالي أولا كما يلي

 public function handle(Request $request, Closure $next)
    {
        $lang = $request->session()->get('language', 'en');
        if (Auth::user() != null) {
			
            // حفظ خيار تغيير اللغة
            if(isset($lang)){
                Auth::user()->update(['language' => $lang]);
            }

            App::setLocale(Auth::user()->language);
            if (Auth::user()->language == "ar") {
                View::share('rtl', 'true');
            }
        } else if (isset($lang)) {
            App::setLocale($lang);
            if ($lang == "ar") {
                View::share('rtl', 'true');
            }
        }
        return $next($request);
    }
}

 

تم التعديل في بواسطة Hassan Hedr
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 ساعة قال Hassan Hedr:

في ال middleware الخاص بالترجمة اذا كان المستخدم مسجل دخول فأنت تعين لغة التطبيق كما هي محفوظة في قاعدة البيانات للمستخدم (وتتجاهل بيانات الجلسة التي حددتها بالضغط على خيار اللغة)
يجب حفظ خيار اللغة الموجود في بيانات الجلسة في بيانات المستخدم الحالي أولا كما يلي


 public function handle(Request $request, Closure $next)
    {
        $lang = $request->session()->get('language', 'en');
        if (Auth::user() != null) {
			
            // حفظ خيار تغيير اللغة
            if(isset($lang)){
                Auth::user()->update(['language' => $lang]);
            }

            App::setLocale(Auth::user()->language);
            if (Auth::user()->language == "ar") {
                View::share('rtl', 'true');
            }
        } else if (isset($lang)) {
            App::setLocale($lang);
            if ($lang == "ar") {
                View::share('rtl', 'true');
            }
        }
        return $next($request);
    }
}

 

لم تعمل الترجمة 

كما ان الدالة update يظهر تحتها خط احمر يقول لي انها غير معرفة

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

جرب جلب المستخدم الحالي من قاعدة البيانات عبر المعرف للمستخدم المسجل الآن كالتالي

...
if(isset($lang)){
	User::find(Auth::id())->update(['language' => $lang]);
}
...

 

تم التعديل في بواسطة Hassan Hedr
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 59 دقائق مضت قال Hassan Hedr:

جرب جلب المستخدم الحالي من قاعدة البيانات عبر المعرف للمستخدم المسجل الآن كالتالي


...
if(isset($lang)){
	User::find(Auth::id())->update(['language' => $lang]);
}
...

 

ما زال لم يعمل لا اعرف لماذا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

تأكد أن ال middleware مسجل في نواة التطبيق وأن الطلبات تمر عبره، يمكنك وضع التالي (مؤقتًا) والتأكد أن بيانات الجلسة تحتوي على المتحول language بالقيمة الصحيحة

public function handle(Request $request, Closure $next){
	dd($request->session());
	...
}

 

تم التعديل في بواسطة Hassan Hedr
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 21 دقائق مضت قال Hassan Hedr:

تأكد أن ال middleware مسجل في نواة التطبيق وأن الطلبات تمر عبره، يمكنك وضع التالي (مؤقتًا) والتأكد أن بيانات الجلسة تحتوي على المتحول language بالقيمة الصحيحة


public function handle(Request $request, Closure $next){
	dd($request->session());
	...
}

 

Illuminate\Session\Store {#1366 ▼ #id: "VfQ0bCwcFLwDsYjX2F6vIjINP1oYdVHjjoriQ8Tn" #name: "company_session" #attributes: array:6 [▶] #handler: Illuminate\Session\DatabaseSessionHandler {#1359 ▶} #started: true }

ظهر هذا الكود

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
  • قم بفرد قيمة attributes بالضغط على السهم المجاور لكي تعاين بيانات الجلسة داخلها وتتاكد من وجود قيمة اللغة الصحيحة
  • بعد ذلك قم بإلغاء السطر السابق "(..)dd" وتأكد من قيامك بإعداد ملف الترجمات في الملف "resources/lang/ar.json" كالتالي
    {
      "Home": "الرئيسية",
      "Users": "المستخدمين",
      "Languages": "اللغات",
      "Arabic": "العربية",
      "English": "الانجليزية",
      "Contact Us": "تواصل معنا"
    }

     

تم التعديل في بواسطة Hassan Hedr
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 12 ساعات قال Hassan Hedr:
  • قم بفرد قيمة attributes بالضغط على السهم المجاور لكي تعاين بيانات الجلسة داخلها وتتاكد من وجود قيمة اللغة الصحيحة
  • بعد ذلك قم بإلغاء السطر السابق "(..)dd" وتأكد من قيامك بإعداد ملف الترجمات في الملف "resources/lang/ar.json" كالتالي
    
    {
      "Home": "الرئيسية",
      "Users": "المستخدمين",
      "Languages": "اللغات",
      "Arabic": "العربية",
      "English": "الانجليزية",
      "Contact Us": "تواصل معنا"
    }

     

يأخذ الموقع اللغة لكن لا تتم الترجمة

شيء غريب عجيب

Annotation 2021-08-18 104417.png

تم التعديل في بواسطة Mohammad Kiblawi
تعديل
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

عملك كمبرمج هو اكتشاف الغريب وفهمه وتصحيحه لا تيأس

  • هل تأكدت من انشاء ملف الترجمات "ar.json" في مكانه الصحيح "resources/lang/ar.json"؟
  • قم بالدخول لقاعدة البيانات والتأكد أن جدول "users" فيه حقل "language" وأن القيمة "ar" موجودة عند سطر المستخدم  
  • جرب مؤقتا تبديل شيفرة ال middleware الى التالي فقط للاختبار، يجب ان تتم الترجمة بشكل صحيح في حال ملفات الترجمة يتم تحميلها  
    public function handle(Request $request, Closure $next){
    	App::setLocale("ar");
    }

     

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال Hassan Hedr:

تأكد أن الحقل language موجود في مصفوفة الـ fillable داخل صف ال User كما يلي


class User extends Model
{
    protected $fillable = ['language', ...];
	...
}

 

شكرا لك الحمدلله تمت البرمجة  بنجاح

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...