42

以前你会使用gettext如下:

_('Hey {},').format(username)

但是新 Python 的 f-string 呢?

f'Hey {username}'
4

2 回答 2

22

'Hey {},'原样包含在您的翻译词典中。

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

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

于 2018-04-12T13:26:28.640 回答
21

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

from copy import copy
from inspect import currentframe

def f(s):
    frame = currentframe().f_back
    kwargs = copy(frame.f_globals)
    kwargs.update(frame.f_locals)
    return eval(s.format(**kwargs))

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

f(_('Hey, {username}'))

注意事项

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

记住

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

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

于 2019-05-22T20:04:56.123 回答