如何使用带有python> 3.6 f-strings的gettext

mda*_*acz 18 python gettext f-string

以前您将使用gettext以下内容:

_('Hey {},').format(username)
Run Code Online (Sandbox Code Playgroud)

但是新的Python的f-string怎么样?

f'Hey {username}'
Run Code Online (Sandbox Code Playgroud)

Jab*_*Jab 17

我的解决方案是创建一个函数f(),在gettext调用后执行 f-string 插值。

from inspect import currentframe

def f(s):
    frame = currentframe().f_back
    return eval(f"f'{s}'", frame.f_locals, frame.f_globals)
Run Code Online (Sandbox Code Playgroud)

现在你只需换行_(...)f()不要在字符串前加上 f:

f(_('Hey, {username}'))
Run Code Online (Sandbox Code Playgroud)

注意事项

我通常反对使用 eval ,因为它可能会使函数潜在不安全,但我个人认为这里应该是合理的,只要您知道正在格式化的内容。也就是说,使用风险自负。

记住

这不是一个完美的解决方案,这只是我的解决方案。根据PEP 498规定,每种格式化方法“各有优势,但也有缺点”,包括这一点。

例如,如果您需要更改字符串内的表达式,则它将不再匹配,因此不会被翻译,除非您也更新您的.po文件。此外,如果您不是翻译它们的人,并且您使用的表达方式难以解读结果会是什么,那么这可能会导致翻译错误或其他问题。

  • 这真的很困扰我,使用你的方法是有效的,但它在代码中留下了“未使用”的变量,因为 pylint 无法告诉你已经使用了它们。理想情况下,f-string 实现应该添加一个属性 `def __unformatted(self): return "blah {x}"`,gettext 将使用该属性作为提取的字符串,然后在格式化回运行时也使用该属性。 (3认同)

Jea*_*bre 13

'Hey {},' 包含在您的翻译词典中.

如果使用f'Hey {username},',则会创建另一个不会被翻译的字符串.

在这种情况下,该format方法仍然是唯一可用的方法.