【问题标题】:Django 1.2.3 - Internationalization - makemessages does not detect all stringsDjango 1.2.3 - 国际化 - makemessages 不检测所有字符串
【发布时间】:2010-10-07 06:24:04
【问题描述】:

另一个关于 Django 的关于 javascript 文件本地化的问题。

Django 提供了一个小而方便的 javascript 库,它可以像 gettext 一样用于将 javascript 文件中的字符串国际化。

我设置成功(至少 interpolate 函数有效),我可以生成法语的 po 文件。但是,并非所有字符串都被检测到。我真的不知道为什么,因为它们看起来都一样。我在 Django Trac 和官方文档上找不到任何内容。

javascript 代码位于模板中包含的外部文件中,Django 显然找到了它,因为它在 po 文件中放置了两个字符串。

包含在 HTML 模板中:

<script src="{{MEDIA_URL|default:'/media/'}}js/list.js" type="text/javascript"></script>

javascript代码:

/* ---------------
 * Upload progress
 * --------------- */
$(document).ready(function() {
    $(function() {
        $('#upload_form').uploadProgress({
            //...

            /* function called just before starting the upload */
            start: function() {
                $("#upload_form").hide();
                filename = $("#id_file").val().split(/[\/\\]/).pop();
                fmts = gettext('Uploading %(filename)s...');
                dat = {
                    filename: filename
                };
                s = interpolate(fmts,dat,true);
                $("#progress_filename").html(s);
                $("#progress_container").show();
            },

            /* function called each time bar is updated */
            uploading: function(upload) {
                if (upload.percents >= 100) {
                    window.clearTimeout(this.timer);
                    fmts = gettext("Saving %(filename)s...");
                    dat = {
                        filename: filename
                    };
                    s = interpolate(fmts,dat,true);
                    $("#progress_filename").html(s);
                } else {
                    fmts = gettext('Uploading %(filename)s : %(percents)s%...');
                    dat = {
                        filename: filename,
                        percents: upload.percents
                    };
                    s = interpolate(fmts,dat,true);
                    $("#progress_filename").html(s);
                }
            },

            //...

        });
    });
});


/* --------------------
 * Confirmation dialogs
 * -------------------- */
function delVid(title) {
    fmts = gettext('Do you really want to delete the video "%(title)s"?');
    dat = {
        title: title
    };
    s = interpolate(fmts,dat,true);
    return confirm(s)
}

function abortVid(title) {
    fmts = gettext('Do you really want to abort the processing of the video "%(title)s"?');
    dat = {
        title: title
    };
    s = interpolate(fmts,dat,true);
    return confirm(s)
}

第一部分是 JQuery 的 jquery.uploadprogress 模块的标准用法,第二部分只是确认弹出窗口的两个函数。

检测到的字符串都在第一部分:

  • '正在上传 %(filename)s...'
  • '正在保存 %(filename)s...'

我使用了命令“django-admin.py -d djangojs -l fr”,它使用这两个字符串生成了一个 djangojs.po 文件。我翻译了它们。不幸的是,它们在运行时没有被翻译。看来我终于有两个问题了。

有什么想法吗?

【问题讨论】:

    标签: javascript python django internationalization gettext


    【解决方案1】:

    Django 的 Javascript 消息解析非常脆弱。我有written up the details 为什么会这样。我还有一个附加到 Django ticket 7704 的 Django 1.3 修复程序,它在 2012 年被接受。

    【讨论】:

    • 好消息!我阅读了您的文章,但我不知道 javacript 解析是如此的 hack。我应该查看源代码。我希望他们会接受你的 1.3.1 或其他补丁,它会的。然后他们可能有一天会切换到 Babel。
    • 可能对某人有用:不适用于 1.3.1,切换到当前主干后工作正常(Django 1.4-pre-alpha)。
    • 2020 年了。你说现在好点了吗?
    【解决方案2】:

    我刚刚解决了字符串在运行时不翻译的问题。这是因为我的“语言环境”目录位于项目根目录下。我必须将“my_project_root_dir”添加到 settings.INSTALLED_APPS 以接收正确的 javascript 目录。

    对于未检测到字符串的问题,我仍然不知道如何让 django makemessages 找到所有字符串,但我有一个临时解决方案。我手动将字符串添加到 mo 文件中,它可以工作。但是,django makemessages 删除了字符串,所以它不能再使用了。

    【讨论】:

      【解决方案3】:

      javascript 文件的机制不同。翻译不会生成到常规 po 文件中,而是生成到 javascript 目录中。

      the Django book这个解释。

      希望对你有帮助

      【讨论】:

      • 他们说使用命令“django-admin.py makemessages -d djangojs -l [lang_code]”。我这样做了,它生成了一个 djangojs.po 文件(一个普通的 po 文件),但它没有所有的字符串,只有两个。
      • 我添加了精度以避免误解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2019-02-16
      • 2022-06-22
      相关资源
      最近更新 更多