• django中外部javascript国际化


    1. 我们在模板中引用外部的js文件,由于没有模板引擎的解析,trans标签就不起作用了。

    2. 而django提供了在js文件中调用gettext等函数的方法,前提是需要做配置。

    3. 在urls(全局)中加入:

    1 js_info_dict = {
    2     'packages': ('report.jscripti18n',),
    3 }
    4 
    5 urlpatterns += patterns('',
    6     url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
    7 )

    说明:

    (1). 此处report.jscripti18n表示在report目录下新建jscripti18n目录,其中report和jscripti18n目录下都要有个__init__.py文件,保证可以被import到。

    (2). report/jscripti18n目录可以留空,不用任何文件?

    (3). 将report.jscripti18n安装到INSTALLED_APPS中。

    (4). 而^jsi18n/$表示:如果在需要引用外部js文件的网页中引用<script src="/jsi18n"></script>,表示加载由django提供的“JS文件解析函数”,即gettext等函数。

    4. 而原先从其他目录引入的js文件位置,不用做任何更改,注意:<script src="/jsi18n"></script>只是引入由django提供的js解析库,而且这句话应该放到所有需要翻译的JS文件之前。

    表现为一些JS函数:

     1 /* gettext library */
     2 
     3 var catalog = new Array();
     4 
     5 function pluralidx(count) { return (count == 1) ? 0 : 1; }
     6 
     7 
     8 function gettext(msgid) {
     9   var value = catalog[msgid];
    10   if (typeof(value) == 'undefined') {
    11     return msgid;
    12   } else {
    13     return (typeof(value) == 'string') ? value : value[0];
    14   }
    15 }
    16 
    17 function ngettext(singular, plural, count) {
    18   value = catalog[singular];
    19   if (typeof(value) == 'undefined') {
    20     return (count == 1) ? singular : plural;
    21   } else {
    22     return value[pluralidx(count)];
    23   }
    24 }
    25 
    26 function gettext_noop(msgid) { return msgid; }
    27 
    28 function pgettext(context, msgid) {
    29   var value = gettext(context + '' + msgid);
    30   if (value.indexOf('') != -1) {
    31     value = msgid;
    32   }
    33   return value;
    34 }
    35 
    36 function npgettext(context, singular, plural, count) {
    37   var value = ngettext(context + '' + singular, context + '' + plural, count);
    38   if (value.indexOf('') != -1) {
    39     value = ngettext(singular, plural, count);
    40   }
    41   return value;
    42 }
    43 
    44 function interpolate(fmt, obj, named) {
    45   if (named) {
    46     return fmt.replace(/%\(\w+\)s/g, function(match){return String(obj[match.slice(2,-2)])});
    47   } else {
    48     return fmt.replace(/%s/g, function(match){return String(obj.shift())});
    49   }
    50 }
    51 
    52 /* formatting library */
    53 
    54 var formats = new Array();
    55 
    56 formats['DATETIME_FORMAT'] = 'Y-m-d H:i:s';
    57 formats['DATE_FORMAT'] = 'N j, Y';
    58 formats['DECIMAL_SEPARATOR'] = '.';
    59 formats['MONTH_DAY_FORMAT'] = 'F j';
    60 formats['NUMBER_GROUPING'] = '0';
    61 formats['TIME_FORMAT'] = 'P';
    62 formats['FIRST_DAY_OF_WEEK'] = '0';
    63 formats['TIME_INPUT_FORMATS'] = ['%H:%M:%S', '%H:%M'];
    64 formats['THOUSAND_SEPARATOR'] = ',';
    65 formats['DATE_INPUT_FORMATS'] = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y'];
    66 formats['YEAR_MONTH_FORMAT'] = 'F Y';
    67 formats['SHORT_DATE_FORMAT'] = 'm/d/Y';
    68 formats['SHORT_DATETIME_FORMAT'] = 'm/d/Y P';
    69 formats['DATETIME_INPUT_FORMATS'] = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%Y-%m-%d', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%Y', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M', '%m/%d/%y'];
    70 
    71 function get_format(format_type) {
    72     var value = formats[format_type];
    73     if (typeof(value) == 'undefined') {
    74       return msgid;
    75     } else {
    76       return value;
    77     }
    78 }

    5. 在js中使用的方法是:

    1 $("#tbody").append(gettext('No Item Selected!'));

    6. 创建翻译文件

    (1). 首先需要在report.jscripti18n目录下创建locale目录,复制需要翻译的js文件到report/jscripti18n目录下(此步不可缺少),以为django不会到project主目录寻找js文件。

    (2). 在report/jscripti18n目录下使用命令:django-admin makemessages -l zh_CN -d djangojs;

    (3). 在report/jscripti18n/locale/zh_CN/LC_MESSAGES/目录下生成了djangojs.po文件,然后翻译它,可以使用工具或手工翻译;

    (4). 编译po文件:django-admin compilemessages

    7. 使用firebug可以看到浏览器的请求 GET /jsi18n/ 返回的内容中包含了翻译好的内容:

    1 catalog['No Item Selected!'] = '\u672a\u9009\u62e9\u9879\u76ee!';
     
  • 相关阅读:
    hdu 2569
    hdu 2571
    hdu 4540
    Linux:远程到linux的图形界面
    Windows:文件服务器,访问进去不能查看到完整的文件
    Linux:去除认证,加速 SSH登录
    Linux:永久修改网卡的MAC地址
    Loadrunner:LR提交JSON格式的POST请求
    Linux: vi 编辑器中文乱码
    自动化测试相关:Android SDK无法下载问题,不FQ的解决办法
  • 原文地址:https://www.cnblogs.com/huazi/p/2504039.html
Copyright © 2020-2023  润新知