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 и потърсете преводи на този низ, ако е зададен език, различен от английски (ще стигнем до това по-късно). Английският ще бъде зададен като език по подразбиранеdefiкрай на нашето приложение, така че по подразбиранеdefiВ края просто ще покажем текста „Добре дошли в нашия уебсайт“. Ако локалът е различен, ще се опитаме да намерим съвпадащия превод и той ще бъде създаден след малко.
Но как 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
съдържа местното преdefiкрай на вашето приложение (поне ако в кода не е зададен друг локал). И на 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приключи на функцията __()
те са за нашите местни преdefinito en.
На този етап Laravel не знае как да променя локалите, така че засега нека направим преводите директно в пътя. Променете пътя за добре дошли предварителноdefiзавършен, както е показано по-долу:
Route::get('/{locale?}', function ($locale = null) {
if (isset($locale) && in_array($locale, config('app.available_locales'))) {
app()->setLocale($locale);
}
return view('welcome');
});
Вече можем да посетим нашия уебсайт, като посочим някой от наличните езици като първи сегмент от пътя: например, localhost/ru
o localhost/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}
. The 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 }}
.
Основно ще работим с resources/views/welcome.blade.php
, така че всичко трябва да се случи в нашия изглед за добре дошли, освен ако не е посочено друго.
Например, нека кажем здравей на нашия въображаем потребител (Amanda), вместо просто да показваме общо съобщение:
{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
Обърнете внимание, че използвахме името с първата буква с малки букви, но контейнера с първата буква с главни букви. По този начин Laravel може да ви помогне автоматично да изписвате с главни букви действителната дума. Това ще се случи, ако контейнерът започва с главна буква, например :Name
произвежда „Каролайн“ или дума с главна буква, :NAME
, произвежда “CAROLINE”.
Също така актуализираме нашите файлове за превод resources/lang/fr.json
e resources/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) }}
В този случай допускаме числа 0
, 1
, и от 2
a 19
, и накрая от 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 по подразбиране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
, ще видим, че датите вече са локализирани, например:
В различните страни хората използват различни формати за представяне на числа, например:
Следователно, за да отразите тези разлики във вашето приложение Laravel, можете да използвате 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
Развитието на фини двигателни умения чрез оцветяване подготвя децата за по-сложни умения като писане. Оцветявам…
Военноморският сектор е истинска световна икономическа сила, която се е насочила към пазар от 150 милиарда...
Миналия понеделник Financial Times обяви сделка с OpenAI. FT лицензира своята журналистика от световна класа...
Милиони хора плащат за стрийминг услуги, като плащат месечни абонаментни такси. Разпространено е мнението, че вие…