jersyfi/laravel-localization
用于本地化 Laravel 应用的包
Requires
- php: ^7.2|^8.0
- laravel/framework: ^8.0
Suggests
- spatie/laravel-translatable: Required to use the Translatable Page(^4.0).
README
安装
您可以通过 Composer 安装此包
composer require jersyfi/laravel-localization
您需要发布配置文件以自定义包
php artisan vendor:publish --provider="Jersyfi\Localization\LocalizationServiceProvider" --tag="config"
您可以选择发布一个迁移文件,以向用户表添加可自定义的列来存储已登录用户的当前区域设置。如果您希望应用向每个用户发送电子邮件,这将非常有用。
php artisan vendor:publish --provider="Jersyfi\Localization\LocalizationServiceProvider" --tag="migrations"
已发布的配置 localization
看起来如下
return [ /** * Applications default locale need to be set because the config('app.locale') * gives back the current locale and not the value from config */ 'default_locale' => 'de', /** * Application locales determines all locals that exists in the application * You can ignore or delete the locales from app.locales if you set some */ 'locales' => [ 'en', 'de' ], /** * Redirect to default locale when not found */ 'redirect_default' => false, /** * Detect user locale via http header * When no locale is stored in session user gets redirected */ 'detect_locale' => false, /** * Application can store the prefered_locale in the users database table */ 'store_users_database' => true, /** * Setup for the users database table * Only if 'store_users_database' is set to true */ 'database' => [ 'users_table_name' => 'users', 'prefered_locale_column_name' => 'prefered_locale', ], ];
如何使用
更多信息可以在 Laravel 8.x 原始文档中找到。在那里您需要了解有关 路由 和 本地化 的所有信息。如果您还希望有可翻译的模型,我更倾向于使用 Spatie 的 laravel-translatable。
路由
中间件使用 redirect_default
在请求的区域不在 locales
中时重定向任何请求。为了在首次进入页面时检测浏览器语言,LocaleController
使用 detect_locale
。
您可以通过访问名为 localize
的 LocaleController
函数并将 default_locale
作为示例传递,来重定向到 default_locale
use Jersyfi\Localization\Http\Controllers\LocaleController; Route::get('/', [LocaleController::class, 'localize']) ->name('locale');
要分组路由,最简单的方法是将一个名为 {locale}
的前缀与中间件 locale
一起设置。在这个组内部,您可以设置自己的本地化路由。以下是如何获取此本地化路由组的示例
Route::prefix('{locale}') ->middleware('locale') ->group(function () { // your localized routes here });
辅助函数
辅助函数可以通过别名或外观直接访问。当在控制器中使用别名时,您需要包含 use Localization
。以下示例中使用的值来自上面的配置文件,以便您可以进行比较。
返回给定的区域或替换分隔符的当前应用程序区域
$slug = Localization::getLocaleSlug('en_GB'); // en-gb $slug = Localization::getLocaleSlug(); // de
返回本地化配置中设置的可用区域
$locales = Localization::getLocales(); // ['en', 'de']
返回本地化配置中设置的应用程序默认区域
$locale = Localization::getDefaultLocale(); // de
返回本地化配置中没有默认区域的所有可用区域
$locales = Localization::getLocalesWithoutDefault(); // ['en']
返回本地化配置中没有当前区域的所有可用区域
$locales = Localization::getLocalesWithoutCurrent(); // ['de']
返回当前路由 URL
$url = Localization::currentRouteURL(); // https://test.de/de/home?query=true
返回带有设置在本地化配置中的任何不同区域的当前路由 URL。该函数将路由中设置的 {locale} 替换为给定的区域。
$url = Localization::currentRouteLocaleURL('en'); // https://test.de/en/home?query=true
返回带有本地化配置中设置默认区域的当前路由 URL。
$url = Localization::currentRouteDefaultLocaleURL(); // https://test.de/de/home?query=true
检查区域是否有效
$valid = Localization::localeIsValid('de'); // true $valid = Localization::localeIsValid('de', 'en'); // true $valid = Localization::localeIsValid('de', 'sp'); // false
示例
路由到命名路由
我们创建了一个简单的名为 home
的索引路由,可以调用任何您想要的内容。在这个例子中,我们调用一个控制器。然后您可以从任何地方通过 route('home')
调用您的路由。
Route::get('/', [LocaleController::class, 'localize']) ->name('locale'); Route::prefix('{locale}') ->middleware('locale') ->group(function () { // your localized routes here Route::get('/', [HomeController::class, 'index']) ->name('home'); });
<a href="{{ route('home') }}">Home</a>
创建一个规范链接
您需要调用辅助函数 Localization::currentRouteDefaultLocaleURL()
<link rel="canonical" href="{{ Localization::currentRouteDefaultLocaleURL() }}">
创建替代链接
要获取没有默认区域的所有替代链接,您可以在 foreach 循环中调用辅助函数 Localization::getLocalesWithoutDefault()
。在 HTML 的 href 中,您可以调用辅助函数 Localization::currentRouteLocaleURL()
并将其传递给 $locale
。
@foreach(Localization::getLocalesWithoutDefault() as $locale) <link rel="alternate" hreflang="{{ Localization::getLocaleSlug($locale) }}" href="{{ Localization::currentRouteLocaleURL($locale) }}"> @endforeach
创建语言选择器
当您想创建语言选择器时,首先需要当前的地区缩略名。为此,您可以调用辅助函数 Localization::getLocaleSlug()
。要循环其他地区,您可以选择是否要显示所有可用地区,使用 Localization::getLocales()
,或者显示不包含当前地区的可用地区,使用 Localization::getLocalesWithoutCurrent()
。在 foreach 循环内部,您可以调用辅助函数 Localization::currentRouteLocaleURL($locale)
获取链接,以及 Localization::getLocalSlug($locale)
获取地区缩略名。
<div>{{ Localization::getLocaleSlug() }}</div> <ul> @foreach(Localization::getLocalesWithoutCurrent() as $locale) <li> <a href="{{ Localization::currentRouteLocaleURL($locale) }}">{{ Localization::getLocalSlug($locale) }}</a> </li> @endforeach </ul>
更新日志
有关最近更改的更多信息,请参阅 更新日志。
鸣谢
许可协议
MIT 许可协议 (MIT)。有关更多信息,请参阅 许可文件。