thinktomorrow / locale
Laravel扩展包,用于可扩展的路由本地化
Requires
- php: >=8.2
- laravel/framework: ^10.0
- thinktomorrow/url: ^3.0
Requires (Dev)
- mockery/mockery: ^1.6.6
- orchestra/testbench: ^8.5
- phpstan/phpstan: ^1.9.14
- phpunit/phpunit: ^10.5
- 4.0.0
- 3.0.2
- 3.0.1
- 3.0.0
- 2.5.3
- 2.5.2
- 2.5.1
- 2.5.0
- 2.4.1
- 2.4.0
- 2.3.4
- 2.3.3
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.0
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.x-dev
- 2.0.2
- 2.0.1
- 2.0.1-beta
- 1.5
- 1.4.1
- 1.4.0
- 1.3.2
- 1.3.1
- 1.3
- 1.2.0
- 1.1.1
- 1.1.0
- dev-master / 1.0.x-dev
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.0.6
- 0.0.5
- 0.0.4
- 0.0.3
- 0.0.2
- 0.0.1
- dev-dependabot/composer/guzzlehttp/psr7-2.5.0
- dev-dependabot/composer/symfony/http-kernel-6.2.6
- dev-dependabot/composer/doctrine/dbal-3.1.4
- dev-dependabot/composer/laravel/framework-8.52.0
- dev-dependabot/composer/psalm/plugin-laravel-1.5.1
- dev-dependabot/composer/vimeo/psalm-4.9.2
- dev-dependabot/composer/phpunit/phpunit-9.5.8
- dev-dependabot/composer/friendsofphp/php-cs-fixer-3.0.0
- dev-dependabot/composer/league/flysystem-1.1.4
- dev-dependabot/add-v2-config-file
- dev-dependabot/composer/mockery/mockery-1.4.3
- dev-fix/scope-detection-error
- dev-ft/canonical-check
This package is auto-updated.
Last update: 2024-09-11 08:12:58 UTC
README
要求
该包需要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/nl的nl是语言环境段,因为它在给定的请求uri中标识了语言环境。这是确定语言环境的最常见方式,当您的应用程序只需要处理一个域根时也足够了。
此配置是最基本的设置,您只需在默认范围内提供一个语言环境的列表,如上面的配置示例。
范围
范围是一组语言环境的更高级标识符。通常,您可以将范围与请求url的host部分进行比较。范围将一个或多个这些段捆绑在一起。
假设我们想允许example.com和fr.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与我们联系,而不是使用问题跟踪器。
致谢
- Ben Cavens ben@thinktomorrow.be
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。