这是我第一次在 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)
对于简单的用途(比如你的)来说可以:
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)