首頁  >  文章  >  php框架  >  探討Laravel如何實作資料庫多語言

探討Laravel如何實作資料庫多語言

PHPz
PHPz原創
2023-04-10 14:16:23959瀏覽

Laravel是一款流行的PHP Web應用程式框架,它提供了一套強大、優雅和簡單的語法,使得Web應用程式的開發和維護更加容易和愉快。 Laravel提供了許多有用的功能,其中之一就是內建支援多語言應用程式的開發。在本文中,我們將探討Laravel如何實作資料庫多語言。

  1. Laravel中的國際化(i18n)與在地化(l10n)

在Laravel中,國際化和在地化是兩個基本概念。國際化是指將應用程式設計成能夠支援多種語言和文化習慣,而在地化則是指將應用程式針對某個特定的地方進行適應性的修改。 Laravel內建了一些工具和類,可以幫助我們實現i18n和l10n。

  1. Laravel多語言的實作方式

實作Laravel多語言應用程式的方式有很多種,我們將介紹其中一種實作方法,即使用資料庫實作多語言。

首先,在資料庫中建立一個表,用於儲存系統支援的多種語言,例如:

CREATE TABLE `languages` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `code` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
  `is_default` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

這個表中,name欄位儲存了語言名稱,code欄位儲存了語言程式碼(如en、zh等),is_default欄位指定了預設語言。

然後,在需要多語言支援的表中添加多個字段,分別對應不同語言的文本,例如:

CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name_en` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `name_zh` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `description_en` text COLLATE utf8mb4_unicode_ci,
  `description_zh` text COLLATE utf8mb4_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

這個表中,name_en和name_zh字段分別存儲了英文和中文的產品名稱,description_en和description_zh欄位分別儲存了英文和中文的產品描述。

接下來,我們需要針對這些表格進行一些改動,使其支援多語言:

  1. 在app/Http/Kernel.php檔案中,註冊一個中間件,用於動態設定目前使用的語言:
protected $middleware = [
    ...
    \App\Http\Middleware\SetLanguage::class,
];
  1. 建立一個SetLanguage中間件:
<?php

namespace App\Http\Middleware;

use Closure;
use App;

class SetLanguage
{
    public function handle($request, Closure $next)
    {
        $language = $request->get('lang', '');
        if ($language != '') {
            App::setLocale($language);
        }
        return $next($request);
    }
}

這個中間件的作用是從請求參數中取得lang參數,設定目前使用的語言。

  1. 建立一個Language模型:
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Language extends Model
{
    protected $table = &#39;languages&#39;;
    public $timestamps = false;

    public static function getDefault()
    {
        return self::where(&#39;is_default&#39;, true)->first();
    }

    public static function getCurrent()
    {
        $code = app()->getLocale();
        return self::where('code', $code)->first();
    }
}

這個模型用來取得目前使用的語言資訊、預設語言資訊等等。

  1. 在Model中建立一個getLocalizedAttribute方法:
public function getLocalizedAttribute($value)
{
    $lang = Language::getCurrent();
    $field = $this->getLocalizedFieldName($lang->code);
    return $this->$field;
}

protected function getLocalizedFieldName($langCode)
{
    $fallback = $this->getDefaultFieldName();
    return "{$this->$fallback}_{$langCode}";
}

protected function getDefaultFieldName()
{
    return 'name_en';
}

這個方法用於取得目前使用語言所對應的字段,例如:如果目前使用的是中文,而此模型對應的是英文的產品名稱,則傳回產品名稱所對應的中文欄位。

  1. 在Blade範本檔案中,可以這樣使用多語言字串:
<h1>{{ $product->localized }}</h1>

這個語句會自動根據目前使用的語言,取得對應語言的產品名稱。

至此,我們已經完成了Laravel資料庫多語言的實現,可以輕鬆的製作出多語言的網路應用程式。

以上是探討Laravel如何實作資料庫多語言的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn