欢迎各位兄弟 发布技术文章
这里的技术是共享的
您是否知道世界上有几个国家/地区拥有多种官方语言?例如,我的祖国比利时有三个; 法语,荷兰语和德语。大多数比利时人也说英语。
Laravel的Eloquent ORM是Laravel非常强大的一部分。不幸的是,它不支持开箱即用的多语言模型。自己添加这些功能并不困难。
首先让我们看一下没有多语言支持的迁移:
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('text');
$table->timestamps();
});
通过添加特定语言的列,我们可以轻松地使表格包含多种语言:
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->string('name_en');
$table->text('text_en');
$table->string('name_fr');
$table->text('text_fr');
$table->boolean('online');
$table->timestamps();
});
现在,该表支持以英语和法语存储文本。但是,这种方法有一个明显的缺点:每次要添加对新语言的支持时,您都需要通过多语言支持向每个表添加字段。当语言开始增长或者你有许多多语言表时,这非常麻烦。
更好的方法是将必须转换的字段分隔到另一个表中。
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->boolean('online');
$table->timestamps();
});
Schema::create('article_translations', function (Blueprint $table) {
$table->increments('id');
$table->integer('article_id')->unsigned();
$table->string('locale')->index();
$table->string('name');
$table->text('text');
$table->unique(['article_id','locale']);
$table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
});
使用此迁移,当您的应用程序需要支持额外的语言时,您无需创建额外的字段。
在locale
-场被用来确定存储记录的语言。在本文的下一个示例中,我们将在此字段中存储iso代码。
添加带有级联删除的外键将确保当articles
-table中的记录被删除时,它的相应翻译也将被删除。
好的,现在数据库已准备好存储可翻译的内容,让我们考虑一下我们如何使用它。
$frenchText = $article->getTranslation('fr')->text;
这很好看,可读。我们可以做得更好。如果文章模型在应用程序的语言环境为法语时返回文本的法语翻译,那将非常有用:
app()->setLocale('fr');
$frenchText = $article->text;
这将使得可翻译数据的处理变得更加容易。考虑这个小视图:
The article with title {{ $article->title }} is {{ $this->online ? 'online' : 'offline' }}.
请注意,使用翻译字段和非翻译字段没有任何区别。太好了!
您可以创建自己允许这种行为的函数,但是Dimitris Savvopoulos创建了一个名为laravel-translatable的软件包,可以完成所有这些工作。我在每个项目上都使用它。
后安装服务提供商必须更新你的模型使用Translatable
-trait。该模型还应该有一个$translatableAttributes
包含数组的-property,其中包含可以翻译的字段名称:
// app/Article.php
class Article extends Model
{
use \Dimsav\Translatable\Translatable;
public $translatedAttributes = ['name', 'text'];
...
}
// app/ArticleTranslation.php
class ArticleTranslation extends Model
{
public $timestamps = false;
...
}
现在所有设置都已完成,我们可以存储一些新的可翻译文章。如果您正在跟随,只需将此路线添加到您的Laravel应用程序即可。
Route::get('create', function($locale) {
$article = new Article();
$article->online = true;
$article->save();
foreach (['en', 'nl', 'fr', 'de'] as $locale) {
$article->translateOrNew($locale)->name = "Title {$locale}";
$article->translateOrNew($locale)->text = "Text {$locale}";
}
$article->save();
echo 'Created an article with some translations!';
});
当您浏览到'/ create'后查看数据库时,您会看到articles
-table包含一条记录。本article_translations
-表包含三个记录:一个是在上面的例子中各个地区。
现在让我们检索翻译。将此路线添加到您的Laravel应用程序:
Route::get('{locale}', function($locale) {
app()->setLocale($locale);
$article = Article::first();
return view('article')->with(compact('article'));
});
添加article.blade.php
带有此内容的-view:
<h1>{{ $article->name }}</h1>
{{ $article->text }}
当您浏览到'/ en'时,您将看到该文章的英文翻译。浏览到'/ nl','/ fr'或'/ de'以查看这些区域设置的本地化文章。
恭喜!您现在已经学会了如何为Eloquent模型添加多语言支持。我在GitHub上创建了一个包含这篇文章所有例子的存储库。如果您想了解更多,我建议您阅读Dimitris包装自述文件中的示例。仍然渴望获得更多知识?在GitHub上潜入他的包裹代码。这并不难,你会从中学到很多东西。
没有垃圾邮件,永远。我们永远不会分享您的电子邮件地址,您可以随时选择退出。
来自 https://laravel-news.com/how-to-add-multilingual-support-to-eloquent