paschal-customize-tracy / eloquent-translate
一个用于轻松翻译Laravel模型的包。它基于Ezeugwu Paschal(ezeugwupaschal@yahoo.com)的包进行了定制。
Requires
- google/cloud-translate: ^1.17
Requires (Dev)
- laravel/laravel: dev-develop
README
此包是从Ezeugwu Paschal(ezeugwupaschal@yahoo.com)的包中定制的(https://github.com/paschaldev/eloquent-translate)。此包作为laravel应用程序中处理存储在数据库中的数据的完整解决方案。每个模型的翻译都存储在一个数据库表中。默认情况下,启用自动翻译。自动翻译使用第三方提供商来翻译您的数据库属性,目前默认为Google Translate API。如果您选择不使用第三方翻译服务,您也可以手动为任何模型设置翻译。
安装
您可以通过composer轻松安装。
composer require paschal-customize-tracy/eloquent-translate v1.0.5
如果未自动注册,该包将自动为支持的laravel版本注册自己,否则您应在config/app.php中的providers数组中添加以下内容:
TracyTran\EloquentTranslate\Providers\TranslateServiceProvider::class,
然后之后您可以发布:
php artisan vendor:publish --provider="TracyTran\EloquentTranslate\Providers\TranslateServiceProvider"
这会将配置复制到您的配置路径。
对于Lumen,打开您的bootstrap/app.php并添加以下行以注册提供者:
$app->register(TracyTran\EloquentTranslate\Providers\TranslateServiceProvider::class);
并添加以下行以设置配置:
$app->configure('eloquent-translate');
然后运行php artisan migrate以创建翻译表。默认表名为translations,但您可以在配置文件中覆盖此值。
设置
为了使模型可翻译,您需要在您的模型中包含该特质并设置translateAttributes属性。这些属性是您希望在特定数据库列中翻译的属性。
<?php namespace App; use Illuminate\Database\Eloquent\Model; use TracyTran\EloquentTranslate\Traits\TranslatorTrait; class Post extends Model { public $translateAttributes = [ 'title', 'content' ]; }
一旦您在模型中完成这些操作,任何更新或创建操作都将自动创建翻译,如果您在配置中将auto_translate设置为true。
解决特质冲突
此包使用模型中的getAttribute方法,您可能已经使用该方法或您的库正在使用该方法。由于多个包尝试在模型上设置相同的方法,您将在翻译期间开始收到错误。
如果您没有使用getAttribute属性的包,您可以跳过此部分。
为了解决这个问题,您需要使用特质中的as关键字。对于我的场景,我有一个名为Metable的库,它已经使用了getAttribute方法,以下是如何解决此问题的示例。
<?php namespace App; use Kodeine\Metable\Metable; use Illuminate\Database\Eloquent\Model; use TracyTran\EloquentTranslate\Traits\TranslatorTrait; class Category extends Model{ use Metable, TranslatorTrait { Metable::getAttribute as getMetableAttribute; TranslatorTrait::getAttribute as getTranslationAttribute; } public $translateAttributes = [ 'name', 'caption' ]; public function getAttribute($key) { $attr = $this->getMetableAttribute($key); //Fetch other library's attribute $attr = $this->getTranslationAttribute( $key , $attr ); //Call our translation method and pass the last attribute resolved in the second parameter return $attr; } }
如你所见,使用as,我们可以将每个独立包的getAttribute方法别名为,这样我们仍然可以访问它。最后,如果您模型中不存在getAttribute方法,则需要定义一个,并在调用翻译的方法时传递$attr作为第二个参数。其中$attr代表所有库冲突后解析出的最终属性。然后,您可以继续操作。
用法
设置翻译
请参阅发布后的配置文件eloquent-translate.php以了解所有可能的选项。
最初,此包注册了一个观察者来监听模型中的created和updated事件,然后使用第三方提供商(默认为Google Translate API)自动翻译属性,前提是在您的配置中将auto_translate设置为true。
如果您打算使用Google翻译API,您需要从Google控制台云获取Google API密钥,确保您已启用翻译API,然后将此密钥复制并粘贴到配置文件的google_api_key中。
自动翻译可能会减慢您的应用程序速度,因为它需要连接到Google,并且根据您设置的用于翻译的区域数量,您的应用程序可能会变慢并可能变得无响应。
为了解决这个问题,请确保queue设置为true,并可选地指定一个queue_name来使用。如果您不明白队列是如何工作的,请参阅Laravel的队列文档。
在配置文件中定义您的区域,当包将翻译属性到定义的每个区域时。
如果您不想使用自动翻译,您可以手动为您的模型设置单个翻译。有两种方法可用。
public function setTranslation($attribute, $locale, $translation, $force = false)
属性名称,确保它在您的模型中的$translateAttributes数组中定义。您想要设置的$locale和翻译。
如果$force参数设置为true,即使属性在您的模型文件中没有定义,您也会添加attribute。
$model->setTranslation('name', 'fr', 'Bonjour')
您还可以一次性为多个区域设置模型的所有翻译。
public function setTranslations($attribute, $translations)
使用方法如下。
$model = App\Post::find(1); $translations = [ 'fr' => 'Bonjour', 'ig' => 'ụtụtụ ọma', 'yo' => 'e kaaro' ]; $model->setTranslations('name', $translations);
在上面的代码中,我们正在设置模型的name属性翻译,假设值为早上好,同时翻译到3个区域:法语、伊博语、约鲁巴语。
获取翻译
我自定义了什么?
- 我在类Translator上更改了updateOrCreate函数为upsert函数,认为这会稍微提高速度。
- 添加addGlobalScope以使用预加载,避免延迟加载(旧代码)
- 覆盖翻译属性,想法是
- 首先,我们必须将翻译属性添加到appends中。
$this->appends = array_merge($this->appends, $this->getTranslationAttributes()); - 其次,使用__call来处理getxxxAtribute函数,因为Laravel会在appends属性上调用getxxxAtribute
- 首先,我们必须将翻译属性添加到appends中。
- 处理notranslate:如果字符串中包含我们不想翻译的字符串,则添加标签
- 更改TranslateCommand
重要提示
- 我只是添加了更多手动翻译,如果您想通过Google云自动翻译,请设置环境变量MANUAL_TRANSLATE = false