首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

CodeIgniter 多語言自動切換:依瀏覽器語言偏好載入語言包

     編輯:PHP 綜合知識

CodeIgniter 內建語言類別支援多語系,結合 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 可實現根據瀏覽器語言偏好自動載入對應語言包。

語言包檔案結構

application/language/
├── english/
│   └── bm_lang.php
├── zh-cn/
│   └── bm_lang.php
├── zh-tw/
│   └── bm_lang.php
└── jp/
    └── bm_lang.php

語言包範例

<?php
// english/bm_lang.php
$lang['title'] = 'Welcome';
$lang['login'] = 'Login';
$lang['register'] = 'Register';

// zh-cn/bm_lang.php
$lang['title'] = '歡迎光臨';
$lang['login'] = '登入';
$lang['register'] = '註冊';

控制器自動切換實作

<?php
class Welcome extends CI_Controller {
    public function index() {
        $this->load->helper('language');

        // 1. 解析瀏覽器語言偏好
        $acceptLang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'en';
        $langs = explode(',', $acceptLang);
        $primary = strtolower(trim($langs[0])); // 如 en-us, zh-cn, zh-tw

        // 2. 對應 CodeIgniter 語言目錄名稱
        $langMap = [
            'en'     => 'english',
            'en-us'  => 'english',
            'en-gb'  => 'english',
            'zh'     => 'zh-cn',
            'zh-cn'  => 'zh-cn',
            'zh-tw'  => 'zh-tw',
            'zh-hk'  => 'zh-tw',
            'ja'     => 'japanese',
            'ja-jp'  => 'japanese',
            'ko'     => 'korean',
            'ko-kr'  => 'korean',
        ];
        $ciLang = $langMap[$primary] ?? 'english';

        // 3. 設定配置並載入語言包
        $this->config->set_item('language', $ciLang);
        $this->lang->load('bm', $ciLang); // 載入 bm_lang.php

        // 4. 使用
        $data['title'] = $this->lang->line('title');
        $data['login'] = $this->lang->line('login');

        $this->load->view('welcome', $data);
    }
}
?>

視圖檔案

<!DOCTYPE html>
<html lang="<?= $this->config->item('language') ?>">
<head><title><?= $title ?></title></head>
<body>
    <h1><?= $title ?></h1>
    <a href="/login"><?= $login ?></a>
    <a href="/register"><?= $this->lang->line('register') ?></a>
</body>
</html>

進階:支援手動切換並記住偏好

public function set_lang($lang = 'english') {
    $allowed = ['english', 'zh-cn', 'zh-tw', 'japanese'];
    if (!in_array($lang, $allowed)) $lang = 'english';

    // 寫入 Cookie(1 年)
    $this->input->set_cookie('lang_pref', $lang, 31536000);

    // 重導回來源頁
    redirect($this->input->server('HTTP_REFERER') ?? '/');
}

// 在 index() 最開頭優先讀取 Cookie
$cookieLang = $this->input->cookie('lang_pref');
if ($cookieLang && in_array($cookieLang, $allowed)) {
    $ciLang = $cookieLang;
} else {
    // 否則依瀏覽器語言
    // ... 上述自動偵測邏輯
}

語言類別關鍵方法

方法用途
$this->lang->load('file', 'lang')載入語言檔(file_lang.php)
$this->lang->line('key')取得翻譯字串
$this->lang->line('key', true)若無翻譯回傳 false 而非原鍵名
lang('key')Helper 函數(需 $this->load->helper('language'))

最佳實踐建議

  • 語言檔命名:模組名_lang.php,避免衝突
  • 預設語言:config.php 設定 $config['language'] = 'english';
  • 瀏覽器語言不可靠:用戶可修改、代理伺服器可能過濾,務必提供手動切換
  • URL 包含語言代碼:/en/, /zh/ 有利 SEO 與快取
  • 大型專案:考慮 Gettext (.po/.mo) 格式 + 工具翻譯流程

自動語言偵測 + 手動偏好記住 = 完整的多語系體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved