Python 控制器是否应包含/返回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

我是i18n/l10n方面的新手,目前我必须将i18n/l10n添加到现有的应用程序中(例如,在Python Flask中)

我已经在我的HTML视图中包含了i18n翻译块,这很好。但是控制器用闪光信息编码,错误验证信息打动了我的心。例如,在烧瓶中:

@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添加到控制器返回的消息中:

  • 在控制器中使用直接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
    
  • 控制器返回原始文本(本例为英文)。HTML视图将返回的文本包装在i18n实用程序中,即
    gettext
    。例如:

    <p>{{ gettext(message) }}</p>
    <p>{{ gettext(error_message) }}</p>
    
    {{gettext(message)}

    {{gettext(错误消息)}

  • 我认为每种方法都有自己的优缺点:

  • 优点:直截了当。您可以使用i18n引擎自动索引整个源代码,并为您生成l10n文件。这也可以用于AJAX验证,因为返回的消息将使用正确的语言并准备好显示。
    缺点:控制员的责任太多。控制器应仅处理应用程序逻辑并返回国际语言(主要是英语)。假设控制器与API通信,那么API必须提交区域设置代码
    en
    ,才能获得正确的消息

  • 优点:使用i18n分离控制器的逻辑。i18n只能在视图中处理,仅此而已。
    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中。。