koenhoeijmakers/laravel-translatable

此包已废弃,不再维护。作者建议使用astrotomic/laravel-translatable包。

Laravel 翻译

v0.6.0 2020-04-04 06:46 UTC

This package is auto-updated.

Last update: 2020-07-31 09:30:44 UTC


README

Packagist Build Status Code Coverage Scrutinizer Code Quality license Packagist

处理模型翻译的新鲜方式,翻译将直接集成到模型中,而不是让您查询关系或逐个获取每个属性的翻译。

安装

需要此包。

composer require koenhoeijmakers/laravel-translatable

...并且可选地发布配置。

php artisan vendor:publish --provider="KoenHoeijmakers\LaravelTranslatable\TranslatableServiceProvider"

使用

设置可翻译模型。

首先创建一个迁移和一个模型,我们将使用Animal模型和相应的AnimalTranslation模型。

迁移

Schema::create('animals', function (Blueprint $table) {
    $table->increments('id');
    $table->timestamps();
});

始终有一个locale和一个指向原始模型的foreign_key,在我们的例子中是animal_id

Schema::create('animal_translations', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('animal_id');
    $table->string('locale');
    $table->string('name');
    $table->timestamps();
    
    $table->unique(['locale', 'animal_id']);
    $table->foreign('animal_id')->references('id')->on('animals');
});

模型

在模型上注册特性,并将应翻译的列添加到$translatable属性中,**但也要使它们可填充**,因为保存是通过事件处理的,这样我们就不必更改save方法,使包更具互操作性。

所以请确保$translatable列在两个模型中也是$fillable

use Illuminate\Database\Eloquent\Model;
use KoenHoeijmakers\LaravelTranslatable\HasTranslations;

class Animal extends Model
{
    use HasTranslations;
    
    protected $translatable = ['name'];
    
    protected $fillable = ['name'];
}
use Illuminate\Database\Eloquent\Model;

class AnimalTranslation extends Model
{
    protected $fillable = ['name'];
}

这就是全部内容,但您可以在下面了解更多关于包的信息。

关于

使此包如此特殊的是它处理翻译的方式,如何检索、存储和查询它们。

查询

由于此包处理翻译的方式,查询变得非常简单,而对于其他包,您会有一个->whereTranslation('nl', 'column', '=', 'foo')方法。

但在此包中,您只需执行->where('column', '=', 'foo'),它就会知道如何查询,就像您过去一样查询!

检索

当您从数据库检索模型时,包会将翻译表与当前区域设置config/app.php中的翻译连接起来。

这使得任何翻译列都像模型本身的“本地”列一样,由于这一点,我们不需要在模型上覆盖许多方法,这是一个很大的优点。

需要用不同的语言获取模型?调用$model->translate('nl')即可完成。现在您想保存nl翻译?只需调用->update()。模型知道它在哪个区域加载,并且会相应地处理。

$animal = Animal::query()->find(1);

$animal->translate('nl')->update(['name' => 'Aap']);

存储

您将像在模型上设置属性一样存储您的翻译,所以这将非常出色

Animal::query()->create(['name' => 'Monkey']);

但我听说您想在一个请求中存储多个翻译!在这种情况下,您可以使用->storeTranslation()->storeTranslations()方法。

$animal = Animal::query()->create(['name' => 'Monkey']);

$animal->storeTranslation('nl', [
    'name' => 'Aap',
]);

$animal->storeTranslations([
    'nl' => [
        'name' => 'Aap',
    ],
    'de' => [
        'name' => 'Affe',
    ],
]);