esign / laravel-underscore-translatable
一个用于使 eloquent 模型可翻译的 laravel 扩展包。
Requires
- php: ^8.0
- illuminate/support: ^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.2
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.4|^10.0
README
此扩展包允许您通过使用每个语言的单独列(例如 title_nl 和 title_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)。有关更多信息,请参阅 许可文件。