stolkom/translatable

Laravel 模型翻译包

1.0 2021-06-20 20:39 UTC

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'];