مقالات

راهنمای گام به گام محلی سازی لاراول، آموزش همراه با مثال

چگونه یک پروژه لاراول را بومی سازی کنیم، چگونه یک پروژه را در لاراول توسعه دهیم و آن را در چندین زبان قابل استفاده کنیم. در این مقاله نحوه کار با فایل های ترجمه، ایجاد تغییر دهنده زبان و موارد دیگر را با مثال می بینیم.

لاراول برنامه ای است که به صورت محلی طراحی شده است تا با زبان ها و فرهنگ های مختلف سازگار شود. محلی‌سازی برنامه‌های بین‌المللی شده را از طریق ترجمه برای یک زبان خاص تنظیم می‌کند.

پیش نیازها

  • در این مقاله به آن اشاره خواهیم کرد لاراول نسخه 8.x;
  • برای پیگیری موفقیت آمیز این آموزش، باید دانش لازم در مورد زبان برنامه نویسی PHP و فریم ورک لاراول را داشته باشید.
  • دامنه شماست localhost. اگر نه، تعویض کنید localhost با نام دامنه یا آدرس IP خود (بسته به نصب شما).

کار با فایل های ترجمه

در لاراول، درست مانند بسیاری از فریمورک های دیگر، می توانیم ترجمه های زبان های مختلف را در فایل های جداگانه ذخیره کنیم. دو راه برای سازماندهی فایل های ترجمه لاراول وجود دارد:

  • یک رویکرد قدیمی‌تر که فایل‌ها را در مکان زیر ذخیره می‌کند: 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>

ما با آماده کردن پیام خوشامدگویی خود به بومی سازی شروع می کنیم، که در لاراول واقعا آسان است. تنها کاری که باید انجام دهید این است که متن "به وب سایت ما خوش آمدید" را با کد زیر جایگزین کنید: {{ __('Welcome to our website') }}. این به لاراول دستور می دهد که به طور پیش فرض "Welcome to our website" را نمایش دهدdefinite و اگر زبانی غیر از انگلیسی تنظیم شده است به دنبال ترجمه های این رشته باشید (بعداً به آن خواهیم پرداخت). انگلیسی به عنوان زبان پیش فرض تنظیم خواهد شدdefinish از برنامه ما، بنابراین به طور پیش فرض تنظیم شده استdefiدر پایان به سادگی متن "به وب سایت ما خوش آمدید" را نمایش می دهیم. اگر محلی متفاوت باشد، سعی می کنیم ترجمه منطبق را پیدا کنیم و در یک لحظه ایجاد می شود.

محلی سازی لاراول

اما لاراول چگونه می‌داند که زبان فعلی کدام است یا کدام زبان‌ها در اپلیکیشن موجود است؟ این کار را با مشاهده تنظیمات محلی در برنامه انجام می دهد 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 در صورتی فعال می شود که محلی غیر موجود را در برنامه خود تنظیم کنیم.

در حالی که ما این فایل را باز داریم، بیایید یک کلید جدید برای راحتی خود اضافه کنیم که تمام مناطقی را که برنامه ما پشتیبانی می کند فهرست می کند. ما بعداً هنگام اضافه کردن یک سوئیچر محلی از آن استفاده خواهیم کرد. با این حال، این یک کار اختیاری است زیرا لاراول از ما نیازی به انجام آن ندارد.

/*
|--------------------------------------------------------------------------
| 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 این به این دلیل است که لاراول از قبل می‌داند کدام پیام‌ها را با تنظیمات قبلی ارسال می‌کنیمdefiدر عملکرد به پایان رسید __() آنها برای پیش محلی ما هستندdefinito en.

تغییر محلی در لاراول

در این مرحله، لاراول نمی‌داند چگونه محلی‌ها را تغییر دهد، بنابراین در حال حاضر، اجازه دهید ترجمه‌ها را مستقیماً در داخل مسیر انجام دهیم. مسیر خوش آمدگویی را از قبل تغییر دهیدdefiمطابق شکل زیر نشان داده شده است:

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. شما باید محتوای بومی شده را ببینید. در صورتی که محلی پشتیبانی نشده را مشخص کنید یا اصلاً محلی را مشخص نکنید، لاراول از آن استفاده خواهد کرد. 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);
    }
}

این میان‌افزار به لاراول دستور می‌دهد تا در صورت وجود این انتخاب در جلسه، از محلی انتخاب‌شده توسط کاربر استفاده کند.

از آنجایی که ما باید این کار را در هر درخواست انجام دهیم، همچنین باید آن را به پشته پیش میان افزار اضافه کنیم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']) }}

توجه داشته باشید که ما نام را با حرف اول با حروف کوچک استفاده می کنیم، اما از مکان نگهدارنده با حرف اول با حروف بزرگ استفاده می کنیم. به این ترتیب، لاراول می تواند به شما کمک کند تا کلمه واقعی را به طور خودکار با حروف بزرگ بنویسید. این اتفاق می افتد اگر مکان نگهدار با یک حرف بزرگ شروع شود، برای مثال، :Name"Caroline" یا یک کلمه کاملا بزرگ را تولید می کند،  :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) }}

همانطور که می بینید، اشکال جمع با a از هم جدا می شوند |.

حال، اگر به چند شکل جمع نیاز داشته باشیم، چه؟ 

این نیز ممکن است:

{{ 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"
}

کار با تاریخ های محلی در لاراول

برای تعیین محل تاریخ، از قدرت استفاده خواهیم کرد کربن که به صورت پیش فرض با لاراول عرضه می شود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 123,12

بنابراین، برای انعکاس این تفاوت ها در برنامه لاراول خود، می توانید استفاده کنید NumberFormatter به روش زیر:

<?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 خبر داد. FT مجوز روزنامه نگاری در سطح جهانی خود را صادر می کند…

آوریل 30 2024

پرداخت های آنلاین: در اینجا نحوه پرداخت خدمات جریانی شما را برای همیشه توضیح می دهد

میلیون‌ها نفر برای خدمات استریم پرداخت می‌کنند و هزینه اشتراک ماهانه می‌پردازند. این عقیده رایج است که شما…

آوریل 29 2024

Veeam دارای جامع ترین پشتیبانی از باج افزار، از محافظت تا پاسخ و بازیابی است

Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیت‌های پزشکی قانونی و اصلاحی را ارائه می‌دهد…

آوریل 23 2024

انقلاب سبز و دیجیتال: چگونه تعمیر و نگهداری پیش‌بینی‌کننده صنعت نفت و گاز را متحول می‌کند

تعمیر و نگهداری پیش بینی شده با رویکردی نوآورانه و پیشگیرانه برای مدیریت کارخانه، بخش نفت و گاز را متحول می کند.…

آوریل 22 2024

نوآوری را به زبان خود بخوانید

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

ما را دنبال کنید