aw-studio / laravel-deeplable
v0.9.4
2024-05-13 14:11 UTC
Requires
- php: ^8.0|^8.1|^8.2
- guzzlehttp/guzzle: ^7.3
- illuminate/console: ^8.0|^9.0|^10.0|^11.0
- illuminate/database: ^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- astrotomic/laravel-translatable: ^11.0
- illuminate/testing: ^8.0|^9.0|^10.0|^11.0
- mockery/mockery: ^1.4
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.4|^10.0
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(...);