在 Python 中更改语言环境后,如何将其重置回原始语言环境?

Juk*_*nen 6 python locale

在 Python 程序中更改语言环境后,将其更改回原始值的安全方法是什么?

到目前为止,我所尝试的是locale.getlocale 在进行更改之前存储返回的原始语言环境,然后使用locale.setlocale之后更改回它。

示例程序:

import datetime
import locale

now = datetime.datetime.now()

locale.setlocale(locale.LC_ALL, '')
print("Date using your locale      : %s" % now.strftime('%c'))

saved = locale.getlocale(locale.LC_TIME)
locale.setlocale(locale.LC_TIME, 'C')
print("Date using the C locale     : %s" % now.strftime('%c'))

locale.setlocale(locale.LC_TIME, saved)
print("Date using your locale again: %s" % now.strftime('%c'))
Run Code Online (Sandbox Code Playgroud)

但是,这并不总是按预期工作。似乎问题出在具有修饰符('@' 符号后面的位)的语言环境中。在 Debian 10 系统上使用 Python 3.7 尝试以下操作说明了问题:

$ LC_TIME=sr_RS.utf8@latin python3 example.py
Date using your locale      : ?etvrtak, 01. avgust 2019. 14:43:43 
Date using the C locale     : Thu Aug  1 14:43:43 2019
Date using your locale again: ????????, 01. ?????? 2019. 14:43:43
Run Code Online (Sandbox Code Playgroud)

所以它似乎变回了sr_RS.utf8语言环境而不是原始sr_RS.utf8@latin语言环境,忘记了@latin修饰符。

此外,如果对应的不带修饰符的语言环境不可用,尝试切换回来时会出现错误。例如,在nan_TW.utf8@latin存在语言环境但nan_TW.utf8不存在的系统上:

$ LC_TIME=nan_TW.utf8@latin python3 example.py
Date using your locale      : 2019 8g 01 (p4) 14:44:29 
Date using the C locale     : Thu Aug  1 14:44:29 2019
Traceback (most recent call last):
  File "example.py", line 13, in <module>
    locale.setlocale(locale.LC_TIME, saved)
  File "/usr/local/lib/python3.7/locale.py", line 604, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
Run Code Online (Sandbox Code Playgroud)

有没有安全的方法可以切换回原始语言环境设置?例如,可以在库例程中使用的东西,旨在在更大的区域设置感知程序中使用以临时切换区域设置(例如,在另一个区域设置中格式化日期)然后将其切换回来,而不会永久干扰区域设置调用程序的。

Ste*_*tef 5

有没有安全的方法可以切换回原始区域设置?(如果它使用修饰符,例如latin

不,不适用于标准函数调用:locale.getlocale()忽略除 之外的所有修饰符euro,请参阅源代码

解决方法是使用内部函数,即不使用该部件_setlocale进行逆向工程:getlocale_parse_localename

import datetime
import locale

now = datetime.datetime.now()

locale.setlocale(locale.LC_ALL, '')
print("Date using your locale      : %s" % now.strftime('%c'))

saved = locale._setlocale(locale.LC_TIME)

locale.setlocale(locale.LC_TIME, 'C')
print("Date using the C locale     : %s" % now.strftime('%c'))

locale.setlocale(locale.LC_TIME, saved)
print("Date using your locale again: %s" % now.strftime('%c'))
Run Code Online (Sandbox Code Playgroud)

例子:

$ LC_TIME=sr_RS.utf8@latin python3 so57312038.py
Date using your locale      : sreda, 21. avgust 2019. 00:00:29 
Date using the C locale     : Wed Aug 21 00:00:29 2019
Date using your locale again: sreda, 21. avgust 2019. 00:00:29 
Run Code Online (Sandbox Code Playgroud)