codezero/laravel-localizer

自动检测并设置与应用访问者偏好相匹配的app区域。

3.0.0 2024-03-11 13:44 UTC

This package is auto-updated.

Last update: 2024-09-11 14:56:59 UTC


README

GitHub release Laravel License Build Status Code Coverage Code Quality Total Downloads

ko-fi

自动检测并设置与应用访问者偏好相匹配的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)。

如果您这样做,在 UrlDetectorOmittedLocaleDetector 之后将不会运行任何额外的检测器。这在这种情况下是有意义的,因为在这种情况下,区域始终由这两个确定。

示例

'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

在使用 SessionDetectorSessionStore 时,包含地区的会话键。

默认值: locale

cookie_name

在使用 CookieDetectorCookieStore 时,包含地区的cookie名称。

默认值: locale

cookie_minutes

在使用 CookieStore 时,包含地区的cookie的有效期。

默认值: 60 * 24 * 365(1年)

🚧 测试

composer test

☕ 致谢

🔒 安全性

如果您发现任何与安全相关的问题,请给我发电子邮件,而不是使用问题跟踪器。

📑 变更日志

有关此包的所有显著变更的完整列表可在发布页面找到。

📜 许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件