Python 控制器是否应包含/返回i18n字符串,即闪存消息或错误消息?
我是i18n/l10n方面的新手,目前我必须将i18n/l10n添加到现有的应用程序中(例如,在Python Flask中) 我已经在我的HTML视图中包含了i18n翻译块,这很好。但是控制器用闪光信息编码,错误验证信息打动了我的心。例如,在烧瓶中:Python 控制器是否应包含/返回i18n字符串,即闪存消息或错误消息?,python,localization,internationalization,Python,Localization,Internationalization,我是i18n/l10n方面的新手,目前我必须将i18n/l10n添加到现有的应用程序中(例如,在Python Flask中) 我已经在我的HTML视图中包含了i18n翻译块,这很好。但是控制器用闪光信息编码,错误验证信息打动了我的心。例如,在烧瓶中: @app.route('/logout') def logout(): # Logout user code block... flash("You have been logged out.") return redire
@app.route('/logout')
def logout():
# Logout user code block...
flash("You have been logged out.")
return redirect(url_for("index"))
@app.route('/validate')
def validate():
# Validate code block...
response = jsonify(errors={
"field_name": "Invalid input!"
})
response.status_code = 406
return response
有两种方法可以将i18n添加到控制器返回的消息中:
gettext()
或任何等效的i18n实用程序,然后控制器将返回整个块。例如:
@app.route('/logout')
def logout():
# Logout user code block...
flash(gettext("You have been logged out."))
return redirect(url_for("index"))
@app.route('/validate')
def validate():
# Validate code block...
response = jsonify(errors={
"field_name": gettext("Invalid input!")
})
response.status_code = 406
return response
gettext
。例如:
<p>{{ gettext(message) }}</p>
<p>{{ gettext(error_message) }}</p>
{{gettext(message)}
{{gettext(错误消息)}
缺点:控制员的责任太多。控制器应仅处理应用程序逻辑并返回国际语言(主要是英语)。假设控制器与API通信,那么API必须提交区域设置代码
en
,才能获得正确的消息Cons:每次添加新字符串时,都必须手动更新l10文件。很难处理AJAX验证案例
应用程序和控制器上的i18n/l10n的最佳实践应该是什么?请帮帮我,因为我无数次地用它来敲我的头。也许我犯了一个大错误,但对我来说,很明显,你应该在控制器中使用它,因为在这种情况下,在视图中应该是不可能的,因为flash功能可以返回许多不同的东西。对于那些“静态”字符串,可以在HTML/Javascript中以某种方式使用gettext,但是如果在翻译文本字符串之前必须运行gettext,gettext如何知道Jinja2在运行时将呈现什么?
“get flashed messages”函数接收“flash”发送的内容(在控制器的许多位置),那么,如果get flashed messages在运行时从控制器的任何位置接收任何字符串,您如何为该行代码转换该字符串?实际上,
gettext
做的事情和dict类似:你输入一个索引,它会返回结果。如果索引没有结果,它只返回索引以供显示。因此,如果您已将字符串放入l10n文件(.po
文件,例如),gettext
将为您返回翻译后的字符串。对于其他任何地方的一些奇怪字符串,它都会返回相同的结果。我同意你的观点:如果controller中的字符串包含任何不可翻译/动态/可变的部分,例如特定的名称、链接、电子邮件等。gettext
-我将很难…这是正常的,代码中总是有未翻译的部分,必须保持原样。我想你可以把这些带有格式说明符的动态部分放在gettext中。。