Skip to content

Commit 11f2dfc

Browse files
committed
gettextCatalogProvider
Closes #117, #138.
1 parent 1dae454 commit 11f2dfc

File tree

4 files changed

+294
-216
lines changed

4 files changed

+294
-216
lines changed

dist/angular-gettext.js

Lines changed: 180 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ angular.module('gettext').constant('gettext', function (str) {
1010
return str;
1111
});
1212

13-
angular.module('gettext').factory('gettextCatalog', ["gettextPlurals", "$http", "$cacheFactory", "$interpolate", "$rootScope", function (gettextPlurals, $http, $cacheFactory, $interpolate, $rootScope) {
14-
var catalog;
13+
angular.module('gettext').provider('gettextCatalog', ["gettextPlurals", function (gettextPlurals) {
1514
var noContext = '$$noContext';
1615

1716
// IE8 returns UPPER CASE tags, even though the source is lower case.
@@ -20,27 +19,7 @@ angular.module('gettext').factory('gettextCatalog', ["gettextPlurals", "$http",
2019
var test = '<span>test</span>';
2120
var isUpperCaseTags = (angular.element('<span>' + test + '</span>').html() !== test);
2221

23-
var prefixDebug = function (string) {
24-
if (catalog.debug && catalog.currentLanguage !== catalog.baseLanguage) {
25-
return catalog.debugPrefix + string;
26-
} else {
27-
return string;
28-
}
29-
};
30-
31-
var addTranslatedMarkers = function (string) {
32-
if (catalog.showTranslatedMarkers) {
33-
return catalog.translatedMarkerPrefix + string + catalog.translatedMarkerSuffix;
34-
} else {
35-
return string;
36-
}
37-
};
38-
39-
function broadcastUpdated() {
40-
$rootScope.$broadcast('gettextLanguageChanged');
41-
}
42-
43-
catalog = {
22+
var provider = {
4423
debug: false,
4524
debugPrefix: '[MISSING]: ',
4625
showTranslatedMarkers: false,
@@ -49,11 +28,9 @@ angular.module('gettext').factory('gettextCatalog', ["gettextPlurals", "$http",
4928
strings: {},
5029
baseLanguage: 'en',
5130
currentLanguage: 'en',
52-
cache: $cacheFactory('strings'),
5331

5432
setCurrentLanguage: function (lang) {
5533
this.currentLanguage = lang;
56-
broadcastUpdated();
5734
},
5835

5936
setStrings: function (language, strings) {
@@ -83,47 +60,86 @@ angular.module('gettext').factory('gettextCatalog', ["gettextPlurals", "$http",
8360
}
8461
this.strings[language][key] = val;
8562
}
86-
87-
broadcastUpdated();
8863
},
8964

9065
getStringForm: function (string, n, context) {
9166
var stringTable = this.strings[this.currentLanguage] || {};
9267
var contexts = stringTable[string] || {};
9368
var plurals = contexts[context || noContext] || [];
9469
return plurals[n];
95-
},
70+
}
71+
};
9672

97-
getString: function (string, scope, context) {
98-
string = this.getStringForm(string, 0, context) || prefixDebug(string);
99-
string = scope ? $interpolate(string)(scope) : string;
100-
return addTranslatedMarkers(string);
101-
},
73+
angular.extend(this, provider);
74+
75+
var self = this;
76+
this.$get = /* @ngInject */ ["$http", "$interpolate", "$cacheFactory", "$rootScope", function ($http, $interpolate, $cacheFactory, $rootScope) {
77+
function Catalog(options) {
78+
angular.extend(this, options);
79+
var self = this;
80+
81+
var prefixDebug = function (string) {
82+
if (self.debug && self.currentLanguage !== self.baseLanguage) {
83+
return self.debugPrefix + string;
84+
} else {
85+
return string;
86+
}
87+
};
10288

103-
getPlural: function (n, string, stringPlural, scope, context) {
104-
var form = gettextPlurals(this.currentLanguage, n);
105-
string = this.getStringForm(string, form, context) || prefixDebug(n === 1 ? string : stringPlural);
106-
if (scope) {
107-
scope.$count = n;
108-
string = $interpolate(string)(scope);
89+
var addTranslatedMarkers = function (string) {
90+
if (self.showTranslatedMarkers) {
91+
return self.translatedMarkerPrefix + string + self.translatedMarkerSuffix;
92+
} else {
93+
return string;
94+
}
95+
};
96+
97+
function broadcastUpdated() {
98+
$rootScope.$broadcast('gettextLanguageChanged');
10999
}
110-
return addTranslatedMarkers(string);
111-
},
112100

113-
loadRemote: function (url) {
114-
return $http({
115-
method: 'GET',
116-
url: url,
117-
cache: catalog.cache
118-
}).success(function (data) {
119-
for (var lang in data) {
120-
catalog.setStrings(lang, data[lang]);
101+
this.setCurrentLanguage = function () {
102+
options.setCurrentLanguage.apply(this, arguments);
103+
broadcastUpdated();
104+
};
105+
106+
this.setStrings = function () {
107+
options.setStrings.apply(this, arguments);
108+
broadcastUpdated();
109+
};
110+
111+
this.getString = function (string, scope, context) {
112+
string = this.getStringForm(string, 0, context) || prefixDebug(string);
113+
string = scope ? $interpolate(string)(scope) : string;
114+
return addTranslatedMarkers(string);
115+
};
116+
117+
this.getPlural = function (n, string, stringPlural, scope, context) {
118+
var form = gettextPlurals(this.currentLanguage, n);
119+
string = this.getStringForm(string, form, context) || prefixDebug(n === 1 ? string : stringPlural);
120+
if (scope) {
121+
scope.$count = n;
122+
string = $interpolate(string)(scope);
121123
}
122-
});
124+
return addTranslatedMarkers(string);
125+
};
126+
127+
this.loadRemote = function (url) {
128+
return $http({
129+
method: 'GET',
130+
url: url,
131+
cache: self.cache
132+
}).success(function (data) {
133+
for (var lang in data) {
134+
self.setStrings(lang, data[lang]);
135+
}
136+
});
137+
};
123138
}
124-
};
125139

126-
return catalog;
140+
self.cache = self.cache || $cacheFactory('strings');
141+
return new Catalog(self);
142+
}];
127143
}]);
128144

129145
angular.module('gettext').directive('translate', ["gettextCatalog", "$parse", "$animate", "$compile", "$window", function (gettextCatalog, $parse, $animate, $compile, $window) {
@@ -215,116 +231,117 @@ angular.module('gettext').filter('translate', ["gettextCatalog", function (gette
215231
}]);
216232

217233
// Do not edit this file, it is autogenerated using genplurals.py!
218-
angular.module("gettext").factory("gettextPlurals", function () {
219-
return function (langCode, n) {
220-
switch (langCode) {
221-
case "ay": // Aymará
222-
case "bo": // Tibetan
223-
case "cgg": // Chiga
224-
case "dz": // Dzongkha
225-
case "fa": // Persian
226-
case "id": // Indonesian
227-
case "ja": // Japanese
228-
case "jbo": // Lojban
229-
case "ka": // Georgian
230-
case "kk": // Kazakh
231-
case "km": // Khmer
232-
case "ko": // Korean
233-
case "ky": // Kyrgyz
234-
case "lo": // Lao
235-
case "ms": // Malay
236-
case "my": // Burmese
237-
case "sah": // Yakut
238-
case "su": // Sundanese
239-
case "th": // Thai
240-
case "tt": // Tatar
241-
case "ug": // Uyghur
242-
case "vi": // Vietnamese
243-
case "wo": // Wolof
244-
case "zh": // Chinese
245-
// 1 form
246-
return 0;
247-
case "is": // Icelandic
248-
// 2 forms
249-
return (n%10!=1 || n%100==11) ? 1 : 0;
250-
case "jv": // Javanese
251-
// 2 forms
252-
return n!=0 ? 1 : 0;
253-
case "mk": // Macedonian
254-
// 2 forms
255-
return n==1 || n%10==1 ? 0 : 1;
256-
case "ach": // Acholi
257-
case "ak": // Akan
258-
case "am": // Amharic
259-
case "arn": // Mapudungun
260-
case "br": // Breton
261-
case "fil": // Filipino
262-
case "fr": // French
263-
case "gun": // Gun
264-
case "ln": // Lingala
265-
case "mfe": // Mauritian Creole
266-
case "mg": // Malagasy
267-
case "mi": // Maori
268-
case "oc": // Occitan
269-
case "pt_BR": // Brazilian Portuguese
270-
case "tg": // Tajik
271-
case "ti": // Tigrinya
272-
case "tr": // Turkish
273-
case "uz": // Uzbek
274-
case "wa": // Walloon
275-
case "zh": // Chinese
276-
// 2 forms
277-
return n>1 ? 1 : 0;
278-
case "lv": // Latvian
279-
// 3 forms
280-
return (n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);
281-
case "lt": // Lithuanian
282-
// 3 forms
283-
return (n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);
284-
case "be": // Belarusian
285-
case "bs": // Bosnian
286-
case "hr": // Croatian
287-
case "ru": // Russian
288-
case "sr": // Serbian
289-
case "uk": // Ukrainian
290-
// 3 forms
291-
return (n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
292-
case "mnk": // Mandinka
293-
// 3 forms
294-
return (n==0 ? 0 : n==1 ? 1 : 2);
295-
case "ro": // Romanian
296-
// 3 forms
297-
return (n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);
298-
case "pl": // Polish
299-
// 3 forms
300-
return (n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
301-
case "cs": // Czech
302-
case "sk": // Slovak
303-
// 3 forms
304-
return (n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;
305-
case "sl": // Slovenian
306-
// 4 forms
307-
return (n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);
308-
case "mt": // Maltese
309-
// 4 forms
310-
return (n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);
311-
case "gd": // Scottish Gaelic
312-
// 4 forms
313-
return (n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;
314-
case "cy": // Welsh
315-
// 4 forms
316-
return (n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;
317-
case "kw": // Cornish
318-
// 4 forms
319-
return (n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3;
320-
case "ga": // Irish
321-
// 5 forms
322-
return n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4;
323-
case "ar": // Arabic
324-
// 6 forms
325-
return (n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5);
326-
default: // Everything else
327-
return n != 1 ? 1 : 0;
328-
}
234+
angular.module("gettext").constant("gettextPlurals", function (langCode, n) {
235+
switch (langCode) {
236+
case "ay": // Aymará
237+
case "bo": // Tibetan
238+
case "cgg": // Chiga
239+
case "dz": // Dzongkha
240+
case "fa": // Persian
241+
case "id": // Indonesian
242+
case "ja": // Japanese
243+
case "jbo": // Lojban
244+
case "ka": // Georgian
245+
case "kk": // Kazakh
246+
case "km": // Khmer
247+
case "ko": // Korean
248+
case "ky": // Kyrgyz
249+
case "lo": // Lao
250+
case "ms": // Malay
251+
case "my": // Burmese
252+
case "sah": // Yakut
253+
case "su": // Sundanese
254+
case "th": // Thai
255+
case "tt": // Tatar
256+
case "ug": // Uyghur
257+
case "vi": // Vietnamese
258+
case "wo": // Wolof
259+
case "zh": // Chinese
260+
// 1 form
261+
return 0;
262+
case "is": // Icelandic
263+
// 2 forms
264+
return (n%10!=1 || n%100==11) ? 1 : 0;
265+
case "jv": // Javanese
266+
// 2 forms
267+
return n!=0 ? 1 : 0;
268+
case "mk": // Macedonian
269+
// 2 forms
270+
return n==1 || n%10==1 ? 0 : 1;
271+
case "ach": // Acholi
272+
case "ak": // Akan
273+
case "am": // Amharic
274+
case "arn": // Mapudungun
275+
case "br": // Breton
276+
case "fil": // Filipino
277+
case "fr": // French
278+
case "gun": // Gun
279+
case "ln": // Lingala
280+
case "mfe": // Mauritian Creole
281+
case "mg": // Malagasy
282+
case "mi": // Maori
283+
case "oc": // Occitan
284+
case "pt_BR": // Brazilian Portuguese
285+
case "tg": // Tajik
286+
case "ti": // Tigrinya
287+
case "tr": // Turkish
288+
case "uz": // Uzbek
289+
case "wa": // Walloon
290+
case "zh": // Chinese
291+
// 2 forms
292+
return n>1 ? 1 : 0;
293+
case "lv": // Latvian
294+
// 3 forms
295+
return (n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);
296+
case "lt": // Lithuanian
297+
// 3 forms
298+
return (n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);
299+
case "be": // Belarusian
300+
case "bs": // Bosnian
301+
case "hr": // Croatian
302+
case "ru": // Russian
303+
case "sr": // Serbian
304+
case "uk": // Ukrainian
305+
// 3 forms
306+
return (n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
307+
case "mnk": // Mandinka
308+
// 3 forms
309+
return (n==0 ? 0 : n==1 ? 1 : 2);
310+
case "ro": // Romanian
311+
// 3 forms
312+
return (n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);
313+
case "pl": // Polish
314+
// 3 forms
315+
return (n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
316+
case "cs": // Czech
317+
case "sk": // Slovak
318+
// 3 forms
319+
return (n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;
320+
case "csb": // Kashubian
321+
// 3 forms
322+
return (n==1) ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
323+
case "sl": // Slovenian
324+
// 4 forms
325+
return (n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);
326+
case "mt": // Maltese
327+
// 4 forms
328+
return (n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);
329+
case "gd": // Scottish Gaelic
330+
// 4 forms
331+
return (n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;
332+
case "cy": // Welsh
333+
// 4 forms
334+
return (n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;
335+
case "kw": // Cornish
336+
// 4 forms
337+
return (n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3;
338+
case "ga": // Irish
339+
// 5 forms
340+
return (n==1) ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4;
341+
case "ar": // Arabic
342+
// 6 forms
343+
return (n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5);
344+
default: // Everything else
345+
return n != 1 ? 1 : 0;
329346
}
330347
});

0 commit comments

Comments
 (0)