codezero / laravel-localizer
自动检测并设置与应用访问者偏好相匹配的app区域。
Requires
- php: ^8.1
- codezero/browser-locale: ^3.0
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.3.3
- orchestra/testbench: ^8.0|^9.0
- phpunit/phpunit: ^10.5
README
自动检测并设置与应用访问者偏好相匹配的app区域。
- 定义您支持的区域并匹配访问者的偏好
- 默认使用最常用的区域检测器
- 默认使用最常用的区域存储
- 轻松创建和添加自己的检测器和存储
✅ 要求
- PHP >= 8.1
- Laravel >= 10.0
⬆ 升级
升级到新版本吗?请查看我们的 升级指南 以获取说明。
📦 安装
使用Composer安装此包
composer require codezero/laravel-localizer
Laravel将自动注册 ServiceProvider。
🧩 添加中间件
默认情况下,应用区域始终是你在 config/app.php
中配置的区域。要自动更新应用区域,需要在 web
中间件组中注册中间件。请确保在 StartSession
后和 SubstituteBindings
前添加它。
如果使用本地化路由键(已翻译的slug),中间件的顺序很重要!设置区域时需要激活会话,替换路由绑定时需要设置区域。
Laravel 11及更高版本
在 bootstrap/app.php
中将中间件添加到 web
中间件组。
// bootstrap/app.php ->withMiddleware(function (Middleware $middleware) { $middleware->web(remove: [ \Illuminate\Routing\Middleware\SubstituteBindings::class, ]); $middleware->web(append: [ \CodeZero\Localizer\Middleware\SetLocale::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ]); })
Laravel 10
在 app/Http/Kernel.php
中将中间件添加到 web
中间件组。
// app/Http/Kernel.php protected $middlewareGroups = [ 'web' => [ //... \Illuminate\Session\Middleware\StartSession::class, // <= after this //... \CodeZero\Localizer\Middleware\SetLocale::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, // <= before this ], ];
⚙ 配置
发布配置文件
php artisan vendor:publish --provider="CodeZero\Localizer\LocalizerServiceProvider" --tag="config"
现在您将在 config
文件夹中找到一个 localizer.php
文件。
配置支持的区域
将您希望支持的任何区域添加到您发布的 config/localizer.php
文件中
'supported_locales' => ['en', 'nl'];
默认情况下,UrlDetector
将在这些URL中查找这些区域。
您还可以为区域使用一个或多个自定义slug
'supported_locales' => [ 'en' => 'english-slug', 'nl' => ['dutch-slug', 'nederlandse-slug'], ];
或者您可以使用一个或多个自定义域为区域
'supported_locales' => [ 'en' => 'english-domain.test', 'nl' => ['dutch-domain.test', 'nederlands-domain.test'], ];
🔍 检测器
默认情况下,中间件将使用以下检测器来检查支持的区域
更新配置文件中的 detectors
数组以选择要运行哪些检测器以及它们的顺序。
您可以通过实现
CodeZero\Localizer\Detectors\Detector
接口并添加对它在配置文件中的引用来创建自己的检测器。检测器是从Laravel的IOC容器中解析的,因此您可以在构造函数中添加任何依赖项。
💾 存储
检测器返回的第一个支持的区域将自动存储在
更新配置文件中的 stores
数组以选择要使用的存储。
您可以通过实现
CodeZero\Localizer\Stores\Store
接口并添加对它在配置文件中的引用来创建自己的存储。存储是从Laravel的IOC容器中解析的,因此您可以在构造函数中添加任何依赖项。
🛠 更多配置
☑ omitted_locale
如果您不希望主区域有slug,可以将它设置为omitted_locale
(不是自定义slug)。
如果您这样做,在 UrlDetector
和 OmittedLocaleDetector
之后将不会运行任何额外的检测器。这在这种情况下是有意义的,因为在这种情况下,区域始终由这两个确定。
示例
'omitted_locale' => 'en',
结果
- /example-route (英语,没有slug)
- /nl/example-route (其他具有缩略语的地区)
默认值: null
☑ trusted_detectors
将任何检测器类名添加到此数组中以使其可信。(不要从 detectors
数组中删除)当可信检测器返回地区时,它将被用作应用程序地区,无论它是否是受支持的地区。
默认值: []
☑ url_segment
在使用 UrlDetector
时,包含地区的URL段索引。
默认值: 1
☑ route_action
在使用 RouteActionDetector
时,包含地区的自定义路由操作。
默认值: locale
要使用自定义路由操作 locale
,您需要注册一个路由如下
Route::group(['locale' => 'nl'], function () { //Route::get(...); });
☑ user_attribute
在使用 UserDetector
时,用户模型上包含地区的属性。如果用户模型没有此属性,则此检测器检查将被跳过。
默认值: locale
☑ session_key
在使用 SessionDetector
和 SessionStore
时,包含地区的会话键。
默认值: locale
☑ cookie_name
在使用 CookieDetector
和 CookieStore
时,包含地区的cookie名称。
默认值: locale
☑ cookie_minutes
在使用 CookieStore
时,包含地区的cookie的有效期。
默认值: 60 * 24 * 365
(1年)
🚧 测试
composer test
☕ 致谢
🔒 安全性
如果您发现任何与安全相关的问题,请给我发电子邮件,而不是使用问题跟踪器。
📑 变更日志
有关此包的所有显著变更的完整列表可在发布页面找到。
📜 许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。