stolkom / translatable
Laravel 模型翻译包
Requires
- php: ^7.2
- laravel/framework: ^5.5
This package is auto-updated.
Last update: 2024-09-09 12:58:57 UTC
README
Translatable 包旨在实现模型字段的翻译。本质上,Translatable 并非 lang 文件的替代品,而是用于翻译存储在数据库中的值。
安装
可以使用 composer 安装此包
composer require stolkom/translatable
如果计划使用公共表来存储翻译,需要创建该表。为此,需要执行以下命令
php artisan vendor:publish --provider="Stolkom\Translatable\TranslatableServiceProvider"
php artisan migrate
使用
可以通过在模型主体中添加以下行来连接 Trait:
use Stolkom\Translatable\Translatable;
在模型主体中声明的 translatableAttributes 数组中指定可翻译字段列表。
public $translatableAttributes = ['name', 'description'];
对于所有使用 Translatable Trait 的模型,默认启用自动翻译。因此,当访问指定在 translatableAttributes 数组中的字段时,这些字段将自动翻译为当前用户的语言。如果翻译表中不存在所选语言的翻译,则返回未翻译的值。
$exampleModel->name // будет переведено, если значение перевода есть в БД
获取特定语言的翻译
如果需要获取字段值在非当前用户语言的其他语言的翻译,可以使用以下函数
public function getTranslation(string $field, string $locale = null)
getTranslation
返回所选字段在所选语言的翻译。如果数据库表中不存在翻译,则返回字段的未翻译值。
- field - 类型 string。需要翻译的模型字段的名称。
- locale - 类型 string。表示翻译语言的两位字母代码。如果没有指定,则使用当前用户的语言。
返回值:string
禁用自动翻译
如果需要在某些时刻(例如在创建/编辑页面上)禁用字段自动翻译,则需要调用模型的 disableAutoTranslations
方法。
$exampleModel->disableAutoTranslations();
要重新启用自动翻译,需要调用 enableAutoTranslations
方法。
公共翻译表
默认情况下,使用具有多态关系的公共表 translations 来存储模型字段的翻译。
单独的翻译表
如果模型预计将有很多记录,则为了防止公共表过度膨胀并降低数据库负载,可以使用为该模型创建的单独翻译表。
为此需要创建一个包含以下字段的迁移
Schema::create('example_model_translations', function (Blueprint $table) { $table->increments('id'); $table->unsignedInteger('example_model_id')->index(); $table->string('field'); $table->string('locale', 2); $table->text('text')->nullable(); $table->index(['example_model_id', 'field', 'locale']); });
其中 example_model_translations
是翻译表的名字。
为了指定模型使用单独的翻译表,需要在模型主体中添加变量 translationTable
,包含使用的表名
public $translationsTable = 'example_model_translations';
此外,需要为翻译创建一个单独的模型
class ExampleModelTranslation extends Model { public $timestamps = false; protected $guarded = []; }
并在使用 Translatable Trait 的模型中重写 getTranslationModelName
方法,以便它返回创建的翻译模型的名字
protected static function getTranslationModelName() { return ExampleModelTranslation::class; }
之后,Translatable Trait 将自动使用为该模型(例如 ExampleModel)创建的表来存储翻译。
保存翻译
可以使用以下方法保存模型的翻译
public function saveTranslations(array $translations)
saveTranslations
方法接受一个数组作为属性,其形式如下
['field_name' => ['locale' => 'value']]
示例
$exampleModel->saveTranslations([ 'name' => [ 'en' => 'Example', 'ru' => 'Пример' ], 'description' => [ 'en' => 'Description example', 'ru' => 'Пример описания' ], ]);
无延迟加载(Eager loading)
需要注意的是,Laravel 默认使用惰性加载(Lazy loading),输出带有翻译的 100 条记录将创建 101 个查询。为了解决这个问题,应使用无延迟加载。
ModelName::with('translations')->get();
此外,还可以为模型自动应用无延迟加载。只需在模型主体中添加以下行即可
protected $with = ['translations'];