spatie/nova-translatable

使Nova字段可翻译

4.0.3 2024-07-19 08:07 UTC

This package is auto-updated.

Last update: 2024-09-19 08:31:45 UTC


README

Latest Version on Packagist GitHub Workflow Status Check & fix styling Total Downloads

此包包含一个Translatable类,您可以使用它来使任何Nova字段类型可翻译。

假设您有一个fields方法在Post Nova资源中

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),

        Translatable::make([
            Text::make('title'),
            Trix::make('text'),
        ]),
    ];
}

Post Nova资源将被渲染成这样。

screenshot

支持我们

我们在创建最好的开源包上投入了大量资源。您可以通过购买我们的付费产品之一来支持我们。

我们非常感谢您从您的家乡寄来明信片,说明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们将发布所有收到的明信片在我们的虚拟明信片墙上

要求

此Nova字段需要特定于Nova 3和MySQL 5.7.8或更高版本。

安装

首先,您必须在您的Laravel应用程序中安装spatie/laravel-translatable。简而言之,此包将在您的表中为您的模型存储翻译,并在表中创建一个json列。除此之外,它还提供了许多方便的函数来存储和检索翻译。在使用此Nova包之前,请务必阅读laravel-translatable的整个readme

接下来,您可以通过composer将此Nova包安装到使用Nova的Laravel应用程序中

composer require spatie/nova-translatable

使用

为了使用此包,您必须首先使用Translatable::defaultLocales()方法让Translatable知道您的应用程序使用哪些语言环境。您可以将此代码放在AppServiceProvider或您自己的专用服务提供者中。

// in any service provider

\Spatie\NovaTranslatable\Translatable::defaultLocales(['en', 'fr']);

接下来,您必须按照laravel-translatable的readme中的说明准备您的模型。简而言之:您必须为要翻译的每个字段在您的模型表上添加json列。您的模型必须在您的模型上使用Spatie\Translatable\HasTranslations。最后,您还必须在您的模型上添加一个$translatable属性,它包含一个包含可翻译属性名称的数组。

现在,您的模型已配置为支持翻译,您可以在相关的Nova资源中使用Translatable。任何您想要以多语言方式显示的字段都可以作为数组传递给Translatable

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),

        Translatable::make([
            Text::make('title'),
            Trix::make('text'),
        ]),
    ];
}

使翻译可搜索

应将每个翻译字段的内容分别添加到$search数组中。

/**
 * The columns that should be searched.
 *
 * @var array
 */
public static $search = [
    'id', 'name->en', 'name->fr',
];

按可翻译项自定义语言环境

如果您有一个Nova资源,其中您想要使用与全局配置不同的语言环境,您可以在Translatable上调用locales方法。

Translatable::make([
    Text::make('title'),
    Trix::make('text'),
])->locales(['de', 'es']),

这些字段现在将使用dees语言环境。

自定义可翻译名称

默认情况下,可翻译字段将附加 ($locale)到其名称。您可以通过向Translatable上的displayLocalizedNameByDefaultUsing提供闭包来自定义这种行为。此回调将用于渲染本地化字段名称。

Translatable::displayLocalizedNameByDefaultUsing(function(Field $field, string $locale) {
   return ucfirst($field->name) . " [{$locale}]";
})

这样一来,所有可翻译字段的名称都将附加 [$locale]

您还可以通过传递一个闭包给 displayLocalizedNameUsing 函数,为每个资源自定义本地化字段名称。

Translatable::make([
    Text::make('title'),
    Trix::make('text'),
])->displayLocalizedNameUsing(function(Field $field, string $locale) {
   return ucfirst($field->name) . " --- {$locale}]";
}),

启用此功能后,本地化字段名称将附加 --- $locale 后缀。

当然,您仍然可以像往常一样自定义字段名称。

Translatable::make([
    Text::make('My title', 'title'),
    Trix::make('text'),
])->displayLocalizedNameUsing(function(Field $field, string $locale) {
   return ucfirst($field->name) . " [{$locale}]";
}),

使用上面提到的代码,title 字段的名称将为 "我的标题 ['en']"。

自定义可翻译的规则

您可以使用 Nova 的常规功能来定义 Translatable 字段集合内部字段的规则。然而,这将将这些规则应用于所有区域。如果您想为每个区域定义不同的规则,可以在 Translatable 集合中这样做。

Translatable::make([
    Text::make('My title', 'title'),
    Trix::make('text'),
])->rules([
        'title' => ['en' => 'required', 'nl' => 'nullable'],
        'text' => ['en' => 'required|min:10', 'nl' => 'nullable|min:10'],
    ]
),

您还可以使用更流畅的 rulesFor() 方法,它允许您为每个字段和每个区域定义规则。

Translatable::make([
    Text::make('My title', 'title'),
    Trix::make('text'),
])->rulesFor('title', 'en', 'required')
->rulesFor('title', 'nl', 'nullable'),

还有用于更新和创建规则的 creationRules()updateRules()creationRulesFor()updateRulesFor() 方法。它们的功能与 rules()rulesFor() 方法相同。

自定义界面

您可能会想知道为什么我们没有在选项卡、面板或旁边显示神奇独角兽的情况下渲染可翻译字段。事实是,每个人都希望翻译显示得有所不同。这就是为什么我们决定现在保持它们非常简单。

如果 Nova 能够原生地更好地结构化长表单,我们可能会在包的新主要版本中开始利用这一点。

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 变更日志

贡献

有关详细信息,请参阅 贡献指南

安全

如果您发现有关安全性的错误,请通过电子邮件 security@spatie.be 联系,而不是使用问题跟踪器。

鸣谢

许可证

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