day4 / switch-locale
用于切换语言环境的 Laravel Nova 工具
0.5.9
2021-07-19 10:08 UTC
Requires
- php: >=7.1.0
README
用于 Astrotomic's Laravel Translatable
此工具提供了一个方便的头部下拉菜单,可以快速切换语言环境。语言环境按用户缓存并设置主应用的语言环境。
它还提供了一个 Language
字段,显示特定资源的翻译状态。
注意 如果您使用 Spatie's Laravel Translatable,则使用 Laravel Nova Locale Anywhere Tool
安装
composer require day4/switch-locale
php artisan vendor:publish --tag=public
使用方法
要开始使用此工具,您必须在 NovaServiceProvider
下的工具中注册该工具。该工具利用 Astrotomic's Laravel Translatable 包。
public function tools()
{
return [
new SwitchLocale([
"locales" => [
"en" => "English",
"de" => "German"
],
"useFallback" => false,
"customDetailToolbar" => false //optional
])
];
}
下拉菜单
该包提供了用于插入 Nova 布局文件的切换语言选项。您可以通过覆盖 layout.blade.php
文件并在用户下拉菜单后插入它来实现。
…
<dropdown class="ml-auto h-9 flex items-center dropdown-right">
@include('nova::partials.user')
</dropdown>
<switch-locale-dropdown class="ml-6"></switch-locale-dropdown>
…
资源状态字段
然后您可以在资源中定义该字段。
use Day4\SwitchLocale\Language;
Language::make(__('Translation'))
删除翻译工具栏按钮
该包提供了一个自定义详细工具栏组件,您可以通过配置来切换。可选地,您也可以仅从包中获取 <delete-toolbar-button>
并将其粘贴到您自己的自定义详细工具栏中。
语言权限
如果您想允许用户仅访问某些语言,此工具还可以显示他们可以访问的语言。
设置
为了让这个工具工作,用户需要一个返回包含布尔值的语言环境的对象的 locale
属性。
// User table migration
$table->string('locale')->default('{}');
// User Model app/User.php
protected $casts = [
'email_verified_at' => 'datetime',
'locale' => 'array'
];
public function allowedLocale() {
return $this->allowedAllLocale() || $this->locale[app()->getLocale()];
}
public function allowedAllLocale() {
return $this->isAdmin(); // As an example, admin is allowed all locale
}
// User Nova Resource app/Nova/User.php
use Laravel\Nova\Fields\BooleanGroup;
use Day4\SwitchLocale\SwitchLocale;
…
BooleanGroup::make(__('Allowed Locale'), 'locale')->options(SwitchLocale::getLocales()),
示例用法
// PostPolicy
<?php
namespace App\Policies;
use App\Post;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class PostPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any posts.
*/
public function viewAny(User $user)
{
return true;
}
/**
* Determine whether the user can view the post.
*/
public function view(User $user, Post $post)
{
return $post->status == 'published' || ($user && $user->id == $post->author_id);
}
/**
* Determine whether the user can create posts.
*/
public function create(User $user)
{
return $user && $user->allowedLocale();
}
/**
* Determine whether the user can update the post.
*/
public function update(User $user, Post $post)
{
return $user && $user->allowedLocale();
}
/**
* Determine whether the user can update the post.
*/
public function delete(User $user, Post $post)
{
return $user && $user->allowedLocale();
}
}
注意 您可能还需要实施其他权限和规则来限制用户,以防止他们给自己访问语言等。
致谢
最初是从 slovenianGooner 分支出来的