我知道这个问题已经很老了,并且已经有了一个非常合理的答案,但是当我在搜索时着陆于此时,我会大胆地给出我的答案,并且我自己也喜欢使用f弦想要失去它的使用,但还支持I18N。(即:我也想吃蛋糕)
我的解决方案是制作一个在调用f()
后执行f字符串插值的函数gettext
。
from inspect import currentframe
def f(s):
frame = currentframe().f_back
return eval(f"f'{s}'", frame.f_locals, frame.f_globals)
现在,您只需换行_(...)
,f()
不要在字符串前加上f:
f(_('Hey, {username}'))
我通常反对使用eval,因为它可能会使函数不安全,但是我个人认为,只要您知道要格式化的内容,就应该在这里辩护。否则,使用后果自负。
这不是一个完美的解决方案,这只是我的解决方案。根据PEP 498的规定,每种格式化方法“都有其优点,但也有缺点”。
例如,如果您需要更改字符串中的表达式,则它将不再匹配,因此除非您也更新了.po
文件,否则它不会被翻译。另外,如果您不是翻译它们的人,并且使用的表达式难以解读结果,那么可能会导致沟通不畅或翻译中的其他问题。