Laravel扩展包,用于可扩展的路由本地化


README

Latest Version on Packagist Software License Quality Score Total Downloads

要求

该包需要PHP版本8.2或更高。支持Laravel版本5.6.*及更高版本。

安装

该包可以通过Composer进行安装。

$ composer require thinktomorrow/locale

Laravel将自动发现包的服务提供者。

要发布配置文件到/config/thinktomorrow/locale.php,运行

    php artisan vendor:publish --provider="Thinktomorrow\Locale\LocaleServiceProvider"

以下为配置默认值

设置

假设您想支持两个语言环境:nl和en,其中nl是默认语言环境。以下是配置方法

# config/thinktomorrow/locale.php

'locales' => [
        '*' => [
            'en' => 'en',
            '/'  => 'nl',
        ],
    ],

这里有一些重要事项需要注意

  • 每个条目的键代表uri段,而值是应用程序的语言环境。
  • 星号(*)作为通配符组,意味着任何主机都将匹配。这被称为默认范围,但稍后会详细介绍范围。
  • 默认语言环境的键是正斜杠'/'。这是一个必需项。它是没有特定uri段匹配时的语言环境。

该包允许两种方式在请求url中识别语言环境。一种是路径段,另一种是主机。让我们花点时间介绍这些概念。语言环境段是特定语言环境的uri路径标识符。例如,example.com/nlnl是语言环境段,因为它在给定的请求uri中标识了语言环境。这是确定语言环境的最常见方式,当您的应用程序只需要处理一个域根时也足够了。

此配置是最基本的设置,您只需在默认范围内提供一个语言环境的列表,如上面的配置示例。

范围

范围是一组语言环境的更高级标识符。通常,您可以将范围与请求url的host部分进行比较。范围将一个或多个这些段捆绑在一起。

假设我们想允许example.comfr.example.com,其中第一个主机本地化为nl,而后者本地化为fr。我们可以提供以下配置

# config/thinktomorrow/locale.php

'locales' => [
        'fr.example.com' => 'fr',
        '*' => 'nl',
    ],
  • 如果范围检测到只有一个语言环境,则可以将其作为字符串输入,而不是数组。
  • 更具体的范围应该放在列表的第一位,因为匹配是从上到下进行的。
  • 默认范围'*'始终是必需的,并且由于先匹配先服务规则,应放在列表的底部。

如果您的应用程序只能通过一个域根访问,这对于大多数应用程序来说都是这种情况,那么使用默认范围就足够了。所有可用的应用程序语言环境都通过所谓的范围分组。每个范围都有自己的语言环境集。可以将范围与域进行比较。每个范围可以代表一个域及其支持的语言环境。每个范围条目由一个键作为模式标识符和一个语言环境数组组成。匹配是从上到下进行的,因此将更具体的宿主放在一般宿主之上。

使用

为了使路由本地化,请将它们放在带有以下前缀的Route::group()内部

    
    Route::group(['prefix' => localeRoutePrefix()],function(){
        
        // Routes registered within this group will be localized
        
    });
    

生成本地化url

当使用命名路由时,您的路由定位会自动完成。所有命名路由的创建将基于当前区域设置进行本地化。快速无干扰集成。

    route('pages.about'); // prints out http://example.com/en/about (if en is the active locale)

要创建一个具有除活动区域设置之外特定区域的URL,您可以使用Thinktomorrow\Locale\LocaleUrl类。

    
    // Generate localized url from uri (resolves as laravel url() function)
    localeroute('about','en'); // http://example.com/en/about
    
    // Generate localized url from named route (resolves as laravel route() function)
    localeroute('pages.about','en'); // http://example.com/en/about  
    
    // Add additional parameters as third parameter
    localeroute('products.show','en',['slug' => 'tablet'])); // http://example/en/products/tablet
    

注意:通过将区域设置作为'lang'查询参数传递,将强制使用区域设置example.com/en/about?lang=nl确保请求将以'nl'区域设置进行处理。

配置

  • locales:可在应用程序内部使用的区域设置的白名单。基本用法

        'locales' => [
            '*' => [
                'nl',
                'en',
            ]
        ],

    多域名使用

        'locales' => [
            'https://awesome-domain-nl.com' => [
                '/' => 'nl',
            ],
            'https://awesome-domain-en.com' => [
                '/' => 'en',
            ]
        ],

    每个多域名也可以有多个区域设置:多域名使用

        'locales' => [
            'https://awesome-domain.com' => [
                'en'    => 'en',
                '/'     => 'nl',
            ]
        ],
  • hidden_locale:您可以设置可用的区域设置之一为'hidden',这意味着任何uri中没有区域设置的请求都应该本地化为这个隐藏区域设置。例如,如果隐藏区域设置是'nl'且请求uri是/foo/bar,则此请求将以'nl'区域设置解释。请注意,这最好用于您的默认区域设置。

  • placeholder:用于区域设置的显式路由占位符。必须在需要注入多个参数时使用LocaleUrl::route()方法。

区域设置API

为当前请求设置新的区域设置

    Locale::set('en'); // Sets a new application locale and returns the locale slug

获取当前区域设置

    Locale::get(); // returns the current locale e.g. 'en';
    
    // You can pass it a locale that will only be returned if it's a valid locale
    Locale::get('fr'); // returns 'fr' is fr is an accepted locale value
    Locale::get('foobar'); // ignores the invalid locale and returns the default locale

获取用于URL注入的区域设置slug

    Locale::getSlug(); // returns 'en' or null if the current locale is set to be hidden

检查当前区域设置是否为隐藏

    Locale::isHidden(); // checks current or passed locale and returns boolean

测试

$ vendor/bin/phpunit

有关更多详细信息,请参阅我们的完整文档https://thinktomorrow.github.io/package-docs/src/locale/

安全

如果您发现任何与安全相关的问题,请通过电子邮件ben@thinktomorrow.be与我们联系,而不是使用问题跟踪器。

致谢

许可证

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