定制 spatie/nova-translatable 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

spatie/nova-translatable

Composer 安装命令:

composer require spatie/nova-translatable

包简介

Making Nova fields translatable

关键字:

README 文档

README

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

This package contains a Translatable class you can use to make any Nova field type translatable.

Imagine you have this fields method in a Post Nova resource:

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

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

That Post Nova resource will be rendered like this.

screenshot

Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

Requirements

This Nova field requires Nova 4 or 5 specifically and MySQL 5.7.8 or higher.

Installation

First you must install spatie/laravel-translatable into your Laravel app. In a nutshell, this package will store translations for your model in a json column in your table. On top of that, it provides many handy functions to store and retrieve translations. Be sure to read the entire readme of laravel-translatable before using this Nova package.

Next, you can install this Nova package into a Laravel app that uses Nova via composer:

composer require spatie/nova-translatable

Usage

In order to use the package you must first let Translatable know which locales your app is using using the Translatable::defaultLocales() method. You can put this code in AppServiceProvider or a dedicated service provider of your own.

// in any service provider

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

Next, you must prepare your model as explained in the readme of laravel-translatable. In short: you must add json columns to your model's table for each field you want to translate. Your model must use the Spatie\Translatable\HasTranslations on your model. Finally, you must also add a $translatable property on your model that holds an array with the translatable attribute names.

Now that your model is configured for translations, you can use Translatable in the related Nova resource. Any fields you want to display in a multilingual way can be passed as an array to `Translatable.

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

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

Making translations searchable

Every translation of the translated fields should be added into the $search array separately.

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

Customizing the locales per translatable

If you have a Nova resource where you want different locales than the ones configured globally, you can call the locales method on Translatable.

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

These fields will now use the de and es locales.

Customizing the name of a translatable

By default translatable fields get ($locale) appended to their name. You can customize this behaviour globally by providing a closure to displayLocalizedNameByDefaultUsing on Translatable. This callback will be used to render the localized field names.

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

With this in place all names of translatable fields will get [$locale] appended.

You can also customize the localized field name per resource by passing a closure the displayLocalizedNameUsing function.

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

With this in place, the localized field names will be suffixed with --- $locale.

Of course you can still customize the name of a field as usual.

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

Using the code about above the name for the title field will be "My title ['en']".

Customizing the rules of a translatable

You may use the regular Nova functionality to define rules on the fields inside your Translatable fields collection. However, this will apply those rules to all locales. If you wish to define different rules per locale you can do so on the Translatable collection.

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'],
    ]
),

You may also use the more fluent rulesFor() method, which allows you to define rules per field per locale.

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

There are also methods for update and creation rules called creationRules(), updateRules(), creationRulesFor() and updateRulesFor(). They function in the same way as the rules() and rulesFor() methods.

On customizing the UI

You might wonder why we didn't render the translatable fields in tabs, panels or with magical unicorns displayed next to them. The truth is that everybody wants translations to be displayed a bit different. That's why we opted to keep them very simple for now.

If Nova gains the ability to better structure a long form natively, we'd probably start leveraging that in a new major version of the package.

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security

If you've found a bug regarding security please mail security@spatie.be instead of using the issue tracker.

Credits

License

The MIT License (MIT). Please see License File for more information.

spatie/nova-translatable 适用场景与选型建议

spatie/nova-translatable 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.7M 次下载、GitHub Stars 达 223, 最近一次更新时间为 2018 年 10 月 08 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「nova」 「laravel」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 spatie/nova-translatable 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 spatie/nova-translatable 我们能提供哪些服务?
定制开发 / 二次开发

基于 spatie/nova-translatable 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 1.7M
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 226
  • 点击次数: 27
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 223
  • Watchers: 3
  • Forks: 27
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2018-10-08