Laravel 多语言站点

目的

实现多语言站点的开发,用户根据访问 /en/zh-CN 等浏览不同语言的站点。

开发工具

  • Laravel 5.5.* URL
  • dimsav/laravel-translatable 8.* URL

安装完成上述工具后,进行开发。

步骤

修改 translatable.php 配置文件

translatable.php 文件 locales 中修改站点语言:

'locales' => [
    'en',
    'zh-CN',
],

修改 RouteServiceProvider.php 文件

public function map(Request $request)
{
    $locale = $request->segment(1);
    $this->app->setLocale($locale);
    
    $this->mapApiRoutes();
    
    $this->mapWebRoutes($locale);
    
}

protected function mapWebRoutes($locale)
{
    if (in_array($locale, $this->app->config->get('translatable.locales'))) {
        Route::group([
            'middleware' => 'web',
            'prefix' => $locale,
            'namespace' => $this->namespace,
        ], function ($router) {
            require base_path('routes/web.php');
        });
    } else {
        Route::group([
            'middleware' => 'web',
            'namespace' => $this->namespace,
        ], function ($router) {
            require base_path('routes/web.php');
        });
    }
}

添加语言翻译包

对于我们站点里的静态内容,我们可以通过在 resources/lang 下面添加指定语言包,使用 trans('指定名称') 来进行翻译,详情请见 文档

至此,我们可以通过访问 /en/zh-CN 浏览指定语言的站点了。但是,我们应该发现,对于我们在数据库里读取的数据并没有发生改变

创建模型及迁移

现在是 dimsav/laravel-translatable 包大展身手的时候了

模型
// Article 模型
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Dimsav\Translatable\Translatable;

class Article extends Model
{
    use Translatable; // 引入 Translatable Trait(前提安装dimsav/laravel-translatable)

    public $translatedAttributes = ['name', 'text'];
    
    protected $guarded = ['id'];
}

// ArticleTranslation 模型
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ArticleTranslation extends Model
{
    public $timestamps = false;
    protected $guarded = ['id'];
}

NOTE: 其中 $translatedAttributes 设置要翻译的字段

迁移
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');
});

NOTE: 其中 *_translations 表中必须包含对应表的关联 ID *_id、区域标识 locale及要翻译的字段等

其他

在每次创建模型记录时,使用模型的 translateOrNew() 方法添加翻译内容,如:

$article->translateOrNew('zh-CN')->name = "中文";

在每次读取模型数据时,直接读取就可以了,其他工作 dimsav/laravel-translatable 包已经做了。


参考文献

原文链接

推荐阅读更多精彩内容

  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 5,995评论 1 115
  • 必备品文档:DocumentationAPI: API Reference视频:Laracasts速查表:Lara...
    ethanzhang阅读 4,581评论 0 66
  • Laravel 学习交流 QQ 群:375462817 本文档前言Laravel 文档写的很好,只是新手看起来会有...
    Leonzai阅读 2,488评论 2 12
  • 想必大家衣橱中至少都有一条白裤子吧,觉得难搭配,觉得不耐脏,很多MM都把他们压箱底了!跟着MemoryNotes一...
    MemoryChan阅读 58评论 0 0
  • 虾,第一印象就是齐白石画的虾,寥寥数笔,却活灵活现。在淡水中,穿着透明盔甲,轻轻舞动,捞上来却是活蹦乱跳。 吃虾,...
    坂上流云阅读 76评论 0 0