【问题标题】:How to use gettext with python >3.6 f-strings如何在 python >3.6 f-strings 中使用 gettext
【发布时间】:2018-09-22 16:07:44
【问题描述】:

以前您会使用gettext,如下所示:

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

但是新的 Python 的 f-string 呢?

f'Hey {username}'

【问题讨论】:

标签: python gettext f-string


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我的解决方案是创建一个函数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)
    

    现在您只需将 _(...) 包裹在 f() 中,并且不要在字符串前面加上 f:

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

    注意事项

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

    记住

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

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

    【讨论】:

    • 您实际上并不需要在 f 函数中使用 f-string 格式。只需在 kwargs 所在的位置使用 s.format(**kwargs)from copy import copy kwargs = copy(frame.f_globals) kwargs.update(frame.f_locals)
    • @egvo 老实说,我几个月前读过你的评论,并把它写下来,作为另一种方式。但我刚刚重温了一下,它确实比我使用的f-string 方法更快。
    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2019-08-18
    • 2021-12-16
    相关资源
    最近更新 更多