Updated Ajatus to use the new jqCouch library
[ajatus.git] / js / ajatus.i10n.js
blobb135949ecf1d5518071646bc5627018fe5c9e376
1 /*
2  * This file is part of
3  *
4  * Ajatus - Distributed CRM
5  * @requires jQuery v1.2.1
6  * 
7  * Copyright (c) 2007 Jerry Jalava <jerry.jalava@gmail.com>
8  * Copyright (c) 2007 Nemein Oy <http://nemein.com>
9  * Website: http://ajatus.info
10  * Licensed under the GPL license
11  * http://www.gnu.org/licenses/gpl.html
12  * 
13  */
15 (function($){
16     $.ajatus = $.ajatus || {};
17     
18     $.ajatus.i10n = {
19         lang: 'en_GB',
20         dict: {},
21         currency: {
22             name: '',
23             symbol: ''
24         },
25         datetime: {
26             date: 'MDY/',
27             time: 'HMS:'
28         },
29         initialized: false,
30         available: null
31     };
32     $.extend($.ajatus.i10n, {
33         init: function(lang) {
34             $.ajatus.i10n.lang = lang || 'en_GB';
35             $.ajatus.i10n._load_lang($.ajatus.i10n.lang);
36         },
37         get_available_langs: function(force_refresh) {
38             if (typeof force_refresh == 'undefined') {
39                 var force_refresh = false;
40             }            
41             var refresh = false;
42             
43             if ($.ajatus.i10n.available == null) {
44                 $.ajatus.i10n.available = [];
45                 refresh = true;
46             }
47             
48             if (   refresh
49                 || force_refresh)
50             {
51                 // TODO: Somehow get all available translations from js/languages -folder
52                 $.ajatus.i10n.available = [
53                     'en_GB', 
54                     'fi_FI',
55                     'hu_HU',
56                     'nl_NL',
57                     'pl_PL',
58                     'sv_SE'
59                 ];
60             }
62             return $.ajatus.i10n.available;
63         },
64         get: function() { //string, keys, pluralize_key
65             if (arguments.length < 1) {
66                 return;
67             }
68             
69             var string = new String();
70             var trans_key = arguments[0].toString().toLowerCase();
71             trans_key = $.trim(trans_key);
72             //$.ajatus.debug("get "+trans_key, "ajatus.i10n");
73             
74             var replace_args = [];
75             if (   arguments.length > 1
76                 && typeof(arguments[1]) == 'object')
77             {
78                 replace_args = arguments[1];
79             }            
81             var auto_plural = false;
82             if (arguments.length < 3) {
83                 auto_plural = true;
84             }
85             
86             if (typeof($.ajatus.i10n.dict[trans_key]) != 'undefined') {                
87                 string = String($.ajatus.i10n.dict[trans_key]);
88             } else {
89                 string = arguments[0].toString();
90             }
91             
92             if (replace_args.length > 0) {
93                 string = $.ajatus.i10n.format_result(string, replace_args, auto_plural);
94             }
95             
96             if (   arguments.length > 2
97                 && typeof(arguments[2]) == 'string')
98             {
99                 string = $.ajatus.i10n.plural(string, arguments[2]);
100             }
102             var curr_s = "%_CURR_S";
103             var curr_n = "%_CURR_N";
104             var s_re = new RegExp(curr_s, "i");
105             var n_re = new RegExp(curr_n, "i");
106             if (string.match(s_re)) {
107                 var re = new RegExp(curr_s, "gi");
108                 string = string.replace(re, $.ajatus.i10n.get_currency().symbol);
109             }
110             if (string.match(n_re)) {
111                 var re = new RegExp(curr_n, "gi");
112                 string = string.replace(re, $.ajatus.i10n.get_currency().symbol);
113             }
114             
115             // $.ajatus.debug("return "+string, "ajatus.i10n");
116             return string;
117         },
118         get_currency: function() {
119             if (arguments.length > 0) {
120                 switch (arguments[0]) {
121                     case 'name':
122                         return $.ajatus.i10n.currency.name;
123                     break;
124                     case 'symbol':
125                         return $.ajatus.i10n.currency.name;
126                     break;
127                     case 'both':
128                         return $.ajatus.i10n.currency;
129                     break;
130                 }
131             }
132             return $.ajatus.i10n.currency;
133         },
134         format_result: function(string, args, auto_plural) {
135             if (typeof auto_plural == 'undefined') {
136                 var auto_plural = true;
137             }
138             $.each(args, function(i,value){
139                 var key = $.ajatus.i10n._resolve_replace_type(value);
140                 if (   key == '%d'
141                     && auto_plural
142                     && (value > 1))
143                 {
144                     var re = new RegExp(/\b[%]?d.(\w+)\b/);
145                     var m = re.exec(string);
146                     if (m != null) {
147                         var sing = m[(m.length-1)];
148                         var plural = $.ajatus.i10n.inflector.pluralize(sing);
149                         string = string.toString().replace(sing, plural);
150                     }
151                 }
152                 string = string.toString().replace(key, value);
153             });
154             return string;
155         },
156         plural: function(string, key) {
157             if (typeof key == 'undefined') {
158                 var key = string;
159             }
160             
161             var plural_key = $.ajatus.i10n.inflector.pluralize(key);
162                         
163             var result = string.toString().replace(key, plural_key);
164             
165             return result;
166         },
167         _resolve_replace_type: function(value) {
168             if (typeof value == 'string') {
169                 return '%s';
170             }
171             if (typeof value == 'number') {
172                 return '%d';
173             }
174             
175             return '%s';
176         },
177         _load_lang: function(lang) {
178             if (   typeof lang == 'undefined'
179                 || lang == '')
180             {
181                 return;
182             }
184             $.ajaxSetup({
185                 async: false
186             });
187             $.ajatus.events.lock_pool.increase();
188             
189             var lang_url = $.ajatus.preferences.client.application_url + 'js/languages/'+lang+'.js';
190             $.ajatus.utils.load_script(lang_url, "$.ajatus.i10n._lang_loaded", [lang]);
191         },
192         _lang_loaded: function(lang) {
193             $.ajaxSetup({
194                 async: true
195             });
196             $.ajatus.i10n.initialized = true;
197             $.ajatus.events.lock_pool.decrease();            
198         }
199     });
200     
201     $.ajatus.i10n.inflections = {};
202     $.ajatus.i10n.inflector = {
203         inflection: null
204     };
205     $.extend($.ajatus.i10n.inflector, {        
206         ordinalize: function(number) {
207             $.ajatus.i10n.inflector._get_inflector();
208             if ($.ajatus.i10n.inflector.inflection == false) {
209                 return number;
210             }
211                         
212             if (typeof ($.ajatus.i10n.inflector.inflection['ordinalize']) == 'function') {
213                 return $.ajatus.i10n.inflector.inflection.ordinalize(number);
214             }
215             return number;
216         },
217         pluralize: function(word) {
218             $.ajatus.i10n.inflector._get_inflector();
219             if ($.ajatus.i10n.inflector.inflection == false) {
220                 return word;
221             }
222                         
223             var result = '';
224             $.each($.ajatus.i10n.inflector.inflection.uncountable, function(i,uncountable){
225                 if (word.toLowerCase() == uncountable) {
226                     result = uncountable;
227                 }
228             });
229             if (result != '') {
230                 return result;
231             }
232             $.each($.ajatus.i10n.inflector.inflection.irregular, function(i,irr){
233                 var singular = irr[0];
234                 var plural = irr[1];
235                 if ((word.toLowerCase() == singular) || (word == plural)) {
236                     result = plural;
237                 }
238             });
239             if (result != '') {
240                 return result;
241             }
242             $.each($.ajatus.i10n.inflector.inflection.plural, function(i,plur){
243                 var regex = plur[0];
244                 var replace_string = plur[1];
245                 if (regex.test(word)) {
246                     result = word.replace(regex, replace_string);
247                 }
248             });
249             if (result != '') {
250                 return result;
251             }
252             
253             return word;
254         },
255         singularize: function(word) {
256             $.ajatus.i10n.inflector._get_inflector();
257             if ($.ajatus.i10n.inflector.inflection == false) {
258                 return word;
259             }
260             
261             var result = '';
262             
263             $.each($.ajatus.i10n.inflector.inflection.uncountable, function(i,uncountable){
264                 if (word.toLowerCase() == uncountable) {
265                     result = uncountable;
266                 }
267             });
268             if (result != '') {
269                 return result;
270             }
271             $.each($.ajatus.i10n.inflector.inflection.irregular, function(i,irr){
272                 var singular = irr[0];
273                 var plural = irr[1];
274                 if ((word.toLowerCase() == singular) || (word == plural)) {
275                     result = plural;
276                 }
277             });
278             if (result != '') {
279                 return result;
280             }
281             $.each($.ajatus.i10n.inflector.inflection.singular, function(i,sing){
282                 var regex = sing[0];
283                 var replace_string = sing[1];
284                 if (regex.test(word)) {
285                     result = word.replace(regex, replace_string);
286                 }
287             });
288             if (result != '') {
289                 return result;
290             }
291             
292             return word;
293         },
294         _get_inflector: function(lng) {
295             var lang = lng || $.ajatus.i10n.lang;
296             
297             if ($.ajatus.i10n.inflector.inflection == null) {
298                 if (typeof($.ajatus.i10n.inflections[lang]) == 'undefined') {
299                     $.ajatus.i10n.inflector.inflection = false;
300                 } else {
301                     $.ajatus.i10n.inflector.inflection = $.ajatus.i10n.inflections[lang];            
302                 }                
303             }
304         }
305     });
306     
307 })(jQuery);