johnnestebann / langravel
为 Laravel 提供多语言支持。简单易用
Requires
- php: >=7.2
- illuminate/http: ^5.7|^6.0|^7.0
- illuminate/routing: ^5.7|^6.0|^7.0
- illuminate/support: ^5.7|^6.0|^7.0
README
为 Laravel 提供多语言支持。简单易用
概述
如果您正在构建一个多语言网站并且需要 URL 管理,那么这个包就是您所需要的。它集成了现有的 Laravel 功能,以支持翻译后的 URL 和自定义地区。
它支持开箱即用的路由缓存。
该包简化了本地化的整个设置和集成过程。
无论 mcamara/laravel-localization
包能做什么,Langravel 都能做,而且做得更好。
特性
- 简单安装
- 易于配置
- 自定义地区
- 隐藏默认地区
- 翻译后的路由
- 语言选择器
- 路由缓存
- 本地 Laravel 辅助函数(《route》和《url》)
- 支持非本地化路由
- 别名翻译
安装
从命令行
composer require johnnestebann/langravel
然后,将 Langravel
特性添加到您的 RouteServiceProvider
类中
use Johnnestebann\Langravel\Langravel;
class RouteServiceProvider extends ServiceProvider
{
use Langravel;
}
如果您不打算使用翻译后的 URL(默认设置为 false),则使用以下命令发布路由文件。否则,请确保发布配置文件,将
useTranslatedUrls
设置为true
并创建适当的路由文件{locale}.web.php
。
将本地化路由文件 langravel.web.php
发布到您的 /routes
目录
php artisan vendor:publish --provider="Johnnestebann\Langravel\ServiceProvider" --tag=route
现在,将 $this->mapLocalizedWebRoutes();
添加到 RouteServiceProvider
中的 map
方法。
安装完成!
将您的本地化路由放入 /routes/langravel.web.php
文件。如果您正在使用翻译后的 URL,为每个地区创建一个路由文件 {locale}.web.php
(例如,en.web.php
)。您的非本地化路由可以保留在 /routes/web.php
文件中。要访问非本地化路由,请使用 URL::getNonLocalizedRoute
或 URL::getNonLocalizedUrl
。下面查看辅助函数章节以获取更多信息。
这就完了! 以下是配置章节,您可以配置您的偏好设置。
配置
使用以下命令发布配置文件
php artisan vendor:publish --provider="Johnnestebann\Langravel\ServiceProvider" --tag=config
您可以在 config/langravel.php
下找到它。
supportedLocales
[数组]
地区名称(代码)可以是您想要的任何内容。
示例。 en-GB, hr-HR, en-US, english, croatian, german, de, fr, ...
'supportedLocales' => ['hr', 'en'],
defaultLocale
[字符串]
默认应用程序地区必须来自 supportedLocales
中定义的地区之一。
'defaultLocale' => 'en',
hideDefaultLocale
[布尔值]
如果您想在 URL 中隐藏默认地区,则将其设置为 true。(默认为 true。)
示例。 如果您的默认地区设置为 en
,则请求以 /en
开头的 URL 将重定向到 /
。
'hideDefaultLocale' => true,
useTranslatedUrls
[布尔值]
这使您能够使用本地化路由。(默认为 false。)
如果您为每个地区使用翻译后的 URL,则将其设置为 true。
示例。 在 en
地区上 /en/about-us
将在 hr
地区上变为 /hr/o-nama
。
'useTranslatedUrls' => true,
一旦此选项设置为 true
,您就必须为每个地区创建一个带有地区前缀的路由文件。
routes/en.web.php
:
<?php
Route::get('/', 'SampleController@home')->name('home');
Route::get('contact', 'SampleController@contact')->name('contact');
Route::get('about', 'SampleController@about')->name('about');
routes/hr.web.php
:
<?php
Route::get('/', 'SampleController@home')->name('home');
Route::get('kontakt', 'SampleController@contact')->name('contact');
Route::get('o-nama', 'SampleController@about')->name('about');
如果您已启用此功能,请务必使用路由名称,否则它将无法正确工作。
资源路由
如果您正在使用 Route::resource
并已将 useTranslatedUrls
设置为 true
,则您必须手动设置资源的名称或停止使用 resource
映射器并手动映射资源路由。
show
方法的语法,但您可以将相同的语法应用于其他方法。
en.web.php
Route::resource('news', 'NewsController')->only(['show']);
hr.web.php
Route::resource('novosti', 'NewsController')->only(['show'])->names([
'show' => 'news.show'
]);
辅助函数
默认的 Laravel 辅助函数 route
和 url
已被修改以支持 URL 本地化。因此,您可以像平常一样使用它们。 这使得您能够轻松地将 mcamara/laravel-localization
包替换为这个包。此外,您可以安装此包,配置您支持的地区以及您的路由和 URL 链接将无需更改即可正常工作。
以下辅助方法用于处理特殊情况,您可能需要获取特定地区的 URL 或仅获取特定地区的当前 URL。
URL::getNonLocalizedRoute($name, $parameters = [], $absolute = true)
它将返回给定路由名称到位于 /routes/web.php
文件的路由的 URL。
请勿在 web.php
和 langravel.web.php
中的路由使用相同的路由名称。
URL::getNonLocalizedUrl($path, $extra = [], $secure = null)
它将返回给定路径的 URL。
URL::getLocalizedRoute($locale, $name = null, $parameters = [], $absolute = true)
使用此方法有两种方式
- 仅指定
$locale
- 它将返回指定地区的当前路由 - 指定
$locale
和路由$name
- 它将返回给定地区给定路由名称的 URL
如果您正在使用翻译后的路由,请确保在需要时使用此方法。
URL::getLocalizedUrl($locale, $path = null, $extra = [], $secure = null)
使用此方法有两种方式
- 仅指定
$locale
- 它将返回指定地区的当前 URL - 指定
$locale
和$path
- 它将返回给定地区的给定路径的 URL
URL::overrideParameters($locale, array|string $parameters)
此方法将为给定地区设置参数,因此当调用 getLocalizedRoute
方法时,它将使用这些参数而不是现有的参数。
对翻译 slug 很有用。请记住包含所有参数。
语言切换器
使用此 blade 模板片段以启用用户更改语言
<ul>
@foreach(config('langravel.supportedLocales') as $locale)
<li>
<a rel="alternate" hreflang="{{ $locale }}" href="{{ URL::getLocalizedRoute($locale) }}">
{{ $locale }}
</a>
</li>
@endforeach
</ul>
您可以根据需要修改此模板。
翻译 URL slugs/parameters
将此代码添加到您的视图文件中的 @php {your code here} @endphp
块内或添加到您想要翻译 slugs 的控制器方法内
foreach (config('langravel.supportedLocales') as $locale) {
URL::overrideParameters($locale, $model->{'slug_'.$locale});
}
将 $model->{'slug_'.$locale}
替换为从数据库获取模型翻译 slug 的逻辑。
此方法将覆盖给定地区的路由参数,因此语言切换器将返回带有翻译 slug 的正确 URL。
贡献
感谢您考虑为 Langravel 贡献!
许可证
Langravel 是开源软件,采用 MIT 许可证。