Laravel 多语化
一、安装Laravel-Localization
1. 执行composer命令
composer require mcamara/laravel-localization
2. 发布资源
php artisan vendor:publish --provider="Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider"
3. 修改app/Http/Kernel.php增加中间件
class Kernel extends HttpKernel {
/**
* The application's route middleware.
*
* @var array
*/
protected $middlewareAliases = [
/**** OTHER MIDDLEWARE ****/
'localize' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
'localizationRedirect' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
'localeSessionRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
'localeCookieRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
'localeViewPath' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class
];
}
4. Web路由使用中间件
Route::group(
[
'prefix' => LaravelLocalization::setLocale(),
'middleware' => [ 'localeSessionRedirect', 'localizationRedirect', 'localeViewPath' ]
], function(){ //...
});
二、多语化配置中简和中繁(zh-CN,zh-TW)
1. 准备语言文件
resources/
└── lang/
├── zh-CN/
│ └── messages.php
└── zh-TW/
└── messages.php
// resources/lang/zh-CN/messages.php
return [
'register' => '注册',
'login' => '登录',
];
// resources/lang/zh-TW/messages.php
return [
'register' => '註冊',
'login' => '登入',
];
2. 使用翻译方法
Laravel 提供两个主要函数:
__():最常用的,用于输出语言文本
@lang():Blade 模板中使用(功能和 __() 一样)
echo __('messages.login');
<h1>{{ __('messages.login') }}</h1>
3. 设置当前语言
默认语言在 config/app.php 中设置:
'locale' => 'zh-CN',
在 config/laravellocalization.php 中配置多语化支持的语言
'supportedLocales' => [
'zh-CN' => ['name' => 'Chinese (Simplified)', 'script' => 'Hans', 'native' => '简体中文', 'regional' => 'zh-CN'],
'zh-TW' => ['name' => 'Chinese (Traditional)', 'script' => 'Hant', 'native' => '繁體中文', 'regional' => 'zh-TW'],
],
三、重要修改
1. 重定向中间件,避免seo重复内容
以下重定向中间件取决于config/laravellocalization.php中的设置hideDefaultLocaleInURL 和useAcceptLanguageHeader
LocaleSessionRedirect
LocaleCookieRedirect
只要 URL 中存在语言环境,该中间件就会将其存储在会话(cookie/session)中。
如果 URL 中不存在语言环境,则此中间件将检查以下内容
如果会话中未保存任何语言环境且useAcceptLanguageHeader设置为 true,则从浏览器计算语言环境并重定向到具有语言环境的url。
如果会话中保存了语言环境,则重定向到具有语言环境的 url,除非它是默认语言环境并hideDefaultLocaleInURL设置为true。
例如,如果用户导航到http://url-to-laravel/test 并且en是当前语言环境,它将自动将他重定向到http://url-to-laravel/en/test。
LaravelLocalizationRedirectFilter
当 url 中存在默认语言环境且hideDefaultLocaleInURL设置为 true 时,中间件会重定向到不带语言环境的url。
例如,如果es是默认语言环境,则http://url-to-laravel/es/test将被重定向到http://url-to-laravel/test并且App::getLocale()将被设置为es。
如果新项目建议 http://domain.com/lang/about 这样的结构 便于seo
http://domain.com 跳转默认语言 http://domain.com/zh-CN
如果旧项目新增多语化 建议开启hideDefaultLocaleInURL 避免重复内容被收录影响seo
http://domain.com/zh-CN 跳转到 http://domain.com
2. 本地化 URL,避免多次重定向
旧的写法
<a href="{{ route('login') }}">
改为
<a href="{{ LaravelLocalization::localizeUrl(route('login')) }}">