cloudmonitor / translatable
将模型属性翻译成任意数量的语言。
v1.0.18
2023-08-01 14:48 UTC
Requires
- php: ^7.2.5|^8.0
- illuminate/support: ^8.0|^9.0|^10.0
README
将Eloquent属性翻译成多种语言,并使用getLocale()无缝查询正确的翻译。
安装
composer require cloudmonitor/translatable
准备Eloquent模型
与其他Eloquent中的特殊属性类似,例如$fillables,可翻译属性必须定义为数组。只需要给出数据库列的名称即可
protected $translatable = [ 'name', ];
现在Translatable将仅观察这些属性,并跳过其他属性。
使用翻译
由于Translatable使用Laravel的app()->getLocale(),这意味着它在查询名称时将确定使用哪种语言。
例如,当前区域设置为da(丹麦语),因此您想更新一本书的标题。只需像没有翻译实现一样进行操作即可
$book = Book::find($id); $book->name = 'New name for Danish version'; $book->save();
或者作为更新方法
Book::find($id)->update(['name' => 'New name for Danish version']);
当您想获取当前区域的语言名称时,只需查询它即可
return Book::find($id)->name;
其他区域
有时您想更新所有翻译或在特定语言中更新,或者只是在不同语言中更新。这可能是一位想要更新英语标题的丹麦版主,或者是几个语言的标题,或者是一些不同的事情。
Book::find($id)->setTranslation('name', 'en', 'Name in English');
同样,可以查询特定语言
Book::find($id)->getTranslation('name', 'en');
按翻译列排序
由于内置的->orderBy()无法正常工作,因为数据以JSON格式存储,因此已添加了优化的->orderByTranslation()。
第一个参数是列名,第二个是方向,第三个是区域。只需要第一个列。
Book::orderByTranslation('name', 'asc', 'en');
迁移
在幕后,Translatable使用数据库中的JSON列来在同一个列中存储多个版本。
$table->json('name');