2009-10-27 49 views
1

我需要讓系統區域設置做很多事情,最終我想使用gettext來翻譯我的應用程序。我要分發Linux和OSX,但我遇到了在OSX雪豹問題:OSX上的locale.getlocale()問題

$ python 
Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26) 
[GCC 4.3.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import locale 
>>> locale.setlocale(locale.LC_ALL, '') 
'sv_SE.UTF-8' 
>>> locale.getlocale() 
('sv_SE', 'UTF8') 

$ python 
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import locale 
>>> locale.setlocale(locale.LC_ALL, '') 
'C' 
>>> locale.getlocale() 
(None, None) 

兩個系統都使用瑞典語言。在Linux上,環境變量LANG已經設置爲「sv_SE.UTF-8」。如果我將該變量傳遞給OSX上的python(改爲LANG="sv_SE.UTF-8" python),則會很好地檢測區域設置。但locale.getlocale()不應該能夠獲取操作系統的任何語言?我不想強制用戶設置LANGLC_ALL或任何環境變量。

輸出locale命令:

$ locale 
LANG= 
LC_COLLATE="C" 
LC_CTYPE="C" 
LC_MESSAGES="C" 
LC_MONETARY="C" 
LC_NUMERIC="C" 
LC_TIME="C" 
LC_ALL= 
+0

在同一個終端窗口中你輸出的'locale'(shell)是什麼? – u0b34a0f6ae 2009-10-27 14:07:32

+0

將語言環境輸出添加到原始文章。 – pojo 2009-10-28 08:56:33

回答

3

奇在OSX(SMOW豹10.6.1)我得到

$ python 
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import locale 
>>> locale.getlocale() 
(None, None) 
>>> locale.setlocale(locale.LC_ALL, '') 
'en_GB.UTF-8' 
>>> locale.getlocale() 
('en_GB', 'UTF8') 

編輯:

我剛剛發現這個在apple python mailing list

基本上它取決於您的環境在運行時設置的內容時間(LANG,LANGUAGE,LC_ALL之一)我在我的shell環境中有LANG = en_GB.UTF-8

+0

奇怪。在我使用iTerm的原始文章中,但是如果使用Terminal.app,我會收到一個錯誤(ValueError:unknown locale:UTF-8)。語言環境看起來很奇怪:'C/UTF-8/C/C/C/C'。也許我的系統搞砸了,但它是一個相當新鮮的雪豹安裝。 – pojo 2009-10-27 11:09:28

+0

看到我的編輯爲什麼會出現變化 - 你的系統沒有搞砸(沒有更多的所有OSX python) - 抱歉應該在編輯 – Mark 2009-10-28 12:36:16

+1

時添加了這個內容我現在看到了你的鏈接,並且從我可以收集的內容看,「它不能完成「,因爲OSX不使用LANG或LC_ALL。我對__CF_USER_TEXT_ENCODING變量感興趣,但似乎有點愚蠢的解析。 IMO getlocale()應該調用適當的API:並且爲你解析,而不是依賴於一些環境變量。 – pojo 2009-10-28 13:17:30

2

看起來好像可以通過更改環境變量LC_ALL來更改區域設置。

$ export LC_ALL=C 
$ python 
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import locale 
>>> locale.getlocale() 
(None, None) 
>>> locale.setlocale(locale.LC_ALL, "") 
'C' 
>>> locale.getlocale() 
(None, None)  

$ export LC_ALL=en_GB.UTF-8 
$ python 
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import locale 
>>> locale.getlocale() 
(None, None) 
>>> locale.setlocale(locale.LC_ALL, "") 
'en_GB.UTF-8' 
>>> locale.getlocale() 
('en_GB', 'UTF8') 
+1

但我沒有看到必須明確設置LC_ALL這種方式來讓我的應用程序正確檢測語言。 – pojo 2009-10-28 08:12:36

+0

OSX 10.6.8你的解決方案工作完美,謝謝 – rdjs 2011-09-23 21:03:38

3

Addmittedly一個可怕的黑客,但我插入這樣的:

import platform 

# ... 

# XXX horrendous OS X invalid locale hack 
if platform.system() == 'Darwin': 
    import locale 
    if locale.getlocale()[0] is None: 
     locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 

在的mine程序的早期點。之後,我可以在與我相關的所有操作系統上使用未修改的shell環境運行我的程序(我的程序計算出稍後在處理中使用的語言)。

+0

不錯的;)至少它完成了工作。 – pojo 2012-01-12 09:17:47

+1

很高興能幫到你! – 2012-01-12 09:58:08

+0

+1。它*是一個可怕的黑客攻擊,但是鑑於這是一個Python bug,這是必要的。 (更多細節在我的答案; P) – hmijail 2017-02-12 15:44:19

1

here:嘗試添加或編輯~/.profile~/.bash_profile文件,以便它在啓動新會話時正確導出您的語言環境設置。

export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8 
+0

1)語言環境變量可能由終端仿真程序設置,所以這只是隱藏了問題。 2)locale vars已經被正確設置,但python不理解它們。 – hmijail 2016-03-01 12:34:43

1

老問題,但是這可能幫助別人:這是一個Python錯誤,如2016年3月仍是在任何Python中未解決的2或3:https://bugs.python.org/issue18378

總結是,Python假設像GNU一樣的locales和balks(POSIXly正確)分歧,就像在BSD環境中一樣(和OS X一樣)。 UTF8語言環境存在於BSD中,而不是在Linux中,因此存在問題。

至於解決方案或調試:本地環境變量可以通過Terminal.app設置(請參閱首選項 - 配置文件 - 高級 - 國際;對於iTerm也是如此)。因此,可以在終端窗口中找到設置的語言環境變量,但在運行打包應用程序時找到未設置的變量。

對於某些情況(例如因爲「ValueError:unknown locale:UTF-8」而在OS X中死於python 2.7和3.5的Sphinx),禁用首選項複選框以設置語言環境變量是解決方案。如果沒有設置locale vars,bash 4.3(來自MacPorts)將會在每次提示時發出抱怨,提示「warning:setlocale:LC_CTYPE:不能更改locale():沒有這樣的文件或者目錄「...

因此,鑑於該錯誤是在Python中,解決方法應該可能在python程序中完成(如@Jacob Oscarson的答案)或python調用(通過設置locale vars爲一些適當的值)。