控制器是否应包含/返回i18n字符串,即闪存消息或错误消息?

时间:2014-09-26 16:27:38

标签: python localization internationalization

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

我在HTML视图中包含了i18n翻译块,这很好。但是控制器代码带有flash消息,错误验证消息在我心中打动了我。例如,在Flask中:

@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添加到控制器返回的消息有两种方法:

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

    <p>{{ gettext(message) }}</p>
    <p>{{ gettext(error_message) }}</p>
    
  3. 我认为每种方法都有自己的优点/缺点:

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

    2. 优点:将控制器的逻辑与i18n分开。 i18n应该只在视野中处理,就是这样 缺点:每次添加新字符串时,都必须手动更新l10文件。很难处理AJAX验证案例。

    3. i18n / l10n app和控制器的最佳做法是什么?请帮助我,因为我无数次地用这种方式敲打着我。

1 个答案:

答案 0 :(得分:0)

也许我犯了一个大错误,但对我来说很明显你应该在控制器中使用它,因为在这种情况下在视图中应该是不可能的,因为flash函数可以返回许多不同的东西。你可以在HTML / Javascript中以某种方式使用gettext来获取那些“静态”的字符串,但是如果你必须在翻译文本字符串之前运行gettext,gettext如何知道Jinja2将在运行时呈现什么? “获取闪存消息”函数接收“flash”发送的内容(在控制器上的许多位置),然后如果在运行时获取闪存消息正在执行从任何位置接收任何字符串,如何将该字符串转换为该行代码控制器?