hyperf-ext / translatable
The Hyperf Multilingual Model package.
Installs: 1 507
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 2
Forks: 3
Open Issues: 0
pkg:composer/hyperf-ext/translatable
Requires
- php: >=7.3
- ext-swoole: >=4.5
- hyperf/config: ~2.2.0
- hyperf/database: ~2.2.0
- hyperf/db-connection: ~2.2.0
- hyperf/di: ~2.2.0
- hyperf/framework: ~2.2.0
- hyperf/model-listener: ~2.2.0
- hyperf/translation: ~2.2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- hyperf/testing: ~2.2.0
- mockery/mockery: ^1.0
- phpstan/phpstan: ^0.12
- swoole/ide-helper: dev-master
README
该组件为数据库模型提供实现多语言的能力。
安装
composer require hyperf-ext/translatable
发布配置
php bin/hyperf.php vendor:publish hyperf-ext/translatable
文件位于
config/autoload/translatable.php。
注意,该组件依赖
hyperf/translation,不要忘记也要发布其配置并按需设置。
配置
[
/*
|--------------------------------------------------------------------------
| 应用语言列表
|--------------------------------------------------------------------------
|
| 包含应用所有可用语言的数组。
|
*/
'locales' => [
'en',
'fr',
'zh' => [
'CN',
'TW',
],
],
/*
|--------------------------------------------------------------------------
| 语言分隔符
|--------------------------------------------------------------------------
|
| 用于在定义可用语言时连接语言和国家(或地区)之间的字符串。例如,如果设置为 `_`,
| 则“中文(中国)”的语言会以 `zh_CN` 的形式存储到数据库中。
|
*/
'locale_separator' => '_',
/*
|--------------------------------------------------------------------------
| 默认语言
|--------------------------------------------------------------------------
|
| 指定要使用的默认语言。该组件默认使用 `hyperf/translation` 组件的语言设置。
| 如果出于某种原因想要覆盖此默认设置,则可以在此处设置要使用的默认值。
| 如果在此处设置一个值,它将仅使用当前的值,而不会回退到 `hyperf/translation`
| 组件的设置。
|
*/
'locale' => null,
/*
|--------------------------------------------------------------------------
| 使用回退
|--------------------------------------------------------------------------
|
| 设置是否启用回退语言。为了增加灵活性,定义多语言模型的 $useTranslationFallback
| 属性可覆盖此处的设置。
|
*/
'use_fallback' => false,
/*
|--------------------------------------------------------------------------
| 使用属性回退
|--------------------------------------------------------------------------
|
| 如果所选语言的属性为空,则属性回退特性将返回回退语言的翻译后的值。
| 注意,必须启用 `use_fallback`。
|
*/
'use_property_fallback' => true,
/*
|--------------------------------------------------------------------------
| 回退语言
|--------------------------------------------------------------------------
|
| 回退语言是当请求的翻译不存在时,返回设置的回退语言的翻译。
| 如要禁用,请设置为 `false`。如果设置为 `null`,将会遍历语言列表中配置的所有语言,
| 直到找到第一个有效的翻译,否则会遍历完整个列表。
| 语言列表从上到下遍历,对于基于国家(或地区)的语言,会先检查简单的语言代码。
| 因此,例如在检查 `zh_CN` 之前会先检查 `zh`。
|
*/
'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Translation 模型命名空间
|--------------------------------------------------------------------------
|
| 定义默认的 'Translation` 类命名空间。
| 例如,如果要使用 `App\Translations\CountryTranslation` 而不是 `App\CountryTranslation`,
| 请设置为 `App\Translations`。
|
*/
'translation_model_namespace' => null,
/*
|--------------------------------------------------------------------------
| Translation 模型后缀
|--------------------------------------------------------------------------
|
| 定义默认的 `Translation` 类名后缀。
| 例如,如果要使用 `CountryTrans` 而不是 `CountryTranslation`,请设置为 `Trans`。
|
*/
'translation_suffix' => 'Translation',
/*
|--------------------------------------------------------------------------
| 语言字段名
|--------------------------------------------------------------------------
|
| 定义 `Translation` 模型的 'locale' 字段名。
|
*/
'locale_key' => 'locale',
/*
|--------------------------------------------------------------------------
| 转换为数组时始终加载 Translation
|--------------------------------------------------------------------------
|
| 将其设置为 `false` 可以提升性能,但是在使用 `toArray()` 时不会返回翻译,
| 除非已经加载了关联的 `Translation` 模型。
|
*/
'to_array_always_loads_translations' => true,
/*
|--------------------------------------------------------------------------
| 配置 RuleFactory 默认行为
|--------------------------------------------------------------------------
|
| 用于控制 RuleFactory 行为的默认值。
| 此处你可以为整个应用设置自己的默认格式和定界符。
|
*/
'rule_factory' => [
'format' => \HyperfExt\Translatable\Validation\RuleFactory::FORMAT_ARRAY,
'prefix' => '%',
'suffix' => '%',
],
];
使用示例
迁移
create_posts_table.php
use Hyperf\Database\Schema\Schema; use Hyperf\Database\Schema\Blueprint; use Hyperf\Database\Migrations\Migration; class CreatePostsTable extends Migration { public function up(): void { Schema::create('posts', function(Blueprint $table) { $table->increments('id'); $table->string('author'); $table->timestamps(); }); } public function down(): void { Schema::dropIfExists('posts'); } }
create_post_translations_table
use Hyperf\Database\Schema\Schema; use Hyperf\Database\Schema\Blueprint; use Hyperf\Database\Migrations\Migration; class CreatePostTranslationsTable extends Migration { public function up(): void { Schema::create('post_translations', function(Blueprint $table) { $table->increments('id'); $table->integer('post_id')->unsigned(); $table->string('locale')->index(); $table->string('title'); $table->text('content'); $table->unique(['post_id', 'locale']); $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade'); }); } public function down(): void { Schema::dropIfExists('post_translations'); } }
模型
Post.php
use Hyperf\Database\Model\Model; use HyperfExt\Translatable\Contracts\TranslatableInterface; use HyperfExt\Translatable\Translatable; class Post extends Model implements TranslatableInterface { use Translatable; // 转换为数组时是否始终加载 Translation。默认为 `null`。 // 值为 `null` 时使用配置文件的 `to_array_always_loads_translations` 值。 protected static $autoloadTranslations = null; // 删除记录的同时删除关联的翻译。默认为 `false`。 protected static $deleteTranslationsCascade = false; // 配置该属性会覆盖配置文件的 `use_fallback` 值。 //protected $useTranslationFallback = false; // 配置对应的 Translation 模型的多语言字段列表 public $translatedAttributes = ['title', 'content']; protected $fillable = ['author']; }
PostTranslation.php
use Hyperf\Database\Model\Model; class PostTranslation extends Model { public $timestamps = false; // 多语言字段列表 protected $fillable = ['title', 'content']; }
获取已翻译的属性
use App\Post; use Hyperf\Contract\TranslatorInterface; use Hyperf\Utils\ApplicationContext; $post = Post::query()->first(); echo $post->translate('en')->title; // My first post $translator = ApplicationContext::getContainer()->get(TranslatorInterface::class); $translator->setLocale('en'); echo $post->title; // My first post $translator->ssetLocale('de'); echo $post->title; // Mein erster Post
存储已翻译的属性
use App\Post; $post = Post::query()->first(); echo $post->translate('en')->title; // My first post $post->translate('en')->title = 'My cool post'; $post->save(); $post = Post::query()->first(); echo $post->translate('en')->title; // My cool post
填充翻译
use App\Post; $data = [ 'author' => 'Gummibeer', 'en' => ['title' => 'My first post'], 'fr' => ['title' => 'Mon premier post'], ]; $post = new Post(); $post->fill($data); $post->save(); echo $post->translate('fr')->title; // Mon premier post