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!';
 
原文地址:https://www.cnblogs.com/huazi/p/2504039.html