國際化是指軟體在設計架構上支援多語言擴展特性,功能與代碼設計不針對特定語言或地區。核心工具鏈為 GNU gettext 工具組。
需包含標準頭文件,主函數呼叫關鍵函數:
#include <stdio.h>
#include <locale.h>
#include <libintl.h>
#include <stdlib.h>
#define _(String) gettext(String)
int main(int argc, char **argv) {
setlocale(LC_ALL, "");
bindtextdomain("gettext", ".");
textdomain("gettext");
printf("%s\n", _("one world, one dream!"));
return 0;
}
gcc -o gettext gettext.c
xgettext --keyword=_ gettext.c -o gettext.pot
cp gettext.pot gettext.po
每種語言對應一個 .po 檔案,包含 msgid (原文) 和 msgstr (譯文) 配對。
gedit gettext.po # 或 vim
關鍵:必須將 charset 設為 UTF-8,否則會出現編碼警告。
msgfmt gettext.po -o gettext.mo
預設目錄:/usr/share/locale。範例中因 setlocale() 設定當前目錄,需建立:
mkdir -p zh_CN/LC_MESSAGES en_US/LC_MESSAGES
cp gettext.mo zh_CN/LC_MESSAGES/
cp gettext_en.mo en_US/LC_MESSAGES/
export LANG=zh_CN.UTF-8
# 或
export LANG=en_US.UTF-8
./gettext
當原始碼修改後,如何保留既有翻譯並同步新增內容?
xgettext 產生新 .pot.po:mv gettext.po old_gettext.pomsgmerge old_gettext.po gettext.pot --output-file gettext.podiff -u old_gettext.po gettext.po > old_gettext.diffrm -f old_gettext.po| 問題 | 原因 | 解決 |
|---|---|---|
| 翻譯不生效 | setlocale() 與 .mo 目錄結構不一致 | 確保 setlocale(LC_ALL, "") 與目錄結構一致 |
| 編碼警告 | .po 中 charset 非 UTF-8 | 編輯 .po 將 charset 改為 UTF-8 |
| 多語言切換失效 | 環境變數切換但 .mo 未對應部署 | 每種語言獨立 .po/.mo 部署到對應目錄 |
| 修改不生效 | 舊執行檔殘留 | 重新編譯前刪除舊執行檔 |
setlocale(LC_ALL, ""):依環境變數設定當前地區bindtextdomain("domain", "/path"):綁定翻譯域與路徑textdomain("domain"):設定當前翻譯域gettext("string"):查詢翻譯,未找到回傳原文_() 巨集:簡化 gettext() 呼叫,兼容 xgettext 提取打造Windows風格Linux桌面:KDE XP主題完整安裝指南
五大 Linux 效能診斷指令:top、vmstat、iostat、sar、pidstat 實戰解析
Linux /boot 分區空間不足?三步驟清理舊核心釋放空間完整教學
Linux 下 Taylor UUCP 完整配置指南:從撥號連線到安全權限的深度實踐
awk 運算符完整分類:算術、賦值、關係、邏輯、正則與特殊運算符詳解
Linux C/C++ 開發工具鏈全景:GCC、GDB、xxgdb、calls、calltree、cproto、indent、gprof 實戰指南