Создание многоязычного проекта Laravel

В этой статье мы рассмотрим один из самых популярных фреймворков PHP - Laravel, и его возможности для создания многоязычных веб-приложений. Laravel предлагает простые и эффективные инструменты для локализации и перевода контента, что делает его идеальным выбором для разработчиков, стремящихся расширить границы своих проектов и обеспечить доступность для многоязычной аудитории.

Мы рассмотрим основные концепции и методы, которые помогут вам добавить поддержку нескольких языков в вашем Laravel-проекте. От настройки локализации до перевода интерфейса и контента, вы узнаете, как эффективно работать с многоязычными ресурсами и обеспечить гибкость при поддержке новых языков в будущем.

Независимо от того, разрабатываете ли вы блог, электронную коммерцию или сложное веб-приложение, понимание методов создания многоязычного проекта в Laravel будет ценным навыком для вашего арсенала разработчика. Давайте начнем этот увлекательный путешествие по созданию многоязычных проектов в Laravel!

Теория многоязычности в Laravel

В Laravel поддерживается многоязычность, и вы можете легко организовать ее для своего проекта. Вот несколько шагов, которые вам нужно выполнить:

  1. Сначала создайте директорию "resources/lang" в корне вашего проекта. Опубликуйте ресурсы
    php artisan lang:publish
  2. В этой директории создайте поддиректории для каждого языка, который вы хотите поддерживать. Например, для английского языка вы можете создать директорию "en", а для русского языка - "ru".
  3. В каждой директории создайте файлы с переводами. Названия файлов должны соответствовать ключам перевода, которые вы будете использовать в своем коде. Например, если у вас есть текст "Hello, world!" на английском языке, вы можете создать файл "resources/lang/en/messages.php" и добавить туда следующую строку: 'hello' => 'Hello, world!'.
  4. Чтобы использовать переводы в своем коде, вы можете использовать функцию trans(). Например, чтобы вывести перевод строки "hello" на английском языке, вы можете написать такой код: {{ trans('messages.hello') }}.
  5. Чтобы изменить язык приложения, вы можете использовать middleware SetLocaleMiddleware. Создайте новый middleware и добавьте его в массив $middleware в файле app/Http/Kernel.php. В middleware вы можете установить язык, используя метод App::setLocale(). Например:
  6. Также вы можете добавить переключатель языка на ваш сайт, который позволит пользователям выбирать язык. Для этого вы можете создать форму с кнопками для каждого языка и отправлять POST-запрос на URL-адрес "/lang/{locale}", где "{locale}" - это код языка. В контроллере, связанном с этим URL-адресом, установите выбранный язык с помощью метода App::setLocale() и верните пользователя на предыдущую страницу.

Пример реализации многоязычности

Конкретный пример кода для Laravel может выглядеть следующим образом:

1. Переключатель языка

html

<!-- HTML разметка для переключателя языка -->
<ul>
<li><a href="{{ route('lang.switch', ['locale' => 'en']) }}">English</a></li>
<li><a href="{{ route('lang.switch', ['locale' => 'ru']) }}">Русский</a></li>
</ul>

Здесь мы используем метод route() для генерации URL, указывая параметр locale в зависимости от выбранного языка.

2. Маршрут и контроллер для переключения языка

// routes/web.php

Route::get('lang/{locale}', [LanguageController::class, 'switch'])->name('lang.switch');

// app/Http/Controllers/LanguageController.php

namespace App\Http\Controllers;

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

class LanguageController extends Controller
{
  public function switch($locale)
  {
      // Сохраняем выбранный язык в сессии
      Session::put('locale', $locale);

      // Устанавливаем приложение на выбранный язык
      App::setLocale($locale);

      // Редиректим пользователя на домашнюю страницу
      return redirect()->route('home', ['locale'=>$locale]);
}
}

Здесь мы создаем маршрут на адрес lang/{locale}, который будет обрабатываться методом switch() контроллера LanguageController. В этом методе мы сохраняем выбранный язык в сессии Laravel, устанавливаем локаль приложения на выбранный язык и редиректим пользователя на предыдущую страницу.

3. Middleware для определения текущего языка

// app/Http/Middleware/SetLocale.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\Response;

class SetLocale
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
$locale = $request->route('locale'); // Получаем значение префикса locale из маршрута

// Получаем список поддерживаемых языков из конфигурации Laravel
$locales = config('app.locales');

if ($locale) {
if (!in_array($locale, $locales)) {
abort(404);
}
App::setLocale($locale); // Устанавливаем локаль равной значению префикса locale
} else {
self::setLocale($request);
}

return $next($request);
}

public function setLocale(Request $request): string
{
// Получаем текущий язык из сессии
$locale = Session::get('locale');
if ($locale) {
App::setLocale($locale);
} else {
$locale = self::setDefaultLocale($request);
}
return $locale;
}

public function setDefaultLocale(Request $request): string
{
// Если пользователь уже выбрал язык, то не меняем его по умолчанию
if (Session::has('locale')) {
return Session::get('locale');
}

// Получаем список поддерживаемых языков из конфигурации Laravel
$locales = config('app.locales');

// Получаем список языков из заголовка Accept-Language в запросе
$browserLocales = $request->getLanguages();

// Ищем первый поддерживаемый язык в списке языков браузера
foreach ($browserLocales as $locale) {
if (in_array($locale, $locales)) {
// Если найден поддерживаемый язык, устанавливаем его как локаль приложения и сохраняем в сессии
App::setLocale($locale);
Session::put('locale', $locale);
return $locale;
}
}

// Если ни один из языков браузера не поддерживается приложением, устанавливаем английский язык по умолчанию
$locale = 'en';
App::setLocale($locale);
Session::put('locale', $locale);
return $locale;
}
}

Здесь мы создаем middleware SetLocale, который будет вызываться перед каждым запросом и устанавливать локаль приложения на текущий язык, полученный из сессии. Это позволит отображать контент на нужном языке на всех страницах сайта.

Также в файл конфигурации //app/config.php надо добавить строчку 

'locales' => ['ru', 'en'],

Не забудьте добавить Middleware в //app/Http/kernel.php в раздел 'web':

\App\Http\Middleware\SetLocale::class,

4. Языковые файлы

В Laravel вы можете использовать языковые файлы для перевода текста на разные языки. Для этого создайте файлы с расширением .json в папке /lang, например:

//lang/en.json

{
"welcome": "Welcome to my website!"  
}

//lang/ru.json

{
"welcome": "Добро пожаловать на мой сайт!"  
}

Здесь мы определяем массив с ключами и значениями для каждого языка. В примере мы переводим фразу "Welcome to my website!" на английский и русский язык.

5. Использование языковых файлов в коде

Чтобы использовать переводы из языковых файлов, используйте функцию trans() или ее сокращенную форму __() в контроллерах

Это основные шаги, которые вам нужно выполнить, чтобы организовать многоязычность в Laravel.