ahmedash95/laravel-translatable

一个特性,使 Eloquent 模型支持翻译

1.1.4 2016-12-14 10:36 UTC

This package is auto-updated.

Last update: 2024-09-04 12:41:58 UTC


README

Latest Version on Packagist Software License Build Status SensioLabsInsight Quality Score StyleCI Total Downloads

此包包含一个特性,使 Eloquent 模型支持翻译。翻译存储为 json 格式。不需要额外的表来存储它们。

一旦特性安装到模型上,你可以做这些事情

$newsItem = new NewsItem; // This is an Eloquent model
$newsItem
   ->setTranslation('name', 'en', 'Name in English');
   ->setTranslation('name', 'nl', 'Naam in het Nederlands');
   ->save();
   
$newsItem->name; // Returns 'Name in English' given that the current app locale is 'en'
$newsItem->getTranslation('name', 'nl'); // returns 'Naam in het Nederlands'

app()->setLocale('nl');

$newsItem->name; // Returns 'Naam in het Nederlands'

Postcardware

你可以免费使用此包(它遵循 MIT 许可),但如果它进入你的生产环境,你必须向我们寄送一张来自你家乡的明信片,注明你正在使用我们哪个包。

我们的地址是:Spatie, Samberstraat 69D, 2060 安特卫普,比利时。

最好的明信片将在我们的网站上公开发布。

安装

您可以通过 composer 安装此包

composer require ahmedash95/laravel-translatable

接下来,必须注册服务提供者

// config/app.php
'providers' => [
    ...
    Spatie\Translatable\TranslatableServiceProvider::class,

];

如果您想更改回退区域设置,您必须发布配置文件

php artisan vendor:publish --provider="Spatie\Translatable\TranslatableServiceProvider"

这是发布文件的包含内容

return [
  'fallback_locale' => 'en',
];

使模型可翻译

使模型可翻译所需的步骤是

  • 首先,你需要添加 Spatie\Translatable\HasTranslations 特性。
  • 接下来,你应该创建一个公共属性 $translatable,它包含一个数组,包含你希望使可翻译的所有属性名称。
  • 最后,你应该确保所有可翻译属性都设置为你数据库中的 text 数据类型。如果你的数据库支持 json 列,请使用它。

以下是一个准备好的模型的示例

use Illuminate\Database\Eloquent\Model;
use Spatie\Translatable\HasTranslations;

class NewsItem extends Model
{
    use HasTranslations;
    
    public $translatable = ['name'];
}

可用方法

获取翻译

获取当前区域设置的翻译的最简单方法就是直接获取翻译属性的属性。例如(假设 name 是可翻译属性)

$newsItem->name;

你也可以使用这个方法

public function getTranslation(string $attributeName, string $locale) : string

这个函数有一个别名叫做 translate

设置翻译

public function setTranslation(string $attributeName, string $locale, string $value)

忘记翻译

public function forgetTranslation(string $attributeName, string $locale)

一次性获取所有翻译

public function getTranslations(string $attributeName) : array

一次性设置翻译

public function setTranslations(string $attributeName, array $translations)

以下是一个示例

$translations = [
   'en' => 'Name in English',
   'nl' => 'Naam in het Nederlands'
];

$newsItem->setTranslations('name', $translations);

事件

TranslationHasBeenSet

在调用 setTranslation 后,将触发 Spatie\Translatable\Events\TranslationHasBeenSet 事件。

它具有以下属性

/** @var \Illuminate\Database\Eloquent\Model */
public $model;

/** @var string  */
public $attributeName;

/** @var string  */
public $locale;

public $oldValue;
public $newValue;

创建模型

在创建模型时立即设置翻译。以下是一个示例

NewsItem::create([
   'name' => [
      'en' => 'Name in English'
      'nl' => 'Naam in het Nederlands'
   ],
]);

查询可翻译属性

如果你使用 MySQL 5.7 或更高版本,建议你使用 json 数据类型在数据库中存储翻译。这将允许你像这样查询这些列

NewsItem::whereRaw('name->"$.en" = \'Name in English\'')->get();

在 laravel 5.2.23 及以上版本中,你可以使用流畅语法

NewsItem::where('name->en', 'Name in English')->get();

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

测试

$ composer test

贡献

有关详细信息,请参阅 CONTRIBUTING

安全

如果你发现任何与安全相关的问题,请通过电子邮件 freek@spatie.be 而不是使用问题跟踪器。

鸣谢

我们从Mohamed Said那里得到了将翻译存储为JSON格式的想法,并将其保存在一列中的想法。本说明书的部分内容采用了他的多语言包的readme文件

关于Spatie

Spatie是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述:我们的开源项目

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件