ibakhsh/switch-locale

Laravel Nova 用于切换语言环境的工具

0.4.0 2020-03-21 14:13 UTC

This package is auto-updated.

Last update: 2024-09-26 07:30:15 UTC


README

用于 Astrotomic's Laravel Translatable

此工具提供了一个漂亮的下拉菜单,可以快速切换语言环境。语言环境按用户缓存并设置主应用语言环境。

它还提供了一个 Language 字段,可以显示特定资源上翻译的状态。

注意 如果你使用 Spatie's Laravel Translatable,那么请使用 Laravel Nova Locale Anywhere Tool

安装

composer require ibakhsh/switch-locale

使用方法

要开始使用此工具,你必须在 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 ibakhsh\SwitchLocale\Language;

    Language::make(__('Translation'))

删除翻译工具栏按钮

该包提供了一个 CustomDetailToolbar 组件,你可以通过配置来切换。作为替代,你也可以仅从包中获取 <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 ibakhsh\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();
    }
}


注意 你可能需要设置一些其他权限和规则来限制用户,防止他们自行获取语言访问权限等。

鸣谢

u12206050 分支,最初从 slovenianGooner 分支。