linux setlocale用法

linux setlocale用法


頭文件與聲明如下:

1 #include <locale.h> 

2 char* setlocale(int category, const char* locale);

說明:

category:爲locale分類,表達一種locale的領域方面,

通常有下面這些預定義常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、LC_TIME,

其中 LC_ALL 表示所有其它locale分類的並集。

 

locale:爲期望設定的locale名稱字符串,在Linux/Unix環境下,通常以下面格式表示locale名稱:
language[_territory][.codeset][@modifier],
language 爲 ISO 639 中規定的語言代碼,territory 爲 ISO 3166 中規定的國家/地區代碼,codeset 爲字符集名稱。

 


在Linux下,可以使用 locale -a 命令查看系統中所有已配置的 locale。用不帶選項的 locale 命令查看當前 Shell 中活動的 locale。
用 locale -m 命令查看locale系統支持的所有可用的字符集編碼。

 

和locale相關的包叫做:locales,locale系統支持的所有可用locale在文件:/usr/share/i18n/SUPPORTED 中列出。

 

在Debian下,可用 dpkg-reconfigure locales 命令重新配置 locale,也可以手工修改 /etc/locale.gen 文件,然後運行 locale-gen 命令。

在Ubuntu下,修改 /var/lib/locales/supported.d/local 文件,配置新的 locale,然後運行 locale-gen 命令。

 

當 locale 爲 NULL 時,函數只做取回當前 locale 操作,通過返回值傳出,並不改變當前 locale。

當 locale 爲 "" 時,根據環境的設置來設定 locale,檢測順序是:環境變量 LC_ALL,每個單獨的locale分類LC_*,最後是 LANG 變量。

當C語言程序初始化時(剛進入到 main() 時),locale 被初始化爲默認的 C locale,其採用的字符編碼是所有本地 ANSI 字符集編碼的公共部分,
是用來書寫C語言源程序的最小字符集(所以才起locale名叫:C)。

當用 setlocale() 設置活動 locale 時,如果成功,會返回當前活動 locale 的全名稱;如果失敗,會返回 NULL。

 

爲了使程序可以根據環境來改變活動 locale,一般都在程序的初始化階段加入下面代碼:setlocale(LC_ALL, ""),這樣就可以根據環境變量來進行本地化操作.


bindtextdomain()

參考:man 3 bindtextdomain,功能是:設置包含 LC_MESSAGES 分類 (catalog) 的 locale 目錄,
程序的 .mo 文件就保存到其下的目錄中。LC_MESSAGES 是 locale 的一個分類 (catalog),和其它的分類,如:LC_TIME、LC_CTYPE,是平級的概念。

bindtextdomain() 有兩個參數,

第一個叫 domainname,所謂 domain 即領域範圍,它的含義是 .mo 文件將應用在哪個、哪些程序中,可以將 domain 對應爲工程的概念,
上面的示例工程叫 GetTextTest,所以將 domainname 也定義爲 "GetTextTest"。第二個參數是定義保存 .mo 文件的 locale 相關目錄的路徑,
可以爲相對或絕對路徑,示例中設置爲 "locale/",表示檢查當前目錄下的 locale 目錄.


domainname、locale 目錄、程序當前活動 locale,這三者會決定你需要將 .mo 放到 locale 目錄的具體位置,形式爲:

[locale 目錄]/[活動 locale]/LC_MESSAGES/[domainname].mo
比如,示例的 .mo 必需命名並保存爲:

[GetTextTest 程序當前目錄]/locale/zh_CN.GBK/LC_MESSAGES/GetTextTest.mo
textdomain()

參考:man 3 bindtextdomain,功能是:設置後來使用 gettext() 時的 domain。示例中設置:textdomain("GetTextTest")。

gettext()

參考:man 3 gettext, 功能是:替換程序中的 msgid 爲 .mo 中的 msgstr,並返回 msgstr。示例中活動 locale 爲 zh_CN.GBK 時,

gettext("Hello World!") 將返回文件 locale/zh_CN.GBK/LC_MESSAGES/GetTextTest.mo 中對應的 GBK 編碼的 msgstr,即 "你好,世界!"

如果不存在 locale/zh_CN.GBK,則會到 locale/zh_CN 中查找 .mo。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章