欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

如何为Eloquent添加多语言支持 有大用 有大大用

如何为Eloquent添加多语言支持    

           
2016年8月4日 FREEK VAN DER HERTEN            


您是否知道世界上有几个国家/地区拥有多种官方语言?例如,我的祖国比利时有三个; 法语,荷兰语和德语。大多数比利时人也说英语。

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上潜入他的包裹代码。这并不难,你会从中学到很多东西。



提起: Laravel教程 雄辩 翻译


享受这种?每周日将Laravel News直接发送到您的收件箱。    

没有垃圾邮件,永远。我们永远不会分享您的电子邮件地址,您可以随时选择退出。    

来自  https://laravel-news.com/how-to-add-multilingual-support-to-eloquent

普通分类: