【问题标题】:How do I translate Javascript standard error messages in Django?如何在 Django 中翻译 Javascript 标准错误消息?
【发布时间】:2019-09-23 17:34:13
【问题描述】:

我有几个使用翻译的 Django 项目,一切正常,除了表单上的 Javascript 错误消息没有翻译。

例如,在我的登录表单上,如果我简单地按回车键,我将收到英文的 JS 错误消息“请填写此字段”,无论我选择了英语、法语、德语还是任何其他语言。这不是我的 JS 错误消息,如果我运行 manage.py makemessages -d djangojs,则不会显示此消息以进行翻译,因此我认为我不需要通过该过程进行更正。

谁能告诉我如何确保用户以他们的语言收到 JavaScript 错误消息。 谢谢

【问题讨论】:

    标签: javascript django language-translation


    【解决方案1】:

    docs 说你应该使用django-admin makemessages -d djangojs -l de,而不是python manage.py ...,还要确保你之后运行django-admin compilemessages

    如果这仍然不起作用,您可以尝试使用 trans 标记,然后使用模板上的事件侦听器手动添加错误消息。

    在页面顶部:

    {% load trans %}
    

    对于纯 JavaScript:

    var inputs = document.querySelectorAll("input");
    
    inputs.forEach(function(input) {
      if (input.hasAttribute("required")) {
        input.oninvalid = function() {
          this.setCustomValidity("{% trans 'Please fill in this field' %}");
        }
      });
    });
    

    jQuery:

    $("input[required]").on("invalid", function() {
        this.setCustomValidity("{% trans 'Please fill in this field' %}");
    });
    

    如果此解决方案不适用于您的特定用例,docs 会详细介绍各种替代方案。

    【讨论】:

    • 问题是,Javascript 消息不会显示在 djangojs.po 中,因为它们是stand JS 的一部分,而不是我写的 javascript
    • @HenryM 手动设置customValidity 消息对您不起作用吗?
    • 这些是表单域上的 JS 错误。他们不是我的 JS
    • @HenryM 如果您从 html 页面底部的上方执行脚本,那应该没关系?
    【解决方案2】:

    Django 提供了一个特定的解决方案来处理这个问题:

    https://docs.djangoproject.com/en/2.2/topics/i18n/translation/#module-django.views.i18n

    但是当需要翻译的js代码中使用的消息数量有限时, 通常情况下,我更喜欢使用更简单的解决方案。

    首先,我在“templates”文件夹中创建了一个“js消息目录”; 它只包含一个全局字符串文字列表。

    由于模板引擎不限于 HTML,并且可以处理任何文件类型, 您可以在js文件的开头{% load i18n %},并根据需要使用'trans'和其他模板标签来标记可翻译的字符串值;这些值将按预期由“makemessages”检测到。

    文件 "/myapp/templates/message_catalog.js"

    {% load i18n %}
    
    MESSAGE_HELLO = "{% trans 'hello' %}";
    MESSAGE_GOODBYE = "{% trans 'goodbye' %}";
    ...
    

    然后,记住将它包含在主模板中,这样消息目录就会 可以从js代码访问:

    文件“/myapp/templates/base.html”

    ...
        <script>
            {% include 'message_catalog.js' %}
        </script>
    
    </body>
    </html>
    

    “真实”的 js 代码可以像往常一样存在于静态中,并且仍然可以访问已翻译的消息:

    文件“/myapp/static/frontend.js”

    function hello() {
        alert(MESSAGE_HELLO);
    }
    
    function goodbye() {
        alert(MESSAGE_GOODBYE);
    }
    

    【讨论】:

    • 问题是,Javascript 消息不会显示在 djangojs.po 中,因为它们是标准 JS 的一部分,而不是我编写的 javascript
    • mmhhh,我明白了.. 是浏览器提供的 HTM5 表单字段验证吗?提供自己的消息可能很棘手;我宁愿将“novalidate”属性添加到表单以完全禁用它(
      ),然后应用验证服务器端或使用您自己的 javascript
    • 是的,但肯定是多种语言的,应该通过语言设置来获取 - 我如何检查浏览器认为正在使用哪种语言
    • 只是猜测......我确实相信浏览器在请求标头中建议了一种“首选语言”,但是 Django 可以根据自己的设置或在用户的选择保存在 cookie 中,并且之前在您的网页上选择过。不确定您是否可以反过来,即:向浏览器建议您(服务器)认为应该使用的语言。我会检查这个:docs.djangoproject.com/en/2.2/topics/i18n/translation/…
    • 我发布了另一个答案,主要是为了分享这个讨论并提供一些可用的格式选项......但我明白这不是你表达的问题的解决方案;)谢谢你的讨论;)
    【解决方案3】:

    在这里,我假设我们谈论的是浏览器提供的表单字段验证。

    您可以为整个 HTML 页面指定默认语言, 和一个特定的部分的语言,原则上浏览器应该很好地利用它。

    但是,到目前为止,该领域的浏览器支持仍然很差且不可靠。

    我在 Chrome 和 Safari 上试过这个:

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <title>title</title>
        </head>
        <body>
    
            <p>form with default lang (en)</p>
            <form>
                <input type="text" required>
                <br />
                <input type="submit">Save
            </form>
    
            <p>form with specific lang (it)</p>
            <form lang="it">
                <input type="text" required>
                <br />
                <input type="submit">Salva
            </form>
    
        </body>
    </html>
    

    这是令人失望的结果:

    有一些约束验证 DOM 方法,例如 checkValidity(), setCustomValidity() 和 reportValidity() 可以帮助控制 验证消息,但它们都被称为支持不佳。

    就个人而言,我更喜欢完全禁用浏览器验证,然后运行我的 而是拥有服务器端或客户端,以便更好地控制用户交互。

    <form ... novalidate>
        ...
    

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多