guidocella/laravel-multilingual

简单的多语言Laravel模型

v1.0.5 2024-06-10 10:29 UTC

This package is auto-updated.

Last update: 2024-09-10 11:02:41 UTC


README

无需单独的翻译值数据库表,即可使Eloquent模型属性可翻译。

简单地访问 $country->name,你将获得基于应用程序当前区域设置的值。

$country->nameTranslations->en将是特定区域设置的值。

您可以使用$country->nameTranslations->toArray()获取给定属性的 所有翻译。

安装

通过Composer安装包

composer require guidocella/laravel-multilingual

然后发布配置文件

php artisan vendor:publish

用法

首先确保可翻译属性的字段类型是textjson。如果您正在从迁移文件构建数据库,可以这样做

<?php

Schema::create('countries', function (Blueprint $table)
{
	$table->increments('id');
	$table->json('name');
});

现在数据库已准备就绪以保存JSON字符串,请将Translatable特性添加到您的模型中,并添加一个公开的数组属性$translatable,该属性包含可翻译字段的名称。

<?php

class Country extends Model
{
    use GuidoCella\Multilingual\Translatable;

    public $translatable = ['name'];
}

特性将重写getCasts方法,以指导Eloquent将所有$translatable属性转换为array,而无需在$casts中再次指定它们。

现在,我们的模型name属性是可翻译的,在创建新模型时,您可以按以下方式指定名称字段

<?php

Country::create([
	'name' => [
		'en' => 'Spain',
		'es' => 'España'
	]
]);

它将自动转换为JSON字符串并保存在数据库的名称字段中。您可以稍后按如下方式检索名称

$country->name

这将返回基于当前区域设置的国籍名称。如果当前区域设置的翻译中没有非空值,则将使用配置文件中定义的fallback_locale

如果没有找到任何内容,将返回null

您还可以使用以下语法返回特定区域的值

$country->nameTranslations->en

这将返回国家的英语名称。

要返回所有可用翻译的数组,请使用

$country->nameTranslations->toArray()

您可以使用Eloquent JSON字段的箭头语法更新单个区域的翻译

$country->update(['name->'.App::getLocale() => 'Spain']);

验证

您可以这样验证特定区域的存在

<?php

$validator = validator(
    ['name' => ['en' => 'One', 'es' => 'Uno']],
    ['name.en' => 'required']
);

然而,此包包括translatable_required验证规则,要求在所有区域提供翻译

<?php

$validator = validator(
    ['name' => ['en' => 'One', 'es' => 'Uno']],
    ['name' => 'translatable_required']
);

您可以从包配置文件中定义可用区域以及fallback_locale

现在,您只需将新验证规则的翻译消息添加到validation.php翻译文件中即可

'translatable_required' => 'The :attribute translations must be provided.',

查询

Laravel允许您使用->运算符查询JSON列

Company::where('name->en', 'Monsters Inc.')->first();

Country::orderBy('name->'.App::getLocale())->get();