إطار Laravel

الترجمة والتدويل

15 دقيقة الدرس 28 من 45

الترجمة والتدويل

تتيح الترجمة (l10n) والتدويل (i18n) لتطبيق لارافل دعم لغات متعددة وتفضيلات إقليمية. توفر لارافل ميزات قوية لترجمة نص تطبيقك بسهولة، وتنسيق التواريخ والأرقام، وإدارة المحتوى متعدد اللغات.

فهم الترجمة

المفاهيم الأساسية:

  • التدويل (i18n): تصميم تطبيقك لدعم لغات متعددة
  • الترجمة (l10n): تكييف تطبيقك للغات ومناطق محددة
  • اللغة المحلية: رمز لغة (مثل "en"، "ar"، "fr") يحدد لغة ومنطقة
  • سلاسل الترجمة: نص يمكن ترجمته إلى لغات مختلفة
ملاحظة: تخزن لارافل ملفات الترجمة في دليل resources/lang (Laravel 8) أو دليل lang/ (Laravel 9+). كل لغة لها دليل فرعي خاص بها.

التكوين

قم بتكوين اللغة الافتراضية والاحتياطية في config/app.php:

<?php return [ // اللغة الافتراضية للتطبيق 'locale' => 'en', // اللغة الاحتياطية عند فقدان الترجمة 'fallback_locale' => 'en', // اللغات المتاحة 'available_locales' => ['en', 'ar', 'fr', 'es'], ];

إنشاء ملفات الترجمة

أنشئ أدلة اللغات وملفات الترجمة:

# هيكل الدليل resources/lang/ ├── en/ │ ├── messages.php │ ├── auth.php │ └── validation.php ├── ar/ │ ├── messages.php │ ├── auth.php │ └── validation.php └── fr/ ├── messages.php ├── auth.php └── validation.php

مثال على ملف ترجمة resources/lang/en/messages.php:

<?php return [ 'welcome' => 'Welcome to our application', 'goodbye' => 'Goodbye, :name!', 'user_greeting' => 'Hello, :name! You have :count messages.', 'items' => 'You have :count item|You have :count items', 'profile' => [ 'title' => 'Profile', 'edit' => 'Edit Profile', 'settings' => 'Settings', ], 'notifications' => [ 'success' => 'Operation completed successfully!', 'error' => 'An error occurred. Please try again.', 'warning' => 'Please check your input.', ], ];

الترجمة العربية resources/lang/ar/messages.php:

<?php return [ 'welcome' => 'مرحبًا بك في تطبيقنا', 'goodbye' => 'وداعًا، :name!', 'user_greeting' => 'مرحبًا، :name! لديك :count رسائل.', 'items' => 'لديك :count عنصر|لديك :count عناصر', 'profile' => [ 'title' => 'الملف الشخصي', 'edit' => 'تعديل الملف الشخصي', 'settings' => 'الإعدادات', ], 'notifications' => [ 'success' => 'تمت العملية بنجاح!', 'error' => 'حدث خطأ. يرجى المحاولة مرة أخرى.', 'warning' => 'يرجى التحقق من إدخالك.', ], ];

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

استخدم دالة المساعد __() أو trans() لاسترجاع الترجمات:

<?php // ترجمة أساسية echo __('messages.welcome'); // المخرج: "مرحبًا بك في تطبيقنا" // ترجمة مع معاملات echo __('messages.goodbye', ['name' => 'أحمد']); // المخرج: "وداعًا، أحمد!" // مفاتيح ترجمة متداخلة echo __('messages.profile.title'); // المخرج: "الملف الشخصي" // قيمة افتراضية إذا كانت الترجمة مفقودة echo __('messages.unknown', [], 'نص افتراضي'); // المخرج: "نص افتراضي" // استخدام مساعد trans() echo trans('messages.welcome');

استخدام الترجمات في Blade

استخدم التوجيه @lang أو مساعدي الترجمة في قوالب Blade:

<!-- استخدام توجيه @lang --> <h1>@lang('messages.welcome')</h1> <!-- استخدام مساعد __() --> <p>{{ __('messages.goodbye', ['name' => $user->name]) }}</p> <!-- ترجمة مع HTML --> <div class="alert"> {!! __('messages.notifications.success') !!} </div> <!-- حلقة مع الترجمات --> @foreach($items as $item) <li>{{ __("messages.items.$item->type") }}</li> @endforeach

تبديل اللغات

قم بتغيير لغة التطبيق في وقت التشغيل:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Session; class LocaleController extends Controller { public function switch($locale) { // التحقق من صحة اللغة if (!in_array($locale, ['en', 'ar', 'fr'])) { abort(404); } // تعيين لغة التطبيق App::setLocale($locale); // التخزين في الجلسة للاستمرارية Session::put('locale', $locale); return redirect()->back(); } } // في middleware namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Session; class SetLocale { public function handle($request, Closure $next) { // الحصول على اللغة من الجلسة أو URL أو الافتراضية $locale = Session::get('locale', config('app.locale')); App::setLocale($locale); return $next($request); } }

الترجمة القائمة على URL

قم بتضمين اللغة في عناوين URL لتحسين محركات البحث:

<?php // routes/web.php Route::prefix('{locale}')->middleware('setlocale')->group(function () { Route::get('/', [HomeController::class, 'index'])->name('home'); Route::get('/about', [PageController::class, 'about'])->name('about'); Route::get('/contact', [PageController::class, 'contact'])->name('contact'); }); // Middleware لتعيين اللغة من URL namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\App; class SetLocaleFromUrl { public function handle($request, Closure $next) { $locale = $request->segment(1); if (in_array($locale, config('app.available_locales'))) { App::setLocale($locale); } return $next($request); } } // إنشاء عناوين URL محلية route('home', ['locale' => 'en']); // /en route('about', ['locale' => 'ar']); // /ar/about

الجمع والمفرد

تدعم لارافل قواعد الجمع والمفرد للغات مختلفة:

<?php // في ملف الترجمة 'apples' => '{0} No apples|{1} One apple|[2,*] :count apples', 'time' => '{1} :value minute ago|[2,*] :value minutes ago', // الاستخدام echo trans_choice('messages.apples', 0); // "No apples" echo trans_choice('messages.apples', 1); // "One apple" echo trans_choice('messages.apples', 5); // "5 apples" // الجمع والمفرد بالعربية (أكثر تعقيدًا) 'posts' => '{0} لا توجد منشورات|{1} منشور واحد|{2} منشوران|[3,10] :count منشورات|[11,*] :count منشور',

ملفات ترجمة JSON

للترجمات البسيطة من مفتاح إلى قيمة بدون تداخل:

// resources/lang/en.json { "Welcome": "Welcome", "Login": "Login", "Register": "Register", "Email": "Email Address", "Password": "Password" } // resources/lang/ar.json { "Welcome": "مرحبًا", "Login": "تسجيل الدخول", "Register": "التسجيل", "Email": "عنوان البريد الإلكتروني", "Password": "كلمة المرور" } // الاستخدام (يستخدم النص الإنجليزي كمفتاح) {{ __('Welcome') }} {{ __('Email') }}
نصيحة: ملفات ترجمة JSON رائعة للترجمات البسيطة وتعمل بشكل جيد مع أطر عمل JavaScript. استخدم مصفوفات PHP للترجمات المعقدة مع التداخل والجمع.

تنسيق التواريخ والأرقام

قم بتنسيق التواريخ والأرقام وفقًا للغة:

<?php use Illuminate\Support\Carbon; // تنسيق التاريخ مع Carbon $date = Carbon::parse('2024-01-15'); App::setLocale('en'); echo $date->translatedFormat('l, F j, Y'); // المخرج: "Monday, January 15, 2024" App::setLocale('ar'); echo $date->translatedFormat('l، j F، Y'); // المخرج: "الاثنين، 15 يناير، 2024" // تنسيق الأرقام $number = 1234567.89; App::setLocale('en'); echo number_format($number, 2); // المخرج: "1,234,567.89" App::setLocale('ar'); setlocale(LC_NUMERIC, 'ar_AE.utf8'); echo number_format($number, 2); // قد تحتاج إلى تنسيق إضافي للأرقام العربية

دعم RTL (من اليمين إلى اليسار)

دعم لغات RTL مثل العربية والعبرية:

<!-- في تخطيط Blade --> <html lang="{{ app()->getLocale() }}" dir="{{ in_array(app()->getLocale(), ['ar', 'he', 'fa']) ? 'rtl' : 'ltr' }}"> <head> @if(in_array(app()->getLocale(), ['ar', 'he', 'fa'])) <link rel="stylesheet" href="{{ asset('css/rtl.css') }}"> @else <link rel="stylesheet" href="{{ asset('css/app.css') }}"> @endif </head>
/* CSS لدعم RTL */ [dir="rtl"] { text-align: right; } [dir="rtl"] .float-left { float: right; } [dir="rtl"] .float-right { float: left; } [dir="rtl"] .text-left { text-align: right; } [dir="rtl"] .ml-3 { margin-left: 0; margin-right: 0.75rem; }

Spatie Laravel Translatable

استخدم حزمة Spatie الشهيرة لنماذج قاعدة البيانات القابلة للترجمة:

# تثبيت الحزمة composer require spatie/laravel-translatable <?php // النموذج namespace App\Models; use Illuminate\Database\Eloquent\Model; use Spatie\Translatable\HasTranslations; class Post extends Model { use HasTranslations; public $translatable = ['title', 'content']; } // الترحيل Schema::create('posts', function (Blueprint $table) { $table->id(); $table->json('title'); $table->json('content'); $table->timestamps(); }); // الاستخدام $post = new Post(); $post->setTranslation('title', 'en', 'Hello World'); $post->setTranslation('title', 'ar', 'مرحبا بالعالم'); $post->save(); // استرجاع الترجمات echo $post->getTranslation('title', 'en'); // "Hello World" echo $post->title; // يستخدم تلقائيًا اللغة الحالية

تمرين 1: الترجمة الأساسية

قم بإعداد تطبيق متعدد اللغات:

  1. أنشئ ملفات ترجمة للإنجليزية والعربية
  2. أضف ترجمات للتنقل والنماذج والرسائل
  3. أنشئ مبدل لغة في التخطيط الخاص بك
  4. قم بتخزين اللغة المحددة في الجلسة
  5. اختبر التبديل بين اللغات

تمرين 2: اللغات القائمة على URL

قم بتنفيذ بادئات اللغة في عناوين URL:

  1. أضف بادئة لغة لجميع المسارات (/en/*، /ar/*)
  2. أنشئ middleware لتعيين اللغة من URL
  3. قم بتحديث جميع مساعدي route() لتضمين معامل اللغة
  4. قم بتنفيذ علامات hreflang لتحسين محركات البحث
  5. أضف إعادة توجيه تلقائية بناءً على لغة المتصفح

تمرين 3: نماذج قابلة للترجمة

أنشئ مدونة متعددة اللغات:

  1. قم بتثبيت Spatie Laravel Translatable
  2. اجعل نموذج Post قابلاً للترجمة (title، content، excerpt)
  3. أنشئ نماذج لإدخال الترجمات لكل لغة
  4. اعرض المنشورات باللغة الحالية
  5. أضف دعم CSS RTL للعربية

أفضل الممارسات

  • تنظيم الترجمات: قم بتجميع الترجمات ذات الصلة في ملفات منفصلة
  • استخدم المفاتيح: استخدم مفاتيح وصفية بدلاً من الجمل الكاملة
  • لغة احتياطية: قدم دائمًا لغة احتياطية
  • اختبر جميع اللغات: اختبر تطبيقك بانتظام بجميع اللغات المدعومة
  • تحسين محركات البحث: استخدم علامات hreflang وعناوين URL خاصة باللغة
  • دعم RTL: صمم مع وضع RTL في الاعتبار من البداية
  • ترجمة احترافية: استخدم مترجمين محترفين، وليس الترجمة الآلية
  • السياق: قدم سياقًا للمترجمين (تعليقات في ملفات الترجمة)

الخلاصة

في هذا الدرس، تعلمت:

  • الفرق بين الترجمة والتدويل
  • كيفية إنشاء وتنظيم ملفات الترجمة
  • استخدام مساعد __() والتوجيه @lang
  • تبديل اللغات في وقت التشغيل وعبر عناوين URL
  • قواعد الجمع والمفرد للغات مختلفة
  • تنسيق التواريخ والأرقام للغات
  • دعم لغات RTL مثل العربية
  • استخدام Spatie Translatable لمحتوى قاعدة البيانات

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