eolica/laravel-content-tools

用于直接在页面上编辑网页前端翻译的Laravel包

v0.5.0 2024-01-22 12:05 UTC

This package is auto-updated.

Last update: 2024-09-22 13:35:33 UTC


README

Latest Version on Packagist Total Downloads

这是一个用于直接在页面上编辑网页前端翻译的Laravel包。它使用ContentTools,这是一个JavaScript库,提供WYSIWYG编辑器,可以添加到任何页面,以便我们可以在行内编辑HTML内容。

安装

您可以通过Composer安装此包

composer require eolica/laravel-content-tools

安装后,如果您没有使用自动包发现,则需要将Eolica\LaravelContentTools\ContentToolsServiceProvider服务提供者注册到您的config/app.php文件中。

'providers' => [
    ...

    /*
    * Package Service Providers...
    */
    Eolica\LaravelContentTools\ContentToolsServiceProvider::class,

    ...
],

或者,您也可以在App\Providers\AppServiceProvider中注册它

namespace App\Providers;

use Eolica\LaravelContentTools\ContentToolsServiceProvider;

final class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->register(ContentToolsServiceProvider::class);
    }

    ...
}

公共资产

由于此包使用公共资产,您必须使用以下Artisan命令来发布它们

php artisan vendor:publish --tag=content-tools:assets --force

为了保持资产更新并避免未来更新中出现的问题,我们建议将命令添加到composer.json文件中的post-autoload-dump脚本中

"scripts": {
    "post-autoload-dump": [
        "@php artisan vendor:publish --tag=content-tools:assets --force --ansi"
    ]
}

包将自动将发布的资产注入到stylesscripts堆栈中,因此您必须将它们添加到您的布局中

<html>
<head>
    ...
    @stack('styles')
</head>
<body>
    ...
    @stack('scripts')
</body>
</html>

配置

您可以使用以下命令发布content-tools配置文件

php artisan vendor:publish --tag=content-tools:config

这将在您的应用中创建一个config/content-tools.php文件,您可以根据需要修改它来设置配置。

这是具有默认值的配置文件

<?php

return [
    'routes' => [
        'prefix' => 'content-tools',
        'middleware' => ['web'],
    ],

    'editor' => [
        'default_tools' => [
            [
                'bold',
                'italic',
                'link',
                'align-left',
                'align-center',
                'align-right',
            ],
            [
                'heading',
                'subheading',
                'paragraph',
                'unordered-list',
                'ordered-list',
                'table',
                'indent',
                'unindent',
                'line-break',
            ],
            [
                'preformatted',
            ],
            [
                'undo',
                'redo',
                'remove',
            ],
        ],

        'default_video_width'   => 400,
        'default_video_height'  => 300,

        'highlight_hold_duration' => 2000,

        'min_crop' => 10,

        'restricted_attributes' => [
            '*'         => [],
            'img'       => ['height', 'width', 'src', 'data-ce-max-width', 'data-ce-min-width'],
            'iframe'    => ['height', 'width'],
        ],
    ],
];
路由

routes选项是您可以指定应用于包路由的前缀的地方,如果与其他应用程序中的路由发生冲突,也可以指定这些路由的中间件列表,默认情况下,应用web组中间件。

编辑器

editor选项是您可以指定ContentTools设置的地方。

使用方法

您需要做的只是将content-tools-translation组件添加到您的Blade视图中。

<x-content-tools-translation key="web.pages.home.content" />

key属性映射到在您的翻译文件中定义的短键

您可以将任何额外属性传递给组件,例如,我们可以添加class属性来样式化内容

<x-content-tools-translation key="web.pages.home.content" class="content" />

固定布局

假设我们有一个包含h1html标签标题的网站主页,我们希望这个标题是可翻译的,但我们不希望用户破坏h1标签,从而对SEO产生负面影响。

这就是固定布局允许我们做的事情。只需添加一个带有您希望固定的html标签的值的fixture属性即可

<x-content-tools-translation key="web.pages.home.title" fixture="h1" />

我们建议始终使用固定布局以防止用户破坏页面布局,并在必要时仅使用非固定翻译。

权限

默认情况下,此包使用 Eolica\LaravelContentTools\PermissionHandler\TruePermissionHandler,允许任何进入您网站的人编辑您的翻译。这在本地开发中非常有用,但在生产环境中,您可能需要某种身份验证检查。

此包附带 Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler,用于检查特定身份验证守护程序的用户是否已通过身份验证。

考虑到这一点,我们可以在应用程序不在本地环境中运行时,将此实现绑定到我们的 App\Providers\AppServiceProvider

namespace App\Providers;

use Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler;
use Eolica\LaravelContentTools\PermissionHandler\PermissionHandler;

final class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        if (!$this->app->isLocal()) {
            $this->app->bind(PermissionHandler::class, function ($app): PermissionHandler {
                return new AuthGuardCheckPermissionHandler(
                    $app->make('auth')->guard('backend')
                );
            });
        }
    }

    ...
}

现在,在生产环境中,只有通过 backend 守护程序身份验证的用户才能编辑翻译。在本地开发中,它将回退到 Eolica\LaravelContentTools\PermissionHandler\TruePermissionHandler 实现以便我们可以轻松测试,无需进行身份验证。

创建自己的权限处理器

如果 Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler 不足以满足您的需求,您可以创建自己的权限处理器实现。

权限处理器可以是实现 Eolica\LaravelContentTools\PermissionHandler\PermissionHandler 接口的任何类。

namespace Eolica\LaravelContentTools\PermissionHandler;

interface PermissionHandler
{
    public function check(): bool;
}

要注册自己的权限处理器,您可以在 App\Providers\AppServiceProvider 中覆盖我们默认的实现。

namespace App\Providers;

use App\ContentTools\PermissionHandler\YourOwnPermissionHandler;
use Eolica\LaravelContentTools\PermissionHandler\PermissionHandler;

final class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->bind(PermissionHandler::class, function ($app): PermissionHandler {
            return new YourOwnPermissionHandler();
        });
    }

    ...
}

由于我们的包使用 bindIf 方法注册绑定(如果尚未注册),因此您的自定义权限处理器将优于我们的默认实现。

组合多个权限处理器

也许 Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler 对您来说很好,但您还想执行其他类型的检查,因此您为特定情况创建了自定义权限处理器,并且不想复制和粘贴内置权限处理器代码。

对于这些场景,此包附带 Eolica\LaravelContentTools\PermissionHandler\CompositePermissionHandler,它接受一系列 PermissionHandler

与以往一样,您可以在 App\Providers\AppServiceProvider 中绑定此实现。

namespace App\Providers;

use App\ContentTools\PermissionHandler\YourOwnPermissionHandler;
use Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler;
use Eolica\LaravelContentTools\PermissionHandler\CompositePermissionHandler;
use Eolica\LaravelContentTools\PermissionHandler\PermissionHandler;

final class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->bind(PermissionHandler::class, function ($app): PermissionHandler {
            return new CompositePermissionHandler(
                new AuthGuardCheckPermissionHandler($app->make('auth')),
                new YourOwnPermissionHandler(),
            );
        });
    }

    ...
}

使用此方法,您可以为每个检查创建小的处理器,而不是创建执行所有不同检查的大权限处理器,从而使代码更灵活、可重用。

创建自己的翻译存储库

此包附带 Eolica\LaravelContentTools\Repository\FileTranslationRepository,它从 storage/app/resources/lang 文件夹中的 php 文件持久化和加载翻译。如果您想将翻译持久化到其他源(数据库、csv、yaml 等),您可以创建自己的翻译存储库。

翻译存储库可以是实现 Eolica\LaravelContentTools\Repository\TranslationRepository 接口的任何类。

namespace Eolica\LaravelContentTools\Repository;

interface TranslationRepository
{
    public function save(string $locale, string $group, string $key, string $value): void;

    public function load(string $locale, string $group): array;
}

要注册自己的翻译存储库,您可以在 App\Providers\AppServiceProvider 中覆盖我们默认的实现。

namespace App\Providers;

use App\ContentTools\Repository\YourOwnTranslationRepository;
use Eolica\LaravelContentTools\Repository\TranslationRepository;

final class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->bind(TranslationRepository::class, function ($app): TranslationRepository {
            return new YourOwnTranslationRepository();
        });
    }

    ...
}

由于我们的包使用 bindIf 方法注册绑定(如果尚未注册),因此您的自定义存储库将优于我们的默认实现。

当前缺少的功能

  • 对具有 参数 的翻译支持,我们还需要为此提供良好的解决方案,任何帮助都将受到欢迎。
  • 对更复杂翻译的支持图像上传

变更日志

请参阅 CHANGELOG 了解最近更改的更多信息。

安全性

如果您在此包中发现安全漏洞,请通过发送电子邮件到 info@eolicadigital.com 而不是使用问题跟踪器。

许可证

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