mosamy/translatable

Laravel 包,用于处理翻译问题带来的麻烦。

1.3.0 2023-07-20 12:44 UTC

This package is auto-updated.

Last update: 2024-09-20 15:32:05 UTC


README

快速简单地创建可翻译的优雅模型

安装

composer require mosamy/translatable
php artisan migrate

用法

  • 使用可翻译特质并添加新的 Post
  • 在模型中定义翻译属性

class Post extends Model
{
  use \Mosamy\Translatable\Translatable;
  const TranslatableAttributes = ['title', 'description'];
}

$post= Post::create(['status' => 'active']);

$translation = [
  [
    'en' => [
	    'title' => 'Post Title',
	    'description' => 'Post Description'
    ],
    'fr' => [
	    'title' => 'Titre de l article',
	    'description' => 'Description du poste'
    ],
  ]
];

$post->createTranslations($translation);

直接从数据库获取翻译数据

$post = Post::find(1);
$post->translations;

或以漂亮的格式

$post->translations_list;

结果将如下所示

{
    "en": {
        "title": "Post Title",
        "description": "Post Description",
    },
    "ar": {
        "title": "Titre de l article",
        "description": "Description du poste",
    }
}

您可以使用此方法在翻译数据中搜索

$post= Post::whereTranslation('keyword')->get();

默认情况下,此方法认为您将搜索在模型中定义的 TranslatableAttributes

如果您想搜索特定属性,您可以添加额外的参数。

$post= Post::whereTranslation('keyword', ['description'])->get();
  • 第三个参数是用于 locale
  • 默认情况下,它将使用默认区域设置
  • 您可以通过添加一个数组作为第三个参数来更改此设置,包含一个或多个区域设置
$post= Post::whereTranslation('keyword', ['description'], ['ar','en'])->get();
  • 第四个参数是用于 LIKE 选项
  • 默认情况下设置为 true,但您可以禁用它,并使用精确的 WHERE 条件搜索。
    $post= Post::whereTranslation('keyword', ['description'], ['ar','en'], false)->get();
    

规则

有时您需要验证翻译输入。以下是一些可以帮助您的规则。

UNIQUE 默认情况下,locale 将设置为 translations.ar.name 的第二个键,但您可以使用 setLocale 函数进行更改,您还可以在更新记录时忽略特定的 ID

public  function  rules()
{
	return [
	'translations.ar.name'  => ['required', (new \App\Rules\TranslationUnique(new  Post))->setLocale(['ar', 'en'])->ignore($this->id)],
	'translations.en.name'  =>  'required', (new \App\Rules\TranslationUnique(new  Post))->ignore($this->id)
	];
}

排序

在翻译内部按任何属性排序很容易

$post= Post::orderByTranslation('title')->get();
  • 默认情况下,排序将按升序和默认区域设置执行
  • 要更改此设置,可以指定两个参数作为排序类型,第三个参数作为自定义区域设置
$post= Post::orderByTranslation('title', 'desc', 'fr')->get();

检索翻译

当您调用一个属性时,它将在默认区域设置中翻译

$post = Post::find(1);

echo $post->title;
// same as
echo $post->translate('title');

//Post Title

要获取特定属性的特定翻译,您可以使用 translate 方法

$post = Post::find(1);
echo $post->translate('title', 'fr');

//Titre de l article

获取包含翻译的模型,特定的区域设置或当前区域设置

$post = Post::hasTranslation(); // all that have translation
$post = Post::hasTranslation('en'); // all that have (en) translation
$post = Post::hasCurrentTranslation(); // all in current locale

仅检索特定属性

$post = Post::translateOnly('name');
$post = Post::translateOnly(['name', 'title']);

删除翻译

出于任何原因,您想要删除翻译,您可以使用简单的 Laravel Eloquent 删除方法

$post = Post::find(1);
$post->translations()->delete();
$post->translations()->where('locale', 'fr')->delete();