solutionforest/laravel-translatable

一个特质,使 Eloquent 模型能够包含翻译

6.0.1 2023-08-25 03:23 UTC

README

Latest Version on Packagist MIT Licensed Total Downloads

此包包含一个特质,使 Eloquent 模型可翻译。翻译存储在数据库中。所有翻译都将默认通过 Laravel 缓存。

此库是从 spatie/laravel-translatable 分支出来的

技术上,所有方法都是相同的。仅使用数据库作为存储。

一旦特质安装到模型上,您就可以执行以下操作

$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'

安装

您可以通过 composer 安装此包

composer require solutionforest/laravel-translatable

使模型可翻译

使模型可翻译所需的步骤

  • 首先,使用 php artisian migrate 迁移表
  • 接下来,您需要添加 SolutionForest\Translatable\HasTranslations 特质。
  • 接下来,您应该创建一个公共属性 $translatable,它包含您希望使其可翻译的所有属性名称的数组。

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

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

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

可用方法

获取翻译

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

$newsItem->name;

您也可以使用此方法

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

此函数还有一个名为 translate 的别名。

获取所有翻译

您可以通过调用 getTranslations() 获取所有翻译,不带任何参数

$newsItem->getTranslations();

或者您可以使用访问器

$yourModel->translations

设置翻译

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

$newsItem->name = 'New translation';

要为特定区域设置设置翻译,您可以使用此方法

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

要实际保存翻译,别忘了保存您的模型。

$newsItem->setTranslation('name', 'en', 'Updated name in English');

$newsItem->save();

验证

  • 如果您想在保存/更新数据库之前验证属性的唯一性,您可能需要查看 laravel-unique-translation,它专门为 laravel-translatable 制作。

忘记翻译

您可以忘记特定字段的翻译

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

您可以忘记特定区域的全部翻译

public function forgetAllTranslations(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 后,将触发 SolutionForest\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'
   ],
]);

更改日志

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

测试

composer test

贡献

有关详细信息,请参阅 CONTRIBUTING

安全性

如果您发现任何安全问题,请通过电子邮件 alan@solutionforest.net 而不是使用问题跟踪器。

鸣谢

我们从Mohamed Said那里得到了将翻译存储为json格式的列的想法。本说明书的部分内容使用了他的多语言包的readme。

支持我们

SolutionForest是一家位于香港的解决方案公司。请访问我们的网站

许可证

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