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