Django 1.2.3 - 国际化 - makemessages未能检测到所有字符串

2 投票
3 回答
3862 浏览
提问于 2025-04-16 05:07

还有一个关于Django的问题,涉及到JavaScript文件的本地化。

Django提供了一个小而方便的JavaScript库,使用起来就像gettext一样,可以让JavaScript文件中的字符串国际化。

我成功设置好了这个库(至少插值功能是可以用的),并且我能够为法语生成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.uploadprogress模块的用法,第二部分只是两个用于确认弹窗的函数。

被识别的字符串都在第一部分:

  • 'Uploading %(filename)s...'
  • 'Saving %(filename)s...'

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

有什么想法吗?

3 个回答

0

对于javascript文件,处理方式是不同的。翻译内容不会生成到普通的po文件里,而是生成到一个javascript目录中。

可以参考一下Django书籍中的解释

希望这对你有帮助。

1

我刚刚解决了运行时字符串没有翻译的问题。问题出在我的“locale”目录放在了项目的根目录下。我需要把“my_project_root_dir”添加到settings.INSTALLED_APPS里,这样才能正确生成JavaScript的翻译文件。

至于找不到字符串的问题,我还是不知道怎么让django makemessages找到所有的字符串,不过我有一个临时的解决办法。我手动把字符串添加到mo文件里,这样是可以用的。不过,django makemessages会把这些字符串删掉,所以这个办法就不能再用了。

1

Django的JavaScript消息解析功能比较脆弱。我在我的博客上详细写了为什么会这样。我还为Django 1.3提供了一个修复方案,相关内容可以在Django的7704号问题中找到,这个修复在2012年被接受了。

撰写回答