Laravel 5 多语言模型:优雅的国际化解决方案
在构建多语言应用时,数据存储是一个常见的挑战。Laravel 5 Multilingual Models 是一个强大的开源包,它允许你在不使用单独翻译表的情况下,将Eloquent Models的属性直接转化为多语言。只需简单地调用 $model->attribute
,就能自动获取基于当前应用locale的值。
安装与配置
要在你的 Laravel 应用中引入这个包,首先通过 Composer 进行安装:
composer require themsaid/laravel-multilingual
接着,在 config/app.php
的服务提供者数组中添加该包的服务提供者:
Themsaid\Multilingual\MultilingualServiceProvider::class
最后,发布配置文件:
php artisan vendor:publish
完成这些步骤后,你就可以开始使用了。
使用方法
数据库准备
为了存储JSON格式的翻译数据,你需要确保模型的可翻译字段类型为 text
或 json
。例如,在创建国家表的迁移文件时可以这样设置:
Schema::create('countries', function (Blueprint $table) {
$table->increments('id');
$table->json('name'); // 存储名称的翻译
});
模型配置
接下来,让模型具备多语言功能,你需要在模型类上加入 Translatable
特性,并指定哪些字段是可翻译的:
use Themsaid\Multilingual\Translatable;
class Country extends Model
{
use Translatable;
protected $table = 'countries';
public $translatable = ['name'];
public $casts = ['name' => 'array'];
}
注意到 $casts['name'] = 'array';
部分,这是用来确保从数据库取出的数据被正确解析为PHP数组。
创建与查询
现在你可以轻松创建和查询多语言模型了:
// 创建模型
Country::create(['name' => ['en' => "Spain", 'sp' => 'España']]);
// 查询并返回当前locale的名称
$country->name; // 根据应用的当前locale返回
// 获取特定locale的名称
$country->nameTranslations->en; // 返回英文名
// 获取所有翻译
$country->nameTranslations->toArray(); // 所有翻译的数组形式
验证与查询
对于验证,你可以利用 Laravel 5.2 引入的数组验证特性。此外,包内还包含了一个自定义规则 translatable_required
,确保所有的翻译都已提供:
Validator::make(
['name' => ['en'=>'One', 'sp'=>'Uno']],
['name' => 'translatable_required']
);
查询方面,如果你使用的是MySQL 5.7或更高版本,并且选择了json
数据类型,那么可以直接对翻译字段进行查询,如:
Company::where('name->en', 'Monsters Inc.')
->orderBy('specs->founded_at')
->get();
项目特点
- 简洁易用:无需额外的翻译表,直接在模型中管理多语言。
- 自动转换:根据应用的当前locale自动返回相应的翻译。
- 灵活性:支持直接使用
json
查询,使得检索更加灵活。 - 自定义验证:提供了
translatable_required
规则,方便对翻译字段进行验证。
总的来说,Laravel 5 Multilingual Models 提供了一种高效且直观的方式来实现模型的多语言功能,它简化了开发流程,提高了代码的可读性和可维护性。无论你是新项目启动还是现有项目的多语言升级,这个开源包都是一个值得尝试的选择。