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

PHP gettext 多語系國際化(i18n)完整實作教學

     編輯:PHP 綜合知識

工具鏈

  • xgettext:從原始碼萃取字串 → .pot(範本)
  • msginit:依 .pot 建立語系 .po(翻譯檔)
  • msgfmt:編譯 .po → .mo(二進位,給程式讀取)
  • gettext / _():執行時翻譯

步驟實作

1. 原始碼標記可翻譯字串

<?php
// home.php
$str = _('home'); // 或 gettext('home')
echo "<a href='#'>{$str}</a>";

2. 產生 .pot 範本

xgettext -a home.php -o home.pot

產生 home.pot,包含 msgid "home" 待翻譯。

3. 建立語系 .po 檔

export LANG=zh_TW.UTF-8
msginit -l zh_TW.UTF-8 -i home.pot

產生 zh_TW.po,編輯 msgstr "首頁"。

4. 編譯 .mo 二進位檔

msgfmt zh_TW.po -o zh_TW.mo

5. 部署 .mo 到正確路徑

mkdir -p locale/zh_TW/LC_MESSAGES
cp zh_TW.mo locale/zh_TW/LC_MESSAGES/home.mo

6. PHP 程式設定語系與域

<?php
putenv('LANG=zh_TW.UTF-8');
setlocale(LC_ALL, 'zh_TW.UTF-8');

bindtextdomain('home', './locale');  // 指定 .mo 根目錄
textdomain('home');                  // 設定預設域

echo _("home"); // 輸出:首頁

目錄結構

project/
├── home.php
├── locale/
│   ├── zh_TW/
│   │   └── LC_MESSAGES/
│   │       └── home.mo
│   ├── en_US/
│   │   └── LC_MESSAGES/
│   │       └── home.mo
│   └── ja_JP/
│       └── LC_MESSAGES/
│           └── home.mo

切換語系

<?php
$lang = $_GET['lang'] ?? 'zh_TW';
putenv("LANG={$lang}");
setlocale(LC_ALL, $lang);
bindtextdomain('home', './locale');
textdomain('home');

常見問題

問題解決
翻譯不生效檢查 setlocale 系統支援、.mo 路徑、textdomain 名稱
中文亂碼確保 .po 為 UTF-8、PHP 檔案 UTF-8、bind_textdomain_codeset('home', 'UTF-8')
Apache 需重啟gettext 快取機制,修改 .mo 後需 apachectl graceful 或重啟 php-fpm
Windows 環境需安裝 gettext 擴展,setlocale 行為不同

進階:複數形式


// .po
msgid "%d file"
msgid_plural "%d files"
msgstr[0] "%d 個檔案"
msgstr[1] "%d 個檔案"  // 中文無複數變化

// PHP
echo ngettext("%d file", "%d files", $count);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved