optimistdigital/nova-translatable

Laravel Nova 的一个 laravel-translatable 扩展。

2.3.1 2024-09-12 15:12 UTC

README

Latest Version on Packagist Total Downloads

这个 Laravel Nova 允许您使任何输入字段 spatie/laravel-translatable 兼容和可本地化。

要求

  • PHP: ^8.0
  • laravel/nova: ^4.12
  • spatie/laravel-translatable: ^4.0 || ^5.0 || ^6.0

特性

  • 支持几乎所有字段(包括第三方字段)
  • 自动支持默认验证
  • 简单实现,只需少量代码更改(在 spatie/laravel-translatable 支持之后)
  • 区域选项卡,用于切换同一字段的区域值
  • 双击选项卡以切换所有字段到该区域
  • 支持 nova-settings

已知无法工作的字段

限制

  • 以下方法不能使用,因为此包内部使用了它们
    • resolveUsing
    • fillUsing

截图

Detail View Form View Form View w/ Validation Errors

安装

首先,设置 spatie/laravel-translatable

通过 Composer 在 Laravel Nova 项目中安装此包

# Install nova-translatable
composer require outl1ne/nova-translatable

# Publish configuration (optional, but useful for setting default locales)
php artisan vendor:publish --tag="nova-translatable-config"

用法

在任意字段上调用 ->translatable(),例如

// Any Nova field
Text::make('Name')
  ->rules('required', 'min:2')
  ->translatable(),

// Any third-party input field
Multiselect::make('Football teams')
  ->rules('required')
  ->translatable(),

// Optionally pass custom locales on a per-field basis
Number::make('Population')
  ->translatable([
    'en' => 'English',
    'et' => 'Estonian',
  ]),

验证

可以定义特定于区域的验证规则。

为此,在您的字段上添加 ->rulesFor() 并在您的 Nova 资源上添加 HandlesTranslatable 特性。

->rulesFor 接受 array|string|callable 区域和 array|callable 规则。

use Outl1ne\NovaTranslatable\HandlesTranslatable;

class Product extends Resource
{
    use HandlesTranslatable;

    public function fields(Request $request)
    {
        return [
            Text::make(__('Name'), 'name')
                ->sortable()
                ->translatable()
                ->rules(['max:255'])
                ->rulesFor('en', [
                    'required',
                ])
                ->rulesFor(['en', 'et'], function ($locale) {
                    return ["unique:products,name->$locale{{resourceId}}"];
                }),
        ];
    }
}

在此示例中,规则将被添加到以下值

max: name.*
required: name.en
unique: name.en & name.et

配置

您可以在配置文件中定义所有 translatable 字段的自定义区域。可以使用以下命令发布配置文件:

php artisan vendor:publish --tag="nova-translatable-config"

从配置选项填充其他区域

配置选项 fill_other_locales_from 允许您从单个区域预先填充其他区域。这需要资源也具有 HandlesTranslatable 特性。

页面上的所有字段的单选框

如果您不想在每个字段旁边显示区域选择,可以将 display_type 设置为 none 并将 Outl1ne\NovaTranslatable\Fields\LocaleSelect 字段添加到您的 Nova 资源中。这将为所有字段渲染单个选择。

边缘情况

BelongsToMany 允许DuplicateRelations 边缘情况

当您将此字段用作 BelongsToMany 中的 pivot 字段,并使用 ->allowDuplicateRelations() 时,并希望使用 NotExactlyAttached 规则过滤出精确匹配项,请使用 BelongsToManyTranslatable 字段而不是常规的 BelongsToMany

鸣谢

许可

本项目是开源软件,根据 MIT 许可证 许可。