jersyfi/laravel-localization

用于本地化 Laravel 应用的包

v2.1.0 2021-11-19 07:27 UTC

This package is auto-updated.

Last update: 2024-09-19 14:18:58 UTC


README

Packagist Downloads Packagist Version GitHub License

安装

您可以通过 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

您可以通过访问名为 localizeLocaleController 函数并将 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)。有关更多信息,请参阅 许可文件