我读过很多关于使用 Python 的文章gettext,但没有一篇文章解决了运行时更改语言的问题。
使用,字符串由全局添加到 的gettext函数进行翻译。的定义是特定于语言的,并且在执行过程中当语言设置更改时也会更改。在代码中的某些点,我需要将对象中的字符串翻译为某种语言。这是通过以下方式发生的:_()builtins_
_函数以builtins翻译为所选语言_函数(重新)评估所需的对象 - 保证对对象定义内的任何调用都_使用 的当前定义进行评估_。我想知道第 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 …