Debian 系統 Locale 設定最佳實踐

Chris YuanChris Yuan
3 min read

前言

在 Debian 系統中設定 locale(語言環境)是一個看似簡單但實際上需要仔細考慮的任務。正確的 locale 設定不僅影響系統顯示的語言,還會影響日期格式、數字表示、貨幣符號等多個方面。本文將詳細介紹如何在 Debian 系統中正確設定 locale,特別是如何在不影響 SSH 遠端用戶的情況下設定系統預設語言。

Locale 基礎概念

什麼是 Locale?

Locale 是一組定義用戶語言環境的參數,包括:

  • 語言(如中文、英文、德文)
  • 地區(如台灣、美國、德國)
  • 字符編碼(如 UTF-8、ISO-8859-1)

主要的 Locale 環境變數

變數名稱功能說明
LANG預設的 locale 設定,當其他變數未設定時使用
LC_ALL覆蓋所有其他 locale 變數(除了 LANGUAGE)
LC_CTYPE字符分類和大小寫轉換
LC_NUMERIC數字格式
LC_TIME日期和時間格式
LC_COLLATE字串排序規則
LC_MONETARY貨幣格式
LC_MESSAGES系統訊息的語言
LC_PAPER預設紙張大小
LC_ADDRESS地址格式

傳統設定方式的問題

使用 /etc/default/locale 的限制

許多人會直接編輯 /etc/default/locale 來設定系統預設語言:

# /etc/default/locale
LANG=zh_TW.UTF-8

這種方式雖然簡單,但存在一個重要問題:它會強制覆蓋透過 SSH 連線的遠端用戶的 locale 設定

問題場景示例

假設您的伺服器預設語言是德文,但有來自不同國家的開發者透過 SSH 連線:

  1. 美國開發者希望看到英文介面
  2. 日本開發者希望看到日文介面
  3. 台灣開發者希望看到繁體中文介面

如果在 /etc/default/locale 中強制設定,所有人都會被迫使用德文介面,這顯然不夠友善。

推薦的設定方式

步驟一:安裝所需的 locale

首先,使用 dpkg-reconfigure locales 安裝需要的語言包:

sudo dpkg-reconfigure locales

在選單中選擇您需要的 locale,例如:

  • en_US.UTF-8
  • zh_TW.UTF-8
  • de_DE.UTF-8

當系統詢問預設 locale 時,選擇 None

步驟二:保持 /etc/default/locale 空白

確保 /etc/default/locale 檔案是空的或只包含註解:

# This file is intentionally left empty
# System-wide default locale is set in /etc/profile

步驟三:在 /etc/profile 中設定條件式預設值

編輯 /etc/profile 檔案,加入以下內容:

# Set system-wide default locale only if not already set
: "${LANG:=zh_TW.UTF-8}"; export LANG

如果您有使用 tcsh 或 csh 的用戶,還需要建立 /etc/csh/login.d/lang

if (! $?LANG) setenv LANG zh_TW.UTF-8

步驟四:設定 SSH 相關設定

確保 SSH 伺服器可以接受客戶端的 locale 設定:

# /etc/ssh/sshd_config
AcceptEnv LANG LC_*

同時確保 SSH 客戶端會傳送 locale 設定:

# /etc/ssh/ssh_config
SendEnv LANG LC_*

語法詳解

讓我們深入了解這行關鍵的設定:

: "${LANG:=zh_TW.UTF-8}"; export LANG

各部分說明

  1. : - 這是一個空命令(null command),不執行任何操作,但允許參數擴展發生

  2. ${LANG:=zh_TW.UTF-8} - 這是 Bash 的參數擴展語法:

    • 如果 LANG 已設定且非空,保持原值
    • 如果 LANG 未設定或為空,則賦值為 zh_TW.UTF-8
  3. export LANG - 將 LANG 匯出為環境變數,使子程序可以繼承

為什麼使用冒號命令?

使用 : 命令是因為我們只需要參數擴展的副作用(設定變數),而不需要使用擴展後的值。這是一種優雅且高效的寫法。

實際運作流程

本地登入用戶

  1. 用戶在本地終端機登入
  2. 系統執行 /etc/profile
  3. 檢查 LANG 變數 - 通常未設定
  4. 設定 LANG=zh_TW.UTF-8
  5. 用戶看到繁體中文介面

SSH 遠端用戶

  1. 用戶從遠端透過 SSH 連線
  2. SSH 客戶端傳送本地的 LANG 設定(例如 en_US.UTF-8
  3. SSH 伺服器接受此設定(透過 AcceptEnv
  4. 系統執行 /etc/profile
  5. 檢查 LANG 變數 - 已由 SSH 設定
  6. 保持原值不變
  7. 用戶看到英文介面

進階設定

混合使用不同的 locale 設定

有時您可能想要混合使用不同的 locale 設定,例如:

# 主要語言使用英文
: "${LANG:=en_US.UTF-8}"; export LANG

# 但日期格式使用台灣格式
: "${LC_TIME:=zh_TW.UTF-8}"; export LC_TIME

# 貨幣使用新台幣格式
: "${LC_MONETARY:=zh_TW.UTF-8}"; export LC_MONETARY

# 使用公制單位
: "${LC_MEASUREMENT:=zh_TW.UTF-8}"; export LC_MEASUREMENT

# 使用 A4 紙張大小
: "${LC_PAPER:=zh_TW.UTF-8}"; export LC_PAPER

為特定用戶設定不同的預設值

用戶可以在自己的 ~/.profile~/.bashrc 中覆蓋系統設定:

# ~/.profile
export LANG=ja_JP.UTF-8
export LC_MESSAGES=ja_JP.UTF-8

疑難排解

檢查目前的 locale 設定

# 顯示所有 locale 設定
locale

# 顯示可用的 locale
locale -a

# 顯示特定類別的設定
echo $LANG
echo $LC_TIME

常見問題

  1. 字符顯示亂碼

    • 確認終端機支援 UTF-8
    • 檢查字型是否包含所需字符
  2. SSH 連線後 locale 設定無效

    • 確認 SSH 伺服器的 AcceptEnv 設定
    • 確認客戶端的 SendEnv 設定
    • 檢查客戶端是否正確設定 locale
  3. 某些程式仍顯示英文

    • 確認該程式有安裝對應的語言包
    • 某些程式可能不支援特定語言

最佳實踐建議

  1. 使用 UTF-8 編碼:現代系統應該優先使用 UTF-8 編碼,避免使用舊的編碼如 ISO-8859-1
  2. 記錄設定理由:在設定檔中加入註解,說明為什麼選擇特定的設定方式
  3. 測試多種連線方式:確保本地登入、SSH、圖形介面登入都能正常運作
  4. 考慮用戶多樣性:如果系統有多國用戶,選擇較中性的預設語言(如英文)
  5. 定期更新語言包:隨著系統更新,記得更新語言包以獲得最新的翻譯

結論

正確設定 Debian 系統的 locale 需要平衡系統預設值和用戶個人偏好。透過在 /etc/profile 中使用條件式設定,我們可以為本地用戶提供合適的預設語言環境,同時保留遠端用戶自訂 locale 的彈性。這種方式不僅技術上優雅,更重要的是提供了更好的使用者體驗。

記住,好的系統設定應該是:

  • 為大多數情況提供合理的預設值
  • 允許個別用戶根據需求進行客製化
  • 不強制所有人使用相同的設定

透過本文介紹的方法,您可以建立一個既有統一預設值,又能滿足不同用戶需求的多語言 Debian 系統環境。

0
Subscribe to my newsletter

Read articles from Chris Yuan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Chris Yuan
Chris Yuan