paschal-customize-tracy/eloquent-translate

一个用于轻松翻译Laravel模型的包。它基于Ezeugwu Paschal(ezeugwupaschal@yahoo.com)的包进行了定制。

v1.0.5 2024-07-11 07:48 UTC

This package is auto-updated.

Last update: 2024-09-11 08:08:32 UTC


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

最初,此包注册了一个观察者来监听模型中的createdupdated事件,然后使用第三方提供商(默认为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
  • 处理notranslate:如果字符串中包含我们不想翻译的字符串,则添加标签
  • 更改TranslateCommand

重要提示

  • 我只是添加了更多手动翻译,如果您想通过Google云自动翻译,请设置环境变量MANUAL_TRANSLATE = false