annotate 0.9.x/contrib/babel.js @ 557:3c590f6f5dfa stable tip

Merged revisions 607 via svnmerge from http://svn.edgewall.org/repos/babel/trunk ........ r607 | pjenvey | 2011-04-24 21:41:23 -0700 (Sun, 24 Apr 2011) | 3 lines keywords only support space separated values, not comma separated thanks agronholm ........
author pjenvey
date Mon, 25 Apr 2011 04:44:13 +0000
parents 4b63ce84c6ae
children
rev   line source
371
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
1 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
2 * Babel JavaScript Support
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
3 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
4 * Copyright (C) 2008 Edgewall Software
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
5 * All rights reserved.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
6 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
7 * This software is licensed as described in the file COPYING, which
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
8 * you should have received as part of this distribution. The terms
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
9 * are also available at http://babel.edgewall.org/wiki/License.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
10 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
11 * This software consists of voluntary contributions made by many
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
12 * individuals. For the exact contribution history, see the revision
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
13 * history and logs, available at http://babel.edgewall.org/log/.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
14 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
15
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
16 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
17 * A simple module that provides a gettext like translation interface.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
18 * The catalog passed to load() must be a object conforming to this
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
19 * interface::
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
20 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
21 * {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
22 * messages: an object of {msgid: translations} items where
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
23 * translations is an array of messages or a single
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
24 * string if the message is not pluralizable.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
25 * plural_expr: the plural expression for the language.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
26 * locale: the identifier for this locale.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
27 * domain: the name of the domain.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
28 * }
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
29 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
30 * Missing elements in the object are ignored.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
31 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
32 * Typical usage::
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
33 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
34 * var translations = babel.Translations.load(...).install();
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
35 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
36 var babel = new function() {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
37
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
38 var defaultPluralExpr = function(n) { return n == 1 ? 0 : 1; };
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
39 var formatRegex = /%?%(?:\(([^\)]+)\))?([disr])/g;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
40
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
41 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
42 * A translations object implementing the gettext interface
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
43 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
44 var Translations = this.Translations = function(locale, domain) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
45 this.messages = {};
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
46 this.locale = locale || 'unknown';
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
47 this.domain = domain || 'messages';
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
48 this.pluralexpr = defaultPluralExpr;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
49 };
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
50
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
51 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
52 * Create a new translations object from the catalog and return it.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
53 * See the babel-module comment for more details.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
54 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
55 Translations.load = function(catalog) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
56 var rv = new Translations();
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
57 rv.load(catalog);
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
58 return rv;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
59 };
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
60
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
61 Translations.prototype = {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
62 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
63 * translate a single string.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
64 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
65 gettext: function(string) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
66 var translated = this.messages[string];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
67 if (typeof translated == 'undefined')
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
68 return string;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
69 return (typeof translated == 'string') ? translated : translated[0];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
70 },
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
71
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
72 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
73 * translate a pluralizable string
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
74 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
75 ngettext: function(singular, plural, n) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
76 var translated = this.messages[singular];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
77 if (typeof translated == 'undefined')
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
78 return (n == 1) ? singular : plural;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
79 return translated[this.pluralexpr(n)];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
80 },
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
81
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
82 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
83 * Install this translation document wide. After this call, there are
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
84 * three new methods on the window object: _, gettext and ngettext
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
85 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
86 install: function() {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
87 var self = this;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
88 window._ = window.gettext = function(string) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
89 return self.gettext(string);
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
90 };
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
91 window.ngettext = function(singular, plural, n) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
92 return self.ngettext(singular, plural, n);
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
93 };
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
94 return this;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
95 },
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
96
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
97 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
98 * Works like Translations.load but updates the instance rather
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
99 * then creating a new one.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
100 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
101 load: function(catalog) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
102 if (catalog.messages)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
103 this.update(catalog.messages)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
104 if (catalog.plural_expr)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
105 this.setPluralExpr(catalog.plural_expr);
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
106 if (catalog.locale)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
107 this.locale = catalog.locale;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
108 if (catalog.domain)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
109 this.domain = catalog.domain;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
110 return this;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
111 },
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
112
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
113 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
114 * Updates the translations with the object of messages.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
115 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
116 update: function(mapping) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
117 for (var key in mapping)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
118 if (mapping.hasOwnProperty(key))
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
119 this.messages[key] = mapping[key];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
120 return this;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
121 },
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
122
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
123 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
124 * Sets the plural expression
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
125 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
126 setPluralExpr: function(expr) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
127 this.pluralexpr = new Function('n', 'return +(' + expr + ')');
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
128 return this;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
129 }
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
130 };
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
131
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
132 /**
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
133 * A python inspired string formatting function. Supports named and
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
134 * positional placeholders and "s", "d" and "i" as type characters
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
135 * without any formatting specifications.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
136 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
137 * Examples::
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
138 *
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
139 * babel.format(_('Hello %s'), name)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
140 * babel.format(_('Progress: %(percent)s%%'), {percent: 100})
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
141 */
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
142 this.format = function() {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
143 var arg, string = arguments[0], idx = 0;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
144 if (arguments.length == 1)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
145 return string;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
146 else if (arguments.length == 2 && typeof arguments[1] == 'object')
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
147 arg = arguments[1];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
148 else {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
149 arg = [];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
150 for (var i = 1, n = arguments.length; i != n; ++i)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
151 arg[i - 1] = arguments[i];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
152 }
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
153 return string.replace(formatRegex, function(all, name, type) {
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
154 if (all[0] == all[1]) return all.substring(1);
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
155 var value = arg[name || idx++];
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
156 return (type == 'i' || type == 'd') ? +value : value;
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
157 });
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
158 }
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
159
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents:
diff changeset
160 };
Copyright (C) 2012-2017 Edgewall Software