Skip to content

Commit 6f2c8f5

Browse files
localizedMessages service
1 parent 6507541 commit 6f2c8f5

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
angular.module('services.localizedMessages', []).factory('localizedMessages', ['$locale', '$interpolate', 'I18N.MESSAGES', 'I18N.DEFAULT_LOCALE', function ($locale, $interpolate, i18nmessages, i18ndefaultLocale) {
2+
3+
var defaultLocale = i18ndefaultLocale;
4+
var getForLocale = function(locale, msgKey, handleNotFound) {
5+
return (i18nmessages[locale] || {})[msgKey];
6+
};
7+
8+
var handleNotFound = function(msg, msgKey) {
9+
return msg || '?'+msgKey+'?';
10+
};
11+
12+
var msgService = {};
13+
msgService.get = function(msgKey, interpolateParams) {
14+
return msgService.getForLocale(msgKey, $locale.id, interpolateParams)
15+
};
16+
17+
msgService.getForLocale = function(msgKey, locale, interpolateParams) {
18+
var msgForLocale = getForLocale(locale || $locale.id, msgKey);
19+
if (!msgForLocale && locale !== defaultLocale) {
20+
msgForLocale = getForLocale(defaultLocale, msgKey, true);
21+
}
22+
23+
if (msgForLocale) {
24+
return $interpolate(msgForLocale)(interpolateParams);
25+
} else {
26+
return handleNotFound(msgForLocale, msgKey);
27+
}
28+
};
29+
30+
return msgService;
31+
}]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
describe('localized messages', function () {
2+
3+
var $locale, localizedMessages, messages;
4+
beforeEach(function () {
5+
angular.module('test',['services.localizedMessages'])
6+
.value('I18N.MESSAGES', messages = {})
7+
.constant('I18N.DEFAULT_LOCALE', 'en-us');
8+
module('test');
9+
});
10+
beforeEach(inject(function (_$locale_, _localizedMessages_) {
11+
$locale = _$locale_;
12+
localizedMessages = _localizedMessages_;
13+
}));
14+
15+
describe('messages for the current locale', function () {
16+
17+
it('should return a localized message if defined', function () {
18+
messages['en-us'] = {existing:'Existing message!'};
19+
expect(localizedMessages.get('existing')).toEqual('Existing message!');
20+
});
21+
22+
it('should return a message key surrounded by a question mark for non-existing messages', function () {
23+
expect(localizedMessages.get('non.existing')).toEqual('?non.existing?');
24+
});
25+
});
26+
27+
describe('messages for a specified locale', function () {
28+
29+
it('should return a message for a specified locale if exists', function () {
30+
messages['fr-fr'] = {sth:'quelque chose'};
31+
expect(localizedMessages.getForLocale('sth', 'fr-fr')).toEqual('quelque chose');
32+
});
33+
34+
it('should return a message from the default locale if doesnt exist in a specified one', function () {
35+
messages['en-us'] = {sth:'something'};
36+
expect(localizedMessages.getForLocale('sth', 'fr-fr')).toEqual('something');
37+
});
38+
39+
it('should allow using forLocale even for the current locale', function () {
40+
messages['en-us'] = {sth:'something'};
41+
expect(localizedMessages.getForLocale('sth', 'en-us')).toEqual('something');
42+
});
43+
44+
it('should return a message key surrounded by a question mark for non-existing messages when locale was specified', function () {
45+
expect(localizedMessages.getForLocale('sth', 'fr-fr')).toEqual('?sth?');
46+
});
47+
});
48+
49+
describe('interpolation of message parameters', function () {
50+
51+
it('should interpolate parameters for the current locale', function () {
52+
messages['en-us'] = {sth:'en {{param}} us'};
53+
expect(localizedMessages.get('sth', {param:'value'})).toEqual('en value us');
54+
});
55+
56+
it('should interpolate parameters for a specified locale', function () {
57+
messages['en-us'] = {sth:'en {{param}} us'};
58+
expect(localizedMessages.getForLocale('sth', 'en-us', {param:'value'})).toEqual('en value us');
59+
});
60+
61+
it('should not break for missing params', function () {
62+
messages['en-us'] = {sth:'en {{param}} us'};
63+
expect(localizedMessages.getForLocale('sth', 'en-us')).toEqual('en us');
64+
expect(localizedMessages.getForLocale('sth', 'en-us', {other:'value'})).toEqual('en us');
65+
66+
expect(localizedMessages.get('sth')).toEqual('en us');
67+
expect(localizedMessages.get('sth', {other:'value'})).toEqual('en us');
68+
});
69+
70+
});
71+
});

0 commit comments

Comments
 (0)