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!';