paschaldev / eloquent-translate
一个用于轻松翻译Laravel模型的包。
Requires
- viniciusgava/google-translate-api: dev-master
Requires (Dev)
- laravel/laravel: dev-develop
This package is auto-updated.
Last update: 2024-09-29 05:02:25 UTC
README
此包作为处理存储在数据库中的数据的laravel应用程序中翻译的完整解决方案。每个模型的翻译都存储在数据库表中。默认情况下,自动翻译已启用。自动翻译使用第三方提供商来翻译您的数据库属性,目前默认为Google Translate API。如果您不希望使用第三方翻译服务,您也可以为任何模型手动设置翻译。
安装
您可以通过composer轻松安装。
composer install paschaldev/eloquent-translate
如果未自动注册,则包将为支持的laravel版本自动注册自身,否则,您应该在config/app.php
中的提供者数组中添加此内容
PaschalDev\EloquentTranslate\Providers\TranslateServiceProvider::class,
然后之后,您可以发布
php artisan vendor:publish --provider="PaschalDev\EloquentTranslate\Providers\TranslateServiceProvider"
这会将配置复制到您的配置路径。
对于Lumen,打开您的bootstrap/app.php
并添加以下行以注册提供者
$app->register(PaschalDev\EloquentTranslate\Providers\TranslateServiceProvider::class);
以及以下行以设置配置
$app->configure('eloquent-translate');
然后运行php artisan migrate
以创建翻译表。默认表名为translations
,但您可以在配置文件中覆盖此值。
设置
为了使模型可翻译,您需要在模型中包含特质并设置translateAttributes
属性。这些属性是您希望在该特定DB列中翻译的属性。
<?php namespace App; use Illuminate\Database\Eloquent\Model; use PaschalDev\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 PaschalDev\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
事件,然后使用第三方提供商自动翻译属性(如果您的配置中将auto_translate
设置为true
),目前默认为Google Translate API。
如果您将使用Google Translate API,您需要从Google Console Cloud获取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个语言环境:法语、伊博语、约鲁巴语。