paschaldev/eloquent-translate

一个用于轻松翻译Laravel模型的包。

v0.0.3 2019-03-01 14:31 UTC

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以获取所有可能的选项。

最初,此包注册了一个观察器来监听模型中的createdupdated事件,然后使用第三方提供商自动翻译属性(如果您的配置中将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个语言环境:法语、伊博语、约鲁巴语。

获取翻译