mosamy / translatable
Laravel 包,用于处理翻译问题带来的麻烦。
1.3.0
2023-07-20 12:44 UTC
Requires
- php: >=8.1
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();