بضائع

دليل تعريب Laravel خطوة بخطوة ، دروس مع أمثلة

كيفية توطين مشروع Laravel ، وكيفية تطوير مشروع في Laravel وجعله قابلاً للاستخدام في لغات متعددة. في هذه المقالة ، نرى كيفية العمل مع ملفات الترجمة ، وإنشاء محوّل لغة والمزيد باستخدام الأمثلة.

Laravel هو تطبيق مصمم ليكون محليًا ، للتكيف مع اللغات والثقافات المختلفة. يخصص التوطين تطبيقات دولية للغة معينة من خلال الترجمة.

المتطلبات الأساسية

  • في هذه المقالة سوف نشير إلى الإصدار 8.x من Laravel;
  • لمتابعة هذا البرنامج التعليمي بنجاح ، يجب أن تكون لديك المعرفة اللازمة بلغة برمجة PHP وإطار عمل Laravel.
  • المجال الخاص بك هو localhost. إذا لم يكن كذلك ، فاستبدل localhost باستخدام اسم المجال الخاص بك أو عنوان IP (حسب التثبيت الخاص بك).

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

في Laravel ، كما هو الحال في العديد من الأطر الأخرى ، يمكننا تخزين الترجمات للغات مختلفة في ملفات منفصلة. هناك طريقتان لتنظيم ملفات ترجمة Laravel:

  • أسلوب قديم يخزن الملفات في الموقع التالي: resources/lang/{en,fr,ru}/{myfile.php};
  • أسلوب جديد يخزن الملفات في الموقع التالي: resources/lang/{fr.json, ru.json};

بالنسبة للغات التي تختلف حسب المنطقة ، يجب عليك تسميتها directory/file للغة وفقًا لمعيار ISO 15897. على سبيل المثال ، بالنسبة للغة الإنجليزية في المملكة المتحدة ، قد تستخدمها en_GB بدلا من en-gb. في هذه المقالة ، سنركز على الطريقة الثانية ، ولكن الأمر نفسه ينطبق على الطريقة الأولى (باستثناء كيفية تسمية مفاتيح الترجمة واسترجاعها). 

ترجمات بسيطة

الآن ، دعنا نذهب إلى resources/views/welcome.blade.phpملف واستبدال محتويات ملف bodyضع علامة معنا ، مثل:

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                Welcome to our website
            </div>
        </div>
    </div>
</body>

سنبدأ بإعداد رسالة الترحيب الخاصة بالترجمة ، وهو أمر سهل حقًا في Laravel. كل ما عليك فعله هو استبدال النص "مرحبًا بك في موقعنا" بالرمز التالي: {{ __('Welcome to our website') }}. سيوجه هذا Laravel لعرض "مرحبًا بك في موقعنا" افتراضيًاdefinite وابحث عن ترجمات هذه السلسلة إذا تم تعيين لغة أخرى غير الإنجليزية (سنصل إلى ذلك لاحقًا). سيتم تعيين اللغة الإنجليزية كلغة افتراضيةdefinish من تطبيقنا ، لذلك من خلال الإعداد الافتراضيdefiفي النهاية سنعرض ببساطة النص "مرحبًا بكم في موقعنا على الإنترنت". إذا كانت اللغة مختلفة ، فسنحاول العثور على الترجمة المطابقة وسيتم إنشاؤها في لحظة.

توطين Laravel

لكن كيف يعرف Laravel اللغة الحالية أو اللغات المتوفرة في التطبيق؟ يقوم بذلك من خلال النظر في التكوين المحلي في التطبيق config/app.php. افتح هذا الملف وابحث عن مفتاحي الصفيف الترابطيين هذين:

/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',

يجب أن تكون الأوصاف الموضحة أعلاه تشرح نفسها بنفسها ، ولكن باختصار المفتاح locale يحتوي على الملف المحليdefinish من التطبيق الخاص بك (على الأقل ، إذا لم يتم تعيين لغة أخرى في الكود). و ال fallback_locale يتم تنشيطه في حالة تعيين لغة غير موجودة في تطبيقنا.

أثناء فتح هذا الملف ، دعنا نضيف مفتاحًا جديدًا لسرد جميع اللغات التي سيدعمها تطبيقنا. سنستخدم هذا لاحقًا عند إضافة محوّل محلي. ومع ذلك ، فهذه مهمة اختيارية لأن Laravel لا يتطلب منا القيام بها.

/*
|--------------------------------------------------------------------------
| Available locales
|--------------------------------------------------------------------------
|
| List all locales that your application works with
|
*/
'available_locales' => [
  'English' => 'en',
  'Italian' => 'it',
  'French' => 'fr',
],

الآن تطبيقنا يدعم ثلاث لغات: الإنجليزية والإيطالية والفرنسية.

ملفات الترجمة

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

لنبدأ بإضافة ملفات ترجمة جديدة إلى المجلد resources/lang. أولاً ، قم بإنشاء ملف resources/lang/it.json وإضافة الترجمات المقابلة على النحو التالي:

{
  "Welcome to our website": "Benvenuto nel nostro sito web"
}

بعد ذلك ، قم بإنشاء ملف resources/lang/fr.json:

{

"أهلا في موقعنا": "مرحبا بكم في موقعنا"

}

كما ترى ، نشير دائمًا إلى الرسالة المسبقةdefinito الذي أضفناه في الملف welcome.blade.php (الذي كان {{ __('Welcome to our website') }}). سبب عدم اضطرارنا إلى إنشاء ملف en.json ذلك لأن Laravel يعرف بالفعل الرسائل التي نمررها من خلال الإعداد المسبقdefiانتهى في الوظيفة __() هم من أجل ما قبلنا المحليdefiنيتو أون.

تغيير محلي في Laravel

في هذه المرحلة ، لا يعرف Laravel كيفية تغيير المواقع ، لذلك في الوقت الحالي ، لنقم بالترجمات مباشرة داخل المسار. قم بتعديل مسار الترحيب مسبقًاdefinished كما هو موضح أدناه:

Route::get('/{locale?}', function ($locale = null) {
    if (isset($locale) && in_array($locale, config('app.available_locales'))) {
        app()->setLocale($locale);
    }
    
    return view('welcome');
});

يمكننا الآن زيارة موقعنا على الإنترنت ، وتحديد أي من اللغات المتاحة باعتبارها مقطع المسار الأول: على سبيل المثال ، localhost/rulocalhost/fr. يجب أن تشاهد المحتوى المترجم. إذا حددت لغة غير مدعومة أو لم تحدد موقعًا على الإطلاق ، فسيستخدم Laravel enبشكل افتراضيdefiنيتا.

الوسيطة

قد لا يكون تبديل الإعدادات المحلية لكل رابط موقع هو ما تريده ، وقد لا يبدو نظيفًا من الناحية الجمالية. لهذا السبب سنقوم بإعداد اللغة من خلال محوّل لغة خاص ونستخدم جلسة المستخدم لعرض المحتوى المترجم. لذلك ، قم بإنشاء برمجية وسيطة جديدة داخل ملف app/Http/Middleware/Localization.phpملف أو عن طريق التشغيل artisan make:middleware Localization.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;

class Localization
{
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle(Request $request, Closure $next)
    {
        if (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        }
        return $next($request);
    }
}

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

نظرًا لأننا نحتاج إلى القيام بذلك عند كل طلب ، نحتاج أيضًا إلى إضافته إلى مكدس البرامج الوسيطة المسبقةdefiانتهى في app/http/Kernel.phpل webمجموعة البرامج الوسيطة:

* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
  'web' => [
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      // \Illuminate\Session\Middleware\AuthenticateSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
      \Illuminate\Routing\Middleware\SubstituteBindings::class,
      \App\Http\Middleware\Localization::class, /* <--- add this */
  ],

تغيير مسار

بعد ذلك ، نحتاج إلى إضافة مسار لتغيير اللغة. نحن نستخدم مسار إغلاق ، ولكن يمكنك استخدام نفس الرمز بالضبط داخل وحدة التحكم الخاصة بك إذا كنت ترغب في ذلك:

Route::get('language/{locale}', function ($locale) {
    app()->setLocale($locale);
    session()->put('locale', $locale);

    return redirect()->back();
});

أيضًا ، لا تنس إزالة مفتاح التبديل المحلي الذي تمت إضافته مسبقًا في مسار الترحيب المسبق الخاص بناdefiنيت:

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

بمجرد القيام بذلك ، فإن الطريقة الوحيدة للمستخدم لتغيير اللغة المحددة حاليًا هي عن طريق الدخول localhost/language/{locale}. ال localeسيتم تخزين التحديد داخل الجلسة وسيعيد توجيه المستخدمين إلى المكان الذي أتوا منه (تحقق من Localizationالوسيطة). لتجربتها ، اذهب إلى localhost/language/ru(طالما أن ملف تعريف ارتباط الجلسة موجود في متصفحك) وسترى المحتوى المترجم. يمكنك التنقل في الموقع بحرية أو محاولة تحديث الصفحة ومعرفة أن اللغة المحددة محفوظة.

المبدل

نحتاج الآن إلى إنشاء شيء يمكن للمستخدم النقر فوقه لتغيير اللغة بدلاً من إدخال الرموز المحلية يدويًا في عنوان URL. للقيام بذلك ، سنضيف مدقق لغة بسيطًا جدًا. لذلك ، قم بإنشاء ملف resources/views/partials/language_switcher.blade.phpملف مع الكود التالي:

<div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
    @foreach($available_locales as $locale_name => $available_locale)
        @if($available_locale === $current_locale)
            <span class="ml-2 mr-2 text-gray-700">{{ $locale_name }}</span>
        @else
            <a class="ml-1 underline ml-2 mr-2" href="language/{{ $available_locale }}">
                <span>{{ $locale_name }}</span>
            </a>
        @endif
    @endforeach
</div>

تضمين أداة التحويل التي تم إنشاؤها حديثًا في عرض "الترحيب":

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            @include('partials/language_switcher')
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                {{ __('Welcome to our website') }}
            </div>
        </div>
    </div>
</body>

افتح ال app/Providers/AppServiceProvider.phpملف وإضافة الكود لمشاركته عندما يتم تكوين محوّل اللغة الخاص بنا. على وجه التحديد ، سنقوم بمشاركة الإعدادات المحلية الحالية التي يمكن الوصول إليها كملف {{ $current_locale }}.

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

خيارات الترجمة المتقدمة في PHP Laravel

سنعمل بشكل رئيسي مع resources/views/welcome.blade.php، لذلك يجب أن يحدث كل شيء في وجهة نظرنا المرحب بها ما لم ينص على خلاف ذلك.

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

على سبيل المثال ، دعنا نقول مرحباً لمستخدمنا الخيالي (أماندا) بدلاً من مجرد عرض رسالة عامة:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}

لاحظ أننا استخدمنا الاسم مع الحرف الأول بأحرف صغيرة ، ولكن العنصر النائب مع الحرف الأول بأحرف كبيرة. بهذه الطريقة ، يمكن أن يساعدك Laravel في كتابة الكلمة الفعلية بأحرف كبيرة تلقائيًا. سيحدث هذا إذا بدأ العنصر النائب بحرف كبير ، على سبيل المثال ، :Nameينتج "كارولين" أو كلمة بأحرف كبيرة بالكامل ،  :NAMEتنتج "كارولين".

نقوم أيضًا بتحديث ملفات الترجمة الخاصة بنا resources/lang/fr.jsonresources/lang/it.json ، حيث سنرى في الوقت الحالي النسخة الإنجليزية فقط في أي مكان لأن مفاتيح الترجمة لا تتطابق مع الترجمات.

فرنسي:

{

   "Welcome to our website, :Name": "Bienvenue sur notre site, :Name"

}

الإيطالية:

{

   "Welcome to our website, :Name": "Benvenuto sul nostro sito web, :Name"

}

التعددية

لرؤية التعددية في العمل ، دعنا نضيف فقرة جديدة من النص. 

لأداء الجمع ، يجب عليك استخدام الوظيفة trans_choice بدلا من __()، فمثلا:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
<br>
{{ trans_choice('There is one apple|There are many apples', 2) }}

كما ترى ، يتم فصل صيغ الجمع بامتداد |.

الآن ، ماذا لو احتجنا إلى صيغ الجمع المتعددة؟ 

هذا ممكن أيضًا:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24) }}

في هذه الحالة ، نسمح بالأرقام 01، و 219، وأخيرًا من 20 فصاعدًا. بالطبع ، يمكنك إضافة أي عدد تريده من القواعد.

إذن ماذا لو أردنا العناصر النائبة في صيغ الجمع؟ 

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24, ['form' => 'is']) }}

يمكننا أيضًا استخدام العدد الذي تم تمريره في `trans_choice` إذا لزم الأمر باستخدام عنصر نائب :count خاص:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}

أخيرًا ، لا تنس تحديث ملفات الترجمة الخاصة بك بأي تغييرات أجريتها على الترجمة الأساسية.

الإيطالية:

{
  "Welcome to our website, :Name": "Benvenuto nel nostro sito, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Nessuna mela|{1} C'è:count mela|[2,19] Ci sono :count mele"
}

فرنسي:

{    
  "Welcome to our website, :Name": "Bienvenue sur notre site, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Il n'y a pas de pommes|{1} Il n'y :form :count pomme|[2,19] Il y :form :count pommes"
}

العمل مع التواريخ المترجمة في Laravel

لتحديد التواريخ ، سوف نستغل قوة كربون ، والذي يأتي مع Laravel افتراضيًاdefiنيتا. تفحص ال توثيق الكربون ؛ يمكنك القيام بالكثير من الأشياء الممتعة. على سبيل المثال ، يمكننا ضبط منطقتنا بقواعد التاريخ والوقت.

في مثالنا البسيط ، سنعرض التاريخ الحالي المترجم للغة المحددة. في منطقتنا routes/web.php، نقوم بتحديث مسار صفحة الترحيب وتمرير رسالة التاريخ المترجمة إلينا view مرحباً:

<?php
Route::get('/', function () {
    $today = \Carbon\Carbon::now()
        ->settings(
            [
                'locale' => app()->getLocale(),
            ]
        );

    // LL is macro placeholder for MMMM D, YYYY (you could write same as dddd, MMMM D, YYYY)
    $dateMessage = $today->isoFormat('dddd, LL');

    return view('welcome', [
        'date_message' => $dateMessage
    ]);
});

لنقم بالتحديث resources/views/welcome.blade.php إضافة عرض التاريخ ، مثل:

{{ __('Welcome to our website, :Name', ['name' => 'amanda']) }}
<br>
{{ trans_choice('{0} There :form :count apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}
<br>
{{ $date_message }}

محاولة تغيير اللغة على الصفحة الرئيسية لـ localhost، سنرى أن التواريخ أصبحت مترجمة الآن ، على سبيل المثال:

تنسيق الأرقام والعملات باستخدام NumberFormatter

في بلدان مختلفة ، يستخدم الأشخاص تنسيقات مختلفة لتمثيل الأرقام ، على سبيل المثال:

  • الولايات المتحدة → 123.123,12
  • فرنسا → 123

لذلك ، لتعكس هذه الاختلافات في تطبيق Laravel الخاص بك ، يمكنك استخدام الرقم بالطريقة الآتية:

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::DECIMAL);

$num2 = NumberFormatter::create('fr', NumberFormatter::DECIMAL);

يمكنك أيضًا كتابة الرقم بلغة معينة وعرض شيء مثل "مائة وثلاثة وعشرون ألف ومائة وثلاثة وعشرون فاصل واحد اثنان اثنان":

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::SPELLOUT);
$num2 = NumberFormatter::create('fr', NumberFormatter::SPELLOUT);

بالإضافة إلى ذلك ، يتيح لك NumberFormatter تحديد موقع العملات بسهولة ، على سبيل المثال:

<?php
$currency1 = NumberFormatter::create('fr', NumberFormatter::CURRENCY);
$currency2 = NumberFormatter::create('en_US', NumberFormatter::CURRENCY);

وذلك ل fr سترى يورو ، بينما ل en_US ستكون العملة بالدولار الأمريكي.

Ercole Palmeri

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

المقالات الأخيرة

يوقع الناشرون وOpenAI اتفاقيات لتنظيم تدفق المعلومات التي تتم معالجتها بواسطة الذكاء الاصطناعي

أعلنت صحيفة فاينانشيال تايمز يوم الاثنين الماضي عن صفقة مع OpenAI. "فاينانشيال تايمز" ترخص صحافتها ذات المستوى العالمي...

أبريل 30 2024

المدفوعات عبر الإنترنت: إليك كيف تجعلك خدمات البث تدفع إلى الأبد

يدفع الملايين من الأشخاص مقابل خدمات البث، ويدفعون رسوم الاشتراك الشهرية. من الشائع أنك…

أبريل 29 2024

يتميز Veeam بالدعم الأكثر شمولاً لبرامج الفدية، بدءًا من الحماية وحتى الاستجابة والاسترداد

سوف تستمر شركة Coveware by Veeam في تقديم خدمات الاستجابة لحوادث الابتزاز السيبراني. ستوفر Coveware إمكانات الطب الشرعي والمعالجة...

أبريل 23 2024

الثورة الخضراء والرقمية: كيف تعمل الصيانة التنبؤية على تغيير صناعة النفط والغاز

تُحدث الصيانة التنبؤية ثورة في قطاع النفط والغاز، من خلال اتباع نهج مبتكر واستباقي لإدارة المحطات.

أبريل 22 2024

اقرأ الابتكار بلغتك

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

تابعنا