Fixed timed event check
[ajatus.git] / js / ajatus.i10n.js
blob9629d7313ef9da4a1d08233f21f5466381d7416d
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         _after_init: null
32     };
33     $.extend($.ajatus.i10n, {
34         init: function(lang, after_init) {
35             $.ajatus.i10n.lang = lang || 'en_GB';
36             $.ajatus.i10n._after_init = after_init;
37             $.ajatus.i10n._load_lang($.ajatus.i10n.lang);
38         },
39         get_available_langs: function(force_refresh) {
40             if (typeof force_refresh == 'undefined') {
41                 var force_refresh = false;
42             }            
43             var refresh = false;
44             
45             if ($.ajatus.i10n.available == null) {
46                 $.ajatus.i10n.available = [];
47                 refresh = true;
48             }
49             
50             if (   refresh
51                 || force_refresh)
52             {
53                 // TODO: Somehow get all available translations from js/languages -folder
54                 $.ajatus.i10n.available = [
55                     'en_GB', 
56                     'fi_FI',
57                     'hu_HU',
58                     'nl_NL',
59                     'pl_PL',
60                     'pt_BR',
61                     'sv_SE'
62                 ];
63             }
65             return $.ajatus.i10n.available;
66         },
67         get: function() { //string, keys, pluralize_key            
68             if (arguments.length < 1) {
69                 return;
70             }
71             
72             var string = new String();
73             var trans_key = arguments[0].toString().toLowerCase();
74             trans_key = $.trim(trans_key);
75             //$.ajatus.debug("get "+trans_key, "ajatus.i10n");
76             
77             var replace_args = [];
78             if (   arguments.length > 1
79                 && typeof(arguments[1]) == 'object')
80             {
81                 replace_args = arguments[1];
82             }            
84             var auto_plural = false;
85             if (arguments.length < 3) {
86                 auto_plural = true;
87             }
88             
89             if (typeof($.ajatus.i10n.dict[trans_key]) != 'undefined') {                
90                 string = String($.ajatus.i10n.dict[trans_key]);
91             } else {
92                 string = arguments[0].toString();
93             }
94             
95             if (replace_args.length > 0) {
96                 string = $.ajatus.i10n.format_result(string, replace_args, auto_plural);
97             }
98             
99             if (   arguments.length > 2
100                 && typeof(arguments[2]) == 'string')
101             {
102                 string = $.ajatus.i10n.plural(string, arguments[2]);
103             }
105             var curr_s = "%_CURR_S";
106             var curr_n = "%_CURR_N";
107             var s_re = new RegExp(curr_s, "i");
108             var n_re = new RegExp(curr_n, "i");
109             if (string.match(s_re)) {
110                 var re = new RegExp(curr_s, "gi");
111                 string = string.replace(re, $.ajatus.i10n.get_currency().symbol);
112             }
113             if (string.match(n_re)) {
114                 var re = new RegExp(curr_n, "gi");
115                 string = string.replace(re, $.ajatus.i10n.get_currency().symbol);
116             }
117             // $.ajatus.debug("return "+string, "ajatus.i10n");
118             if ($.browser.safari) {
119                 return $.ajatus.utils.utf8.decode(string);
120             }
121             
122             return string;
123         },
124         get_currency: function() {
125             if (arguments.length > 0) {
126                 switch (arguments[0]) {
127                     case 'name':
128                         return $.ajatus.i10n.currency.name;
129                     break;
130                     case 'symbol':
131                         return $.ajatus.i10n.currency.name;
132                     break;
133                     case 'both':
134                         return $.ajatus.i10n.currency;
135                     break;
136                 }
137             }
138             return $.ajatus.i10n.currency;
139         },
140         format_result: function(string, args, auto_plural) {
141             if (typeof auto_plural == 'undefined') {
142                 var auto_plural = true;
143             }
144             $.each(args, function(i,value){
145                 var key = $.ajatus.i10n._resolve_replace_type(value);
146                 if (   key == '%d'
147                     && auto_plural)
148                 {
149                     if (typeof value != 'number') {
150                         value = 'null';
151                     }
152                     var re = new RegExp(/\b[%]?d.(\w+)\b/);
153                     var m = re.exec(string);
154                     if (m != null) {
155                         var sing = m[(m.length-1)];
156                         var plural = $.ajatus.i10n.inflector.pluralize(sing);
157                         string = string.toString().replace(sing, plural);
158                     }
159                 }
160                 string = string.toString().replace(key, value);
161             });
162             return string;
163         },
164         plural: function(string, key) {
165             if (typeof key == 'undefined') {
166                 var key = string;
167             }
168             
169             var plural_key = $.ajatus.i10n.inflector.pluralize(key);
170                         
171             var result = string.toString().replace(key, plural_key);
172             
173             return result;
174         },
175         _resolve_replace_type: function(value) {
176             if (typeof value == 'string') {
177                 return '%s';
178             }
179             if (typeof value == 'number') {
180                 return '%d';
181             }
182             
183             return '%s';
184         },
185         _load_lang: function(lang) {
186             if (   typeof lang == 'undefined'
187                 || lang == '')
188             {
189                 return;
190             }
192             $.ajaxSetup({
193                 async: false
194             });
195             $.ajatus.events.lock_pool.increase();
196             
197             var lang_url = $.ajatus.preferences.client.application_url + 'js/languages/'+lang+'.js';
198             $.ajatus.utils.load_script(lang_url, "$.ajatus.i10n._lang_loaded", [lang]);
199         },
200         _lang_loaded: function(lang) {
201             $.ajaxSetup({
202                 async: true
203             });
204             $.ajatus.i10n.initialized = true;
205             $.ajatus.events.lock_pool.decrease();
206             
207             $.ajatus.i10n._after_init.apply($.ajatus.i10n._after_init, []);
208         }
209     });
210     
211     $.ajatus.i10n.inflections = {};
212     $.ajatus.i10n.inflector = {
213         inflection: null
214     };
215     $.extend($.ajatus.i10n.inflector, {        
216         ordinalize: function(number) {
217             $.ajatus.i10n.inflector._get_inflector();
218             if ($.ajatus.i10n.inflector.inflection == false) {
219                 return number;
220             }
221                         
222             if (typeof ($.ajatus.i10n.inflector.inflection['ordinalize']) == 'function') {
223                 return $.ajatus.i10n.inflector.inflection.ordinalize(number);
224             }
225             return number;
226         },
227         pluralize: function(word) {
228             $.ajatus.i10n.inflector._get_inflector();
229             if ($.ajatus.i10n.inflector.inflection == false) {
230                 return word;
231             }
232                         
233             var result = '';
234             $.each($.ajatus.i10n.inflector.inflection.uncountable, function(i,uncountable){
235                 if (word.toLowerCase() == uncountable) {
236                     result = uncountable;
237                 }
238             });
239             if (result != '') {
240                 return result;
241             }
242             $.each($.ajatus.i10n.inflector.inflection.irregular, function(i,irr){
243                 var singular = irr[0];
244                 var plural = irr[1];
245                 if ((word.toLowerCase() == singular) || (word == plural)) {
246                     result = plural;
247                 }
248             });
249             if (result != '') {
250                 return result;
251             }
252             $.each($.ajatus.i10n.inflector.inflection.plural, function(i,plur){
253                 var regex = plur[0];
254                 var replace_string = plur[1];
255                 if (regex.test(word)) {
256                     result = word.replace(regex, replace_string);
257                 }
258             });
259             if (result != '') {
260                 return result;
261             }
262             
263             return word;
264         },
265         singularize: function(word) {
266             $.ajatus.i10n.inflector._get_inflector();
267             if ($.ajatus.i10n.inflector.inflection == false) {
268                 return word;
269             }
270             
271             var result = '';
272             
273             $.each($.ajatus.i10n.inflector.inflection.uncountable, function(i,uncountable){
274                 if (word.toLowerCase() == uncountable) {
275                     result = uncountable;
276                 }
277             });
278             if (result != '') {
279                 return result;
280             }
281             $.each($.ajatus.i10n.inflector.inflection.irregular, function(i,irr){
282                 var singular = irr[0];
283                 var plural = irr[1];
284                 if ((word.toLowerCase() == singular) || (word == plural)) {
285                     result = plural;
286                 }
287             });
288             if (result != '') {
289                 return result;
290             }
291             $.each($.ajatus.i10n.inflector.inflection.singular, function(i,sing){
292                 var regex = sing[0];
293                 var replace_string = sing[1];
294                 if (regex.test(word)) {
295                     result = word.replace(regex, replace_string);
296                 }
297             });
298             if (result != '') {
299                 return result;
300             }
301             
302             return word;
303         },
304         _get_inflector: function(lng) {
305             var lang = lng || $.ajatus.i10n.lang;
306             
307             if ($.ajatus.i10n.inflector.inflection == null) {
308                 if (typeof($.ajatus.i10n.inflections[lang]) == 'undefined') {
309                     $.ajatus.i10n.inflector.inflection = false;
310                 } else {
311                     $.ajatus.i10n.inflector.inflection = $.ajatus.i10n.inflections[lang];            
312                 }                
313             }
314         }
315     });
316     
317 })(jQuery);