roi-up-agency / laravel-translatable
一个特性,使Eloquent模型支持翻译
Requires
- php: ^7.1
- illuminate/database: ~5.7.0
- illuminate/support: ~5.7.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ~3.8.0|^4.0
- phpunit/phpunit: ^8.0
README
此包包含一个特性,使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'
安装
您可以通过composer安装此包
composer require spatie/laravel-translatable
如果您想设置另一个fallback_locale而不是应用fallback locale(参见config/app.php
),则可以发布配置文件
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']; }
可用方法
获取翻译
获取当前locale的翻译的最简单方法是直接获取翻译属性。例如(假设name
是一个可翻译属性)
$newsItem->name;
您也可以使用这个方法
public function getTranslation(string $attributeName, string $locale) : string
此函数有一个名为translate
的别名。
获取所有翻译
您可以通过调用getTranslations()
不带参数来获取所有翻译
$newsItem->getTranslations();
或者您可以使用访问器
$yourModel->translations
设置翻译
为当前locale设置翻译的最简单方法是直接设置可翻译属性的属性。例如(假设name
是一个可翻译属性)
$newsItem->name = 'New translation';
要为特定locale设置翻译,您可以使用此方法
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)
您可以为特定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
之后,将触发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::where('name->en', 'Name in English')->get();
变更日志
请参阅CHANGELOG以获取有关最近更改的更多信息。
升级
从v2到v3
在大多数情况下,您可以在不修改代码库的情况下升级。版本v3
在您的模型上引入了一个translations
访问器。如果您已经在模型上定义了一个,您需要将其重命名。
测试
composer test
贡献
有关详细信息,请参阅CONTRIBUTING。
安全性
如果您发现任何与安全相关的问题,请发送电子邮件至freek@spatie.be,而不是使用问题跟踪器。
Postcardware
您可以使用此包,但如果它进入您的生产环境,我们非常希望您能从家乡给我们寄一张明信片,注明您正在使用我们的哪个包。
我们的地址是:Spatie,Samberstraat 69D,2060 安特卫普,比利时。
我们将所有收到的明信片发布在我们的公司网站上。
鸣谢
我们从Mohamed Said那里得到了将翻译存储为json的想法。本说明书的部分内容来自他的多语言包的readme。
支持我们
Spatie是一家位于比利时的安特卫普网络设计公司。您可以在我们的网站上找到所有开源项目的概述在这里。
您的业务依赖于我们的贡献吗?在Patreon上联系我们并支持我们。所有承诺都将用于分配人员以维护和开发新功能。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。