相关疑难解决方法(0)

使用 python gettext 在运行时更改语言的方法

我读过很多关于使用 Python 的文章gettext,但没有一篇文章解决了运行时更改语言的问题。

使用,字符串由全局添加到 的gettext函数进行翻译。的定义是特定于语言的,并且在执行过程中当语言设置更改时也会更改。在代码中的某些点,我需要将对象中的字符串翻译为某种语言。这是通过以下方式发生的:_()builtins_

  1. (重新)定义_函数以builtins翻译为所选语言
  2. 使用新_函数(重新)评估所需的对象 - 保证对对象定义内的任何调用都_使用 的当前定义进行评估_
  3. 返回对象

我想知道第 2 步的不同方法。我想到了几种,但它们似乎都有根本性的缺陷。

  • 在实践中实现步骤 2 的最佳方法是什么?
  • 理论上是否可以在不了解其实现的情况下对任意对象实现步骤 2?

可能的方法

如果所有翻译文本都在可在步骤 2 中调用的函数中定义,那么就很简单:调用该函数将使用 的当前定义进行计算_。但在很多情况下情况并非如此,例如,翻译后的字符串可能是在导入时评估的模块级变量,或者是在实例化对象时评估的属性。

模块级变量问题的最小示例在这里

重新评估

手动重新加载模块

可以使用 在所需时间重新评估模块级变量importlib.reload。如果模块导入另一个也具有翻译字符串的模块,情况会变得更加复杂。您必须重新加载作为(嵌套)依赖项的每个模块。

了解模块的实现后,您可以按正确的顺序手动重新加载依赖项:如果 A 导入 B,

importlib.reload(B)
importlib.reload(A)
# use A...
Run Code Online (Sandbox Code Playgroud)

问题:需要了解模块的实现。仅重新加载模块级变量。

自动重新加载模块

如果不了解模块的实现,您需要以正确的顺序自动重新加载依赖项。您可以对包中的每个模块或仅对(递归)依赖项执行此操作。为了处理更复杂的情况,您需要生成依赖关系图并从根开始按广度优先顺序重新加载模块。

问题:需要复杂的重新加载算法。可能存在不可能的边缘情况(循环依赖、不寻常的包结构、from X import Y-style 导入)。仅重新加载模块级变量。

仅重新评估所需的对象?

eval …

python architecture gettext internationalization

5
推荐指数
1
解决办法
874
查看次数