Laravel是一款流行的PHP Web應用程式框架,它提供了一套強大、優雅和簡單的語法,使得Web應用程式的開發和維護更加容易和愉快。 Laravel提供了許多有用的功能,其中之一就是內建支援多語言應用程式的開發。在本文中,我們將探討Laravel如何實作資料庫多語言。
在Laravel中,國際化和在地化是兩個基本概念。國際化是指將應用程式設計成能夠支援多種語言和文化習慣,而在地化則是指將應用程式針對某個特定的地方進行適應性的修改。 Laravel內建了一些工具和類,可以幫助我們實現i18n和l10n。
實作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欄位分別儲存了英文和中文的產品描述。
接下來,我們需要針對這些表格進行一些改動,使其支援多語言:
protected $middleware = [ ... \App\Http\Middleware\SetLanguage::class, ];
<?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參數,設定目前使用的語言。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Language extends Model { protected $table = 'languages'; public $timestamps = false; public static function getDefault() { return self::where('is_default', true)->first(); } public static function getCurrent() { $code = app()->getLocale(); return self::where('code', $code)->first(); } }
這個模型用來取得目前使用的語言資訊、預設語言資訊等等。
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'; }
這個方法用於取得目前使用語言所對應的字段,例如:如果目前使用的是中文,而此模型對應的是英文的產品名稱,則傳回產品名稱所對應的中文欄位。
<h1>{{ $product->localized }}</h1>
這個語句會自動根據目前使用的語言,取得對應語言的產品名稱。
至此,我們已經完成了Laravel資料庫多語言的實現,可以輕鬆的製作出多語言的網路應用程式。
以上是探討Laravel如何實作資料庫多語言的詳細內容。更多資訊請關注PHP中文網其他相關文章!