systemovich / laravel-translatable
一个使Eloquent模型支持多语言翻译的特性
Requires
- php: ^5.6|^7.0
- illuminate/database: ~5.2.0|~5.3.0|~5.4.0
- illuminate/support: ~5.2.0|~5.3.0|~5.4.0
Requires (Dev)
- mockery/mockery: ^0.9.4
- orchestra/testbench: ~3.3.0|~3.4.0
- phpunit/phpunit: 5.*
README
分支: 此软件包是从spatie/laravel-translatable分叉而来,以便与PHP 5.6兼容。这排除了测试代码。
使Eloquent模型可翻译的特性
此软件包包含一个特性,可以使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'
明信片软件
您可以使用此软件包(它是MIT许可),但如果它进入您的生产环境,我们非常欢迎您从您家乡寄给我们一张明信片,说明您正在使用我们的哪些软件包。
我们的地址是:Spatie,Samberstraat 69D,2060 安特卫普,比利时。
所有明信片都发表在我们的网站上。
安装
您可以通过composer安装此软件包
composer require spatie/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)
要实际保存翻译,不要忘记保存您的模型。
$newsItem->setTranslation('name', 'en', 'Updated name in English'); $newsItem->save();
忘记翻译
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();
更新日志
请参阅 更新日志 以获取有关最近更改的更多信息。
测试
$ composer test
贡献
请参阅 贡献指南 获取详细信息。
安全
如果您发现任何安全相关的问题,请通过电子邮件 freek@spatie.be 而不是使用问题跟踪器。
鸣谢
我们从 Mohamed Said 那里得到了将翻译作为 json 存储在列中的想法。本说明书中使用了 他的多语言包 的部分说明。
关于 Spatie
Spatie 是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到我们所有开源项目的概述 在这里。
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。