aw-studio/laravel-deeplable

v0.9.4 2024-05-13 14:11 UTC

README

一个用于使用DeepL API翻译Laravel模型的包。它包含了一个用于astrotomic/laravel-translatable composer包的翻译器。其他用例的翻译器也可以轻松编写。

安装

通过composer安装此包

composer require aw-studio/laravel-deeplable

并发布配置文件

php artisan vendor:publish --tag=deeplable --force

设置

发布 config/deeplable.php 后,您必须输入DeepL-Secret才能使用他们的API。您还可以在运行 deeplable:run 命令时配置您想要翻译的所有模型。

使用方法

只要它们在DeepL上可用,您就可以将您的可翻译模型翻译成在您的 config/translatable.php 中设置的任何语言。为了将您的模型翻译成目标语言,默认翻译(fallback_locale)必须可用。您可以使用 Deeplable 特性轻松地将您的模型翻译成目标语言。

use AwStudio\Deeplable\Traits\Deeplable;

class Post extends Model
{
    use Deeplable;
}

假设您已存储默认语言('en'),并希望自动生成所有已翻译属性的德语翻译

$post = Post::first();

$post->translateTo('de');
$post->translateAttributeTo('de', 'title');
$post->translateAttributesTo('de', ['title', 'text']);

如果您想要将所有模型翻译成所有区域,只需运行 deeplable artisan命令

php artisan deeplable:run

如果您想要翻译特定语言,也可以设置一个参数

php artisan deeplable:run fr

翻译器

翻译器的目的是将一个可翻译属性绑定到一个模型上。一个内置的示例是 AstrotomicTranslator,它更新由astrotomic/laravel-translatable包翻译的模型。

创建翻译器

翻译器必须扩展 AwStudio\Deeplable\Translators\BaseTranslator 类,该类有2个抽象方法

class AstrotomicTranslator
{
    protected function translateAttribute(Model $model, $attribute, $locale, $translation)
    {
        $model->translateOrNew($locale)->setAttribute($attribute, $translation);
    }

    public function getTranslatedAttributes(Model $model, $locale)
    {
        return array_keys($model->getTranslationsArray()[$locale] ?? []);
    }
}

注册翻译器

翻译器可以像这样在Service Provider中注册

use AwStudio\Deeplable\Translators\Resolver;
use Astrotomic\Translatable\Contracts\Translatable;

public function register()
{
    Translator::register(Translatable::class, function () {
            return new AstrotomicTranslator($this->app['deeplable.api']);
    });
}

使用翻译器

翻译器可以使用如下方式使用

use AwStudio\Deeplable\Facades\Translator;
use Astrotomic\Translatable\Contracts\Translatable;

Translator::get(Translatable::class)->translate($post, 'de', 'en'); // Translates the whole model from en to de
Translator::get(Translatable::class)->translateAttributes($post, ['title', 'text'], 'de', 'en'); // Translates attributes title and text from en to de

翻译策略

考虑到不同模型可能需要不同的翻译器,可以在服务提供者中指定一个翻译策略,如下所示

use AwStudio\Deeplable\Facades\Translator;
use AwStudio\Deeplable\Translators\Resolver;
use Astrotomic\Translatable\Contracts\Translatable;

public function register()
{
    Translator::strategy(function(Model $model) {
        if($model instanceof Translatable) {
            return Translatable::class;
        }
        // something else...
    });
}

现在可以通过如下方式接收正确的翻译器

Translator::for($post)->translate(...);