由于 tarina.lang 调用 locale.getlocale(locale.LC_MESSAGES) 获取语言设置,而 locale.getlocale 在调用 locale.setlocale 之前永远返回 'C' 区域(即元组 (None, None)),因此 tarina.lang 无法正确获得语言设置。
参见文档: https://docs.python.org/zh-cn/3.14/library/locale.html#locale.getdefaultlocale
根据 POSIX 的规范,未调用 setlocale(LC_ALL, '') 的程序采用可移植的 'C' 区域设置运行。 调用 setlocale(LC_ALL, '') 则可采用 LANG 变量定义的默认区域。
解决方法是在 locale.getlocale(locale.LC_MESSAGES) 之前调用 locale.setlocale(locale.LC_MESSAGES, ''),第二个参数为空字符串表示读取环境变量的值。(不修改当前 locale 而直接读取环境变量的 locale.getdefaultlocale 已弃用。)
但需要注意的是,locale.setlocale 不是线程安全的;以及当相关环境变量无效时,locale.setlocale 会抛出异常。
另外,Python 启动时会自动调用 setlocale(LC_CTYPE, ''),因此若获取 LC_CTYPE 则无需调用 setlocale,参见: python/cpython#90817 (comment)
由于 tarina.lang 调用
locale.getlocale(locale.LC_MESSAGES)获取语言设置,而locale.getlocale在调用locale.setlocale之前永远返回 'C' 区域(即元组(None, None)),因此 tarina.lang 无法正确获得语言设置。参见文档: https://docs.python.org/zh-cn/3.14/library/locale.html#locale.getdefaultlocale
解决方法是在
locale.getlocale(locale.LC_MESSAGES)之前调用locale.setlocale(locale.LC_MESSAGES, ''),第二个参数为空字符串表示读取环境变量的值。(不修改当前 locale 而直接读取环境变量的locale.getdefaultlocale已弃用。)但需要注意的是,
locale.setlocale不是线程安全的;以及当相关环境变量无效时,locale.setlocale会抛出异常。另外,Python 启动时会自动调用
setlocale(LC_CTYPE, ''),因此若获取 LC_CTYPE 则无需调用 setlocale,参见: python/cpython#90817 (comment)