locale
--- 國際化服務(wù)?
源代碼: Lib/locale.py
locale
模塊開(kāi)通了 POSIX 本地化數據庫和功能的訪(fǎng)問(wèn)。POSIX 本地化機制讓程序員能夠為應用程序處理某些本地化的問(wèn)題,而不需要去了解運行軟件的每個(gè)國家的全部語(yǔ)言習慣。
locale
模塊是在 _locale
模塊的基礎上實(shí)現的,而 _locale 則又用到了 ANSI C 語(yǔ)言實(shí)現的本地化功能。
locale
模塊定義了以下異常和函數:
- exception locale.Error?
當傳給
setlocale()
的 locale 無(wú)法識別時(shí),會(huì )觸發(fā)異常。
- locale.setlocale(category, locale=None)?
如果給定了 locale 而不是
None
,setlocale()
會(huì )修改 category 的 locale 設置??捎玫念?lèi)別會(huì )在下面的數據描述中列出。locale 可以是一個(gè)字符串,也可以是兩個(gè)字符串(語(yǔ)言代碼和編碼)組成的可迭代對象。若為可迭代對象,則會(huì )用地區別名引擎轉換為一個(gè)地區名稱(chēng)。若為空字符串則指明采用用戶(hù)的默認設置。如果 locale 設置修改失敗,會(huì )觸發(fā)Error
異常。如果成功則返回新的 locale 設置。如果省略 locale 或為
None
,將返回 category 但當前設置。setlocale()
在大多數系統上都不是線(xiàn)程安全的。應用程序通常會(huì )如下調用:import locale locale.setlocale(locale.LC_ALL, '')
這會(huì )把所有類(lèi)別的 locale 都設為用戶(hù)的默認設置(通常在
LANG
環(huán)境變量中指定)。如果后續 locale 沒(méi)有改動(dòng),則使用多線(xiàn)程應該不會(huì )產(chǎn)生問(wèn)題。
- locale.localeconv()?
以字典的形式返回本地約定的數據庫。此字典具有以下字符串作為鍵:
類(lèi)別
鍵
含意
'decimal_point'
小數點(diǎn)字符。
'grouping'
數字列表,指定
'thousands_sep'
應該出現的位置。 如果列表以CHAR_MAX
結束,則不會(huì )作分組。如果列表以0
結束,則重復使用最后的分組大小。'thousands_sep'
組之間使用的字符。
'int_curr_symbol'
國際貨幣符號。
'currency_symbol'
當地貨幣符號。
'p_cs_precedes/n_cs_precedes'
貨幣符號是否在值之前(對于正值或負值)。
'p_sep_by_space/n_sep_by_space'
貨幣符號是否通過(guò)空格與值分隔(對于正值或負值)。
'mon_decimal_point'
用于貨幣金額的小數點(diǎn)。
'frac_digits'
貨幣值的本地格式中使用的小數位數。
'int_frac_digits'
貨幣價(jià)值的國際格式中使用的小數位數。
'mon_thousands_sep'
用于貨幣值的組分隔符。
'mon_grouping'
相當于
'grouping'
,用于貨幣價(jià)值。'positive_sign'
用于標注正貨幣價(jià)值的符號。
'negative_sign'
用于注釋負貨幣價(jià)值的符號。
'p_sign_posn/n_sign_posn'
符號的位置(對于正值或負值),見(jiàn)下文。
可以將所有數值設置為
CHAR_MAX
,以指示本 locale 中未指定任何值。下面給出了
'p_sign_posn'
和'n_sign_posn'
的可能值。值
說(shuō)明
0
被括號括起來(lái)的貨幣和金額。
1
該標志應位于值和貨幣符號之前。
2
該標志應位于值和貨幣符號之后。
3
標志應該緊跟在值之前。
4
標志應該緊跟在值之后。
CHAR_MAX
該地區未指定內容。
該函數將
LC_CTYPE
地區設為LC_NUMERIC
地區,若地區不同且數字或貨幣字符為非 ASCII,則設置為LC_MONETARY
地區。這個(gè)臨時(shí)的改變會(huì )影響到其他線(xiàn)程。在 3.7 版更改: 現在在某些情況下,該函數會(huì )將
LC_CTYPE
地區設為LC_NUMERIC
地區。
- locale.nl_langinfo(option)?
以字符串形式返回一些地區相關(guān)的信息。本函數并非在所有系統都可用,而且可用的 option 在不同平臺上也可能不同??商畹膮抵禐閿抵?,在 locale 模塊中提供了對應的符號常量。
nl_langinfo()
函數可接受以下值。大部分含義都取自 GNU C 庫。- locale.CODESET?
獲取一個(gè)字符串,代表所選地區采用的字符編碼名稱(chēng)。
- locale.D_T_FMT?
獲取一個(gè)字符串,可用作
time.strftime()
的格式串,以便以地區特定格式表示日期和時(shí)間。
- locale.D_FMT?
獲取一個(gè)字符串,可用作
time.strftime()
的格式串,以便以地區特定格式表示日期。
- locale.T_FMT?
獲取一個(gè)字符串,可用作
time.strftime()
的格式串,以便以地區特定格式表示時(shí)間。
- locale.T_FMT_AMPM?
獲取一個(gè)字符串,可用作
time.strftime()
的格式串,以便以 am/pm 的格式表示時(shí)間。
- DAY_1 ... DAY_7
獲取一周中第 n 天的名稱(chēng)。
備注
這里遵循美國慣例,即
DAY_1
是星期天,而不是國際慣例(ISO 8601),即星期一是一周的第一天。
- ABDAY_1 ... ABDAY_7
獲取一周中第 n 天的縮寫(xiě)名稱(chēng)。
- MON_1 ... MON_12
獲取第 n 個(gè)月的名稱(chēng)。
- ABMON_1 ... ABMON_12
獲取第 n 個(gè)月的縮寫(xiě)名稱(chēng)。
- locale.RADIXCHAR?
獲取小數點(diǎn)字符(小數點(diǎn)、小數逗號等)。
- locale.THOUSEP?
獲取千位數(三位數一組)的分隔符。
- locale.YESEXPR?
獲取一個(gè)可供 regex 函數使用的正則表達式,用于識別需要回答是或否的問(wèn)題的肯定回答。
備注
該表達式的語(yǔ)法適用于 C 庫的
regex()
函數,可能與re
中的語(yǔ)法不一樣。
- locale.NOEXPR?
獲取一個(gè)可供 regex(3) 函數使用的正則表達式,用于識別需要回答是或否的問(wèn)題的否定回答。
- locale.CRNCYSTR?
獲取貨幣符號,如果符號應位于數字之前,則在其前面加上“-”;如果符號應位于數字之后,則前面加“+”;如果符號應取代小數點(diǎn)字符,則前面加“.”。
- locale.ERA?
獲取一個(gè)字符串,代表當前地區使用的紀元。
大多數地區都沒(méi)有定義該值。定義了該值的一個(gè)案例日本。日本傳統的日期表示方法中,包含了當時(shí)天皇統治朝代的名稱(chēng)。
通常沒(méi)有必要直接使用該值。在格式串中指定
E
符號,會(huì )讓time.strftime()
函數啟用此信息。返回字符串的格式并沒(méi)有定義,因此不得假定各個(gè)系統都能理解。
- locale.ERA_D_T_FMT?
獲取一個(gè)字符串,可用作
time.strftime()
的格式串,以便以地區特定格式表示帶紀元的日期和時(shí)間。
- locale.ERA_D_FMT?
獲取一個(gè)字符串,可用作
time.strftime()
的格式串,以便以地區特定格式表示帶紀元的日期。
- locale.ERA_T_FMT?
獲取一個(gè)字符串,可用作
time.strftime()
的格式串,以便以地區特定格式表示帶紀元的時(shí)間。
- locale.ALT_DIGITS?
獲取 0 到 99 的表示法,最多不超過(guò) 100 個(gè)值。
- locale.getdefaultlocale([envvars])?
嘗試確定默認的地區設置,并以
(language code, encoding)
元組的形式返回。根據 POSIX 的規范,未調用
setlocale(LC_ALL, '')
的程序采用可移植的'C'
區域設置運行。 調用setlocale(LC_ALL, '')
則可采用LANG
變量定義的默認區域。 由于不想干擾當前的區域設置,因此就以上述方式進(jìn)行了模擬。為了維持與其他平臺的兼容性,不僅需要檢測
LANG
變量,還需要檢測 envvars 參數給出的變量列表。首先發(fā)現的定義將被采用。 envvars 默認為 GNU gettext 采用的搜索路徑;必須包含'LANG'
變量。 GNU gettext 的搜索路徑依次包含了'LC_ALL'
、'LC_CTYPE'
、'LANG'
和'LANGUAGE'
。除了
'C'
之外,語(yǔ)言代碼對應 RFC 1766 標準。若 語(yǔ)言代碼 和 編碼 無(wú)法確定,則可為None
。3.11 版后已移除: 3.13
- locale.getlocale(category=LC_CTYPE)?
以列表的形式返回指定地區類(lèi)別的當前設置,結果包括 語(yǔ)言代碼 、編碼。category 可以是
LC_*
之一,LC_ALL
除外。默認為LC_CTYPE
。除了
'C'
之外,語(yǔ)言代碼對應 RFC 1766 標準。若 語(yǔ)言代碼 和 編碼 無(wú)法確定,則可為None
。
- locale.getpreferredencoding(do_setlocale=True)?
根據用戶(hù)的偏好,返回用于文本數據的 locale encoding。用戶(hù)偏好在不同的系統上有不同的表達方式,而且在某些系統上可能無(wú)法以編程方式獲取到,所以本函數只是返回猜測結果。
某些系統必須調用
setlocale()
才能獲取用戶(hù)偏好,所以本函數不是線(xiàn)程安全的。如果不需要或不希望調用 setlocale,do_setlocale 應設為False
。On Android or if the Python UTF-8 Mode is enabled, always return
'utf-8'
, the locale encoding and the do_setlocale argument are ignored.Python preinitialization 用于配置 LC_CTYPE 區域。還請參閱 filesystem encoding and error handler。
在 3.7 版更改: The function now always returns
"utf-8"
on Android or if the Python UTF-8 Mode is enabled.
- locale.getencoding()?
Get the current locale encoding:
On Android and VxWorks, return
"utf-8"
.On Unix, return the encoding of the current
LC_CTYPE
locale. Return"utf-8"
ifnl_langinfo(CODESET)
returns an empty string: for example, if the current LC_CTYPE locale is not supported.On Windows, return the ANSI code page.
Python preinitialization 用于配置 LC_CTYPE 區域。還請參閱 filesystem encoding and error handler。
This function is similar to
getpreferredencoding(False)
except this function ignores the Python UTF-8 Mode.3.11 新版功能.
- locale.normalize(localename)?
為給定的區域名稱(chēng)返回標準代碼。返回的區域代碼已經(jīng)格式化,可供
setlocale()
使用。 如果標準化操作失敗,則返回原名稱(chēng)。如果給出的編碼無(wú)法識別,則本函數默認采用區域代碼的默認編碼,這正類(lèi)似于
setlocale()
。
- locale.resetlocale(category=LC_ALL)?
將 category 的區域設為默認值。
默認設置通過(guò)調用
getdefaultlocale()
確定。category 默認為LC_ALL
。3.11 版后已移除: 3.13
- locale.strcoll(string1, string2)?
根據當前的
LC_COLLATE
設置,對兩個(gè)字符串進(jìn)行比較。與其他比較函數一樣,根據 string1 位于 string2 之前、之后或是相同,返回負值、、正值或者0
。
- locale.strxfrm(string)?
將字符串轉換為可用于本地化比較的字符串。例如
strxfrm(s1) < strxfrm(s2)
相當于strcoll(s1, s2) < 0
。在重復比較同一個(gè)字符串時(shí),可能會(huì )用到本函數,比如整理字符串列表時(shí)。
- locale.format_string(format, val, grouping=False, monetary=False)?
根據當前的
LC_NUMERIC
設置,對數字 val 進(jìn)行格式化。格式將遵循%
運算符的約定。浮點(diǎn)值的小數點(diǎn)會(huì )按需修改。若 grouping 為 True,則還會(huì )考慮分組。若 monetary 為 True,則會(huì )用到貨幣千位分隔符和分組字符串。
格式化符的處理類(lèi)似
format % val
,但會(huì )考慮到當前的區域設置。在 3.7 版更改: 增加了關(guān)鍵字參數 monetary 。
- locale.format(format, val, grouping=False, monetary=False)?
請注意,本函數的工作原理與
format_string()
類(lèi)似,但只認一種%char
格式符。 比如'%f'
和'%.0f'
都是有效的格式符,但'%f KiB'
則不是。若想用到全部的格式化串,請采用
format_string()
。3.7 版后已移除: 請改用
format_string()
。
- locale.currency(val, symbol=True, grouping=False, international=False)?
根據當前的
LC_MONETARY
設置,對數字 val 進(jìn)行格式化。如果 symbol 為 True(默認值),則返回的字符串將包含貨幣符號。如果 grouping 為 True(非默認值),則會(huì )進(jìn)行分組。如果 international 為 True(非默認值),將采用國際貨幣符號。
請注意,本函數對區域 “C” 無(wú)效,所以必須先通過(guò)
setlocale()
設置一個(gè)區域。
- locale.str(float)?
對浮點(diǎn)數進(jìn)行格式化,格式要求與內置函數
str(float)
相同,但會(huì )考慮小數點(diǎn)。
- locale.delocalize(string)?
根據
LC_NUMERIC
的設置,將字符串轉換為標準化的數字字符串。3.5 新版功能.
- locale.localize(string, grouping=False, monetary=False)?
根據
LC_NUMERIC
的設置,將標準化的數字字符串轉換為格式化的字符串。3.10 新版功能.
- locale.atof(string, func=float)?
Converts a string to a number, following the
LC_NUMERIC
settings, by calling func on the result of callingdelocalize()
on string.
- locale.atoi(string)?
按照
LC_NUMERIC
的約定,將字符串轉換為整數。
- locale.LC_TIME?
格式化時(shí)間時(shí)會(huì )用到的區域類(lèi)別。
time.strftime()
函數會(huì )參考這些約定。
- locale.LC_MONETARY?
格式化貨幣值時(shí)會(huì )用到的區域類(lèi)別??捎弥悼捎?
localeconv()
函數獲取。
- locale.LC_MESSAGES?
顯示消息時(shí)用到的區域類(lèi)別。目前 Python 不支持應用定制的本地化消息。 由操作系統顯示的消息,比如由
os.strerror()
返回的消息可能會(huì )受到該類(lèi)別的影響。
- locale.LC_NUMERIC?
格式化數字時(shí)用到的區域類(lèi)別。
locale
模塊的format()
、atoi()
、atof()
和str()
函數會(huì )受到該類(lèi)別的影響。其他所有數字格式化操作不受影響。
- locale.LC_ALL?
混合所有的區域設置。如果在區域改動(dòng)時(shí)使用該標志,將嘗試設置所有類(lèi)別的區域參數。只要有任何一個(gè)類(lèi)別設置失敗,就不會(huì )修改任何類(lèi)別。在使用此標志獲取區域設置時(shí),會(huì )返回一個(gè)代表所有類(lèi)別設置的字符串。之后可用此字符串恢復設置。
- locale.CHAR_MAX?
一個(gè)符號常量,
localeconv()
返回多個(gè)值時(shí)將會(huì )用到。
示例:
>>> import locale
>>> loc = locale.getlocale() # get current locale
# use German locale; name might vary with platform
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
>>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut
>>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale
>>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale
>>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale
背景、細節、提示、技巧和注意事項?
C 語(yǔ)言標準將區域定義為程序級別的屬性,修改的代價(jià)可能相對較高。此外,有某些實(shí)現代碼寫(xiě)得不好,頻繁改變區域可能會(huì )導致內核崩潰。于是要想正確使用區域就變得有些痛苦。
當程序第一次啟動(dòng)時(shí),無(wú)論用戶(hù)偏好定義成什么,區域值都是 C
。不過(guò)有一個(gè)例外,就是在啟動(dòng)時(shí)修改 LC_CTYPE
類(lèi)別,設置當前區域編碼為用戶(hù)偏好編碼。程序必須調用 setlocale(LC_ALL, '')
明確表示用戶(hù)偏好區域將設為其他類(lèi)別。
若要從庫程序中調用 setlocale()
,通常這不是個(gè)好主意,因為副作用是會(huì )影響整個(gè)程序。保存和恢復區域設置也幾乎一樣糟糕:不僅代價(jià)高昂,而且會(huì )影響到恢復之前運行的其他線(xiàn)程。
如果是要編寫(xiě)通用模塊,需要有一種不受區域設置影響的操作方式(比如某些用到 time.strftime()
的格式),將不得不尋找一種不用標準庫的方案。更好的辦法是說(shuō)服自己,可以采納區域設置。只有在萬(wàn)不得已的情況下,才能用文檔標注出模塊與非 C
區域設置不兼容。
根據區域設置進(jìn)行數字運算的唯一方法,就是采用本模塊定義的函數:atof()
、 atoi()
、 format()
、 str()
。
無(wú)法根據區域設置進(jìn)行大小寫(xiě)轉換和字符分類(lèi)。對于(Unicode)文本字符串來(lái)說(shuō),這些操作都是根據字符值進(jìn)行的;而對于字節符串來(lái)說(shuō),轉換和分類(lèi)則是根據字節的 ASCII 值進(jìn)行的,高位被置位的字節(即非 ASCII 字節)永遠不會(huì )被轉換或被視作字母或空白符之類(lèi)。
針對擴展程序編寫(xiě)人員和嵌入Python 運行的程序?
除了要查詢(xún)當前區域,擴展模塊不應去調用 setlocale()
。但由于返回值只能用于恢復設置,所以也沒(méi)什么用(也許只能用于確認是否為 C
)。
當 Python 代碼利用 locale
模塊修改區域設置時(shí),也會(huì )影響到嵌入 Python 運行的應用程序。如果嵌入運行的程序不希望發(fā)生這種情況,則應從 config.c
文件的內置模塊表中刪除 _locale
擴展模塊(所有操作均是由它完成的),并確保 _locale
模塊不能成為一個(gè)共享庫。
訪(fǎng)問(wèn)消息目錄?
- locale.gettext(msg)?
- locale.dgettext(domain, msg)?
- locale.dcgettext(domain, msg, category)?
- locale.textdomain(domain)?
- locale.bindtextdomain(domain, dir)?
在提供 gettext 接口的系統中,locale 模塊暴露出了 C 庫的接口。它由 gettext()
、dgettext()
、dcgettext()
、 textdomain()
、bindtextdomain()
和 bind_textdomain_codeset()
等函數組成。 他們與 gettext
模塊中的同名函數類(lèi)似,但采用了 C 庫二進(jìn)制格式的消息目錄,以及 C 庫的搜索算法來(lái)查找消息目錄。
Python 應用程序通常不需要調用這些函數,而應改用 gettext
。這條規則的一個(gè)已知例外,是與附加 C 庫鏈接的應用程序,他們在內部調用了 gettext()
或 dcgettext()
。對于這些應用程序,可能有必要綁定文本域,以便庫可以準確找到其消息目錄。