themsaid/laravel-multilingual

此包已废弃且不再维护。未建议替换包。

简易多语言 Laravel 模型

v1.0.2 2017-08-16 16:11 UTC

This package is auto-updated.

Last update: 2020-05-27 03:50:50 UTC


README

Latest Version on Packagist Software License Total Downloads

此 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();