esign/laravel-underscore-translatable

一个用于使 eloquent 模型可翻译的 laravel 扩展包。

1.5.0 2024-03-12 20:05 UTC

This package is auto-updated.

Last update: 2024-09-12 21:08:31 UTC


README

Latest Version on Packagist Total Downloads GitHub Actions

此扩展包允许您通过使用每个语言的单独列(例如 title_nltitle_en)来使 eloquent 模型可翻译。此扩展包深受 Spatie 的 spatie/laravel-translatable 启发。

安装

您可以通过 composer 安装此扩展包

composer require esign/laravel-underscore-translatable

用法

准备您的模型

要使您的模型可翻译,您需要在模型上使用 Esign\UnderscoreTranslatable\UnderscoreTranslatable 特性。接下来,您应该定义哪些字段是可翻译的,通过添加一个公共的 $translatable 属性。

use Esign\UnderscoreTranslatable\UnderscoreTranslatable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use UnderscoreTranslatable;

    public $translatable = ['title'];
}

您的数据库结构应如下所示

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title_nl')->nullable();
    $table->string('title_fr')->nullable();
    $table->string('title_en')->nullable();
});

检索翻译

要检索当前区域的翻译,您可以使用您在 translatable 属性中定义的属性。或者,您可以使用 getTranslation 方法

$post->title
$post->getTranslation('title')

要检索特定区域的翻译,您可以使用完全后缀的属性或将区域传递给 getTranslation 方法

$post->title_nl
$post->getTranslation('title', 'nl')

要检查是否存在翻译,您可以使用 hasTranslation 方法

$post->title_en = 'Your first translation';
$post->title_nl = '';
$post->title_fr = null;

$post->hasTranslation('title', 'en'); // returns true
$post->hasTranslation('title', 'nl'); // returns false
$post->hasTranslation('title', 'fr'); // returns false

如果没有提供区域,将使用当前区域。

使用回退

此扩展包允许您返回应用程序 config/app.php 中定义的 fallback_locale 属性的值。

getTranslation 方法的第三个 useFallbackLocale 参数可用于控制此行为

$post->title_en = 'Your first translation';
$post->title_nl = null;
$post->getTranslation('title', 'nl', true); // returns 'Your first translation'
$post->getTranslation('title', 'nl', false); // returns null

或者,您可以使用专门的方法来做到这一点

$post->title_en = 'Your first translation';
$post->title_nl = null;
$post->getTranslationWithFallback('title', 'nl'); // returns 'Your first translation'
$post->getTranslationWithoutFallback('title', 'nl'); // returns null

设置翻译

要为当前区域设置翻译,您可以使用您在 translatable 属性中定义的属性。或者,您可以在创建模型时立即传递它

$post->title = 'Your first translation';

Post::create([
    'title' => 'Your first translation',
]);

您也可以使用 setTranslation 方法

$post->setTranslation('title', 'en', 'Your first translation');
$post->setTranslation('title', 'nl', 'Jouw eerste vertaling');

您还可以使用 setTranslations 方法一次性设置多个翻译,或者在与创建模型同时传递它们

$post->setTranslations('title', [
    'en' => 'Your first translation',
    'nl' => 'Jouw eerste vertaling',
]);

Post::create([
    'title' => [
        'en' => 'Your first translation',
        'nl' => 'Jouw eerste vertaling',
    ],
]);

此扩展包不会将翻译持久化到数据库中,因此请记住保存您的模型

$post->setTranslation('title', 'en', 'Your first translation');
$post->save();

定义访问器和修改器

您可以使用与 Laravel 中相同的用法定义访问器

public function getTitleAttribute($value): string
{
    return ucfirst($value);
}

对于修改器也是如此

public function setTitleAttribute($value, $locale): void
{
    $this->attributes['title_' . $locale] = strtolower($value);
}

测试

composer test

许可

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