如何在 python/gettext 中更改运行时语言?

问题描述 投票:0回答:1

这是我第一次在 Python 中使用 gettext(通常也是 gettext)。我了解了很多事情,并且我的测试应用程序运行良好:一个命令行参数可以更改输出消息的语言。

现在我想让用户在启动时更改语言。

我知道我可以加载许多翻译并在运行时安装其中之一,但是许多字符串已经用旧语言翻译并且不会再次更改。

有什么简单的解决办法吗?

import gettext

language = "it"
t_en = gettext.translation("messages", localedir="locale", languages=["en"], fallback=True)
t_it = gettext.translation("messages", localedir="locale", languages=["it"], fallback=True)


def language_install():
    if language == "it":
        t_it.install()
    else:
        t_en.install()

language_install()
main_menu = [_("First item"), _("Second item"), _("Switch language"), _("Exit")]

while True:
    print("MAIN MENU")
    print("---------")
    for (n, item) in enumerate(main_menu):
        print("{:d}: ".format(n + 1) + item)
    print("")
    ans = input(_("Select an item") + ": ")
    if ans == "4":
        break
    elif ans == "3":
        if language == "en":
            language = "it"
        else:
            language = "en"
        language_install()
    else:
        print(_("You have selected item") + " " + ans)
python gettext
1个回答
0
投票

对于简单的用途(比如你的)来说可以:

import gettext

language = "it"
translators = {
    "it": gettext.translation("messages", localedir="locale", languages=["it"], fallback=True),
    "en": gettext.translation("messages", localedir="locale", languages=["en"], fallback=True),
}


class LazyStr:
    def __init__(self, s):
        self.value = s

    def __str__(self):
        return translators[language].gettext(self.value)

    def __bool__(self):
        return bool(self.value)

    def __add__(self, other):
        return str(self) + str(other)


_ = LazyStr

main_menu = [_("First item"), _("Second item"), _("Switch language"), _("Exit")]

while True:
    print("MAIN MENU")
    print("---------")
    for (n, item) in enumerate(main_menu):
        print("{:d}: ".format(n + 1) + str(item))
    print("")
    ans = input(_("Select an item") + ": ")
    if ans == "4":
        break
    elif ans == "3":
        if language == "en":
            language = "it"
        else:
            language = "en"
    else:
        print(_("You have selected item") + " " + ans)
© www.soinside.com 2019 - 2024. All rights reserved.