aozisik / translatable
Translatable是一个包,可以帮助你在模型上拥有可翻译字段。这些字段将以JSON格式存储您的翻译,并在您尝试访问这些字段时自动获取到您当前的应用程序语言环境。您也可以通过使用某些方法来获取您选择的特定语言。
Requires
- php: >=5.4.0
- illuminate/support: 4.2.*
This package is auto-updated.
Last update: 2021-10-10 07:08:14 UTC
README
此包旨在与Laravel 4和Eloquent ORM一起使用。
它不需要额外的迁移,也不需要对您当前的数据模型进行任何更改,也不需要进行重大的代码修改。实现非常简单直接。
我设计了此包作为启用Eloquent模型字段可翻译的简单方式。您只需添加TranslatableTrait即可。
转到您的composer.json并添加以下行
"aozisik/translatable": "dev-master"
示例实现
<?php
use Aozisik\Translatable\TranslatableTrait;
class Books extends \Eloquent {
use TranslatableTrait;
protected $guarded = ['id'];
protected $localizedFields = ['name', 'description'];
}
您Book模型中的名称和描述字段现在是可翻译的。
##工作原理##
在添加"TranslatableTrait"特性后,您的模型将开始动态翻译本地化字段。但是,如果您之前在表中保存了没有特性数据的记录,可能会得到意外的结果。
如果您是从零开始,Translatable的工作方式如下
-
当您访问一个属性时,比如$book->name,translatable会自动将其翻译成激活的语言*
-
当您设置一个属性且设置的值是字符串时,它将被假定为此字符串是激活的语言*
-
要一次性存储多语言翻译,您必须将一个数组分配给属性。数组中的键应与语言代码相对应。
$book->name = array('en' => 'Book', 'fr' => 'Le Livre', 'de' => 'Das Buch'); $book->save;
在此记录中,数据库中的name字段看起来像这样:{"en":"Book","fr":"Le Livre","de":"Das Buch"}
相当简单!但是,请注意,字段指定的输入长度可能不足以存储JSON的长字符串。
因此,您通常最好使用TEXT来存储本地化字段,而不是VARCHAR(255)。
如何获取特定语言的翻译
您可能需要获取除激活语言之外的特定语言的翻译。
这可以这样做
$book->getTranslation('name', 'de); // Das Buch
$book->getTranslation('name', 'en); // Book
$book->getTranslation('name', 'fr); // Le Livre
$book->name; // Book, if App::getLocale() returns "en"
激活语言由App::getLocale()
确定
优点和缺点##
让我们从优点开始
- 无需额外表格来存储翻译
- 不需要对代码进行重大修改
- 无需迁移,无需配置,无需其他操作
只需将特性添加到您的模型中,它就可以立即工作。
然而,也有一些缺点
- 排序可能成问题,因为本地化字段基本上会存储JSON序列化
- 如果您有现有数据,您应该以与该特性相同的格式存储它们。
- 根据您的当前数据库设计,您可能需要将一些VARCHAR转换为TEXT。
总的来说,我认为这是一个非常实用的方法,并且实现起来相当简单。
我愿意接受建议。欢迎提交pull请求和错误报告。