Laravel 多語言站點

目的

實現(xiàn)多語言站點的開發(fā),用戶根據(jù)訪問 /en、/zh-CN 等瀏覽不同語言的站點。

開發(fā)工具

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

安裝完成上述工具后,進行開發(fā)。

步驟

修改 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');
        });
    }
}

添加語言翻譯包

對于我們站點里的靜態(tài)內(nèi)容,我們可以通過在 resources/lang 下面添加指定語言包,使用 trans('指定名稱') 來進行翻譯,詳情請見 文檔

至此,我們可以通過訪問 /en、/zh-CN 瀏覽指定語言的站點了。但是,我們應(yīng)該發(fā)現(xiàn),對于我們在數(shù)據(jù)庫里讀取的數(shù)據(jù)并沒有發(fā)生改變

創(chuàng)建模型及遷移

現(xiàn)在是 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 設(shè)置要翻譯的字段

遷移
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 表中必須包含對應(yīng)表的關(guān)聯(lián) ID *_id、區(qū)域標識 locale及要翻譯的字段等

其他

在每次創(chuàng)建模型記錄時,使用模型的 translateOrNew() 方法添加翻譯內(nèi)容,如:

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

在每次讀取模型數(shù)據(jù)時,直接讀取就可以了,其他工作 dimsav/laravel-translatable 包已經(jīng)做了。


參考文獻

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,719評論 0 121
  • 必備品文檔:DocumentationAPI: API Reference視頻:Laracasts速查表:Lara...
    ethanzhang閱讀 5,888評論 0 68
  • Laravel 學(xué)習(xí)交流 QQ 群:375462817 本文檔前言Laravel 文檔寫的很好,只是新手看起來會有...
    Leonzai閱讀 8,721評論 2 12
  • 想必大家衣櫥中至少都有一條白褲子吧,覺得難搭配,覺得不耐臟,很多MM都把他們壓箱底了!跟著MemoryNotes一...
    MemoryChan閱讀 480評論 0 0
  • 蝦,第一印象就是齊白石畫的蝦,寥寥數(shù)筆,卻活靈活現(xiàn)。在淡水中,穿著透明盔甲,輕輕舞動,撈上來卻是活蹦亂跳。 吃蝦,...
    竹影燈閱讀 551評論 0 1

友情鏈接更多精彩內(nèi)容