guidocella / laravel-multilingual
简单的多语言Laravel模型
Requires
- illuminate/database: ^11
Requires (Dev)
- laravel/laravel: ^11
- phpunit/phpunit: ^11
README
无需单独的翻译值数据库表,即可使Eloquent模型属性可翻译。
简单地访问 $country->name
,你将获得基于应用程序当前区域设置的值。
$country->nameTranslations->en
将是特定区域设置的值。
您可以使用$country->nameTranslations->toArray()
获取给定属性的 所有翻译。
安装
通过Composer安装包
composer require guidocella/laravel-multilingual
然后发布配置文件
php artisan vendor:publish
用法
首先确保可翻译属性的字段类型是text
或json
。如果您正在从迁移文件构建数据库,可以这样做
<?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();