themsaid / laravel-multilingual
简易多语言 Laravel 模型
Requires
- php: >=5.3.0
- illuminate/support: ~5.1
Requires (Dev)
- orchestra/testbench: ~3.0
- phpunit/phpunit: 4.*
This package is auto-updated.
Last update: 2020-05-27 03:50:50 UTC
README
此 Laravel 包可以使 Eloquent 模型属性可翻译,无需为翻译值分离数据库表。
您只需调用 $country->name
,即可根据应用程序的当前区域获取值。
您也可以调用 $country->nameTranslations->en
来获取特定区域的值。
您可以通过 $country->nameTranslations->toArray()
简单地检查给定属性的翻译。
安装
首先通过 Composer 安装包。在您的终端运行以下命令
composer require themsaid/laravel-multilingual
Composer 完成后,将包服务提供者在 config/app.php
中的 providers 数组中添加
Themsaid\Multilingual\MultilingualServiceProvider::class
最后发布配置文件
php artisan vendor:publish
这样就完成了,现在您可以继续操作。
使用方法
首先,请确保可翻译属性具有 mysql 字段类型为 text 或 json,如果您正在从迁移文件构建数据库,您可能这样做
<?php Schema::create('countries', function (Blueprint $table) { $table->increments('id'); $table->json('name'); });
现在,您已经准备好了数据库来保存 JSON 字符串,您需要准备您的模型
<?php class Country extends Model { use Themsaid\Multilingual\Translatable; protected $table = 'countries'; public $translatable = ['name']; public $casts = ['name' => 'array']; }
- 将
Translatable
特性添加到您的模型类中 - 添加一个公共类属性
$translatable
,它是一个数组,包含您模型中可翻译字段的名称。 - 请记住,在模型的
$casts
属性中将可翻译属性转换为 'array'。
现在我们的模型具有可翻译的 name
属性,因此,在创建新模型时,您可以指定如下名称字段
<?php Country::create([ 'name' => [ 'en' => "Spain", 'sp' => 'España' ] ]);
它将被自动转换为 JSON 字符串并保存到数据库的名称字段中,您稍后可以像这样检索名称
$country->name
这将返回基于当前区域的国家名称,如果当前区域没有值,则将使用配置文件中定义的 fallback_locale
。
如果没有找到任何内容,将返回空字符串。
您还可以使用以下语法返回特定区域的值
$country->nameTranslations->en
这将返回国家的英文名称。
要返回所有可用翻译的数组,您可以
$country->nameTranslations->toArray()
验证
您可以使用 Laravel 5.2 随之发布的新的数组验证功能来验证特定区域的必要性
<?php $validator = Validator::make( ['name' => ['en'=>'One', 'sp'=>'Uno']], ['name.en' => 'required'] );
但是,此包中包含一个处理要求所有验证都提供的验证规则
<?php $validator = Validator::make( ['name' => ['en'=>'One', 'sp'=>'Uno']], ['name' => 'translatable_required'] );
translatable_required
规则将确保所有可用区域的值都设置。
您可以从包配置文件中定义可用区域以及 fallback_locale
。
现在,您只需要添加我们的新验证规则翻译消息,将其添加到 validation.php
翻译文件中
'translatable_required' => 'The :attribute translations must be provided.',
查询
如果您正在使用MySQL 5.7及以上版本,建议您在数据库中使用json数据类型来存储翻译,这将允许您这样查询这些列:
Company::whereRaw('name->"$.en" = \'Monsters Inc.\'')->orderByRaw('specs->"$.founded_at"')->get();
然而,在Laravel 5.2.23及以上版本中,您可以使用流畅语法。
Company::where('name->en', 'Monsters Inc.')->orderBy('specs->founded_at')->get();