Skip to content
This repository has been archived by the owner on Jan 29, 2024. It is now read-only.

Commit

Permalink
feat(module): use same fallback for module.run when no storage key is…
Browse files Browse the repository at this point in the history
… set

and not being able to load locale from storage

By @greckin

Closes #739
  • Loading branch information
greckin authored and knalli committed Oct 21, 2014
1 parent ef6a613 commit 247253d
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 10 deletions.
23 changes: 13 additions & 10 deletions src/translate.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,22 @@ angular.module('pascalprecht.translate', ['ng'])
var key = $translate.storageKey(),
storage = $translate.storage();

var fallbackFromIncorrectStorageValue = function() {
var preferred = $translate.preferredLanguage();
if (angular.isString(preferred)) {
$translate.use(preferred);
// $translate.use() will also remember the language.
// So, we don't need to call storage.put() here.
} else {
storage.put(key, $translate.use());
}
};

if (storage) {
if (!storage.get(key)) {

if (angular.isString($translate.preferredLanguage())) {
$translate.use($translate.preferredLanguage());
// $translate.use() will also remember the language.
// So, we don't need to call storage.put() here.
} else {
storage.put(key, $translate.use());
}

fallbackFromIncorrectStorageValue();
} else {
$translate.use(storage.get(key));
$translate.use(storage.get(key))['catch'](fallbackFromIncorrectStorageValue);
}
} else if (angular.isString($translate.preferredLanguage())) {
$translate.use($translate.preferredLanguage());
Expand Down
102 changes: 102 additions & 0 deletions test/unit/translate.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
describe('pascalprecht.translate', function () {

describe('$translateModule#run', function () {

describe('with no storage', function() {

describe('and no preferred language', function() {

beforeEach(module('pascalprecht.translate'));

it('should set used locale to undefined', inject(function($translate) {
expect($translate.use()).toBeUndefined();
}));
});

describe('but with a preferred language', function() {

beforeEach(module('pascalprecht.translate', function ($translateProvider) {
$translateProvider.preferredLanguage('en');
}));

it('should use preferredLanguage', inject(function($translate) {
expect($translate.use()).toEqual('en');
}));
});
});

describe('with a storage', function() {

var storage;
var storageMockCreator = function(storageValue) {
var storage = jasmine.createSpyObj('storage', ['get', 'set']);
storage.get.andReturn(storageValue);
return storage;
};

describe('containing value', function() {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
storage = storageMockCreator('en');
$provide.value('storageMock', storage);

$translateProvider
.useStorage('storageMock')
.preferredLanguage('de');
}));

it('should use value from storage when provided', inject(function($translate) {
expect(storage.get).toHaveBeenCalled();
expect($translate.use()).toEqual('en');
}));
});

describe('but not containing any value', function() {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
storage = storageMockCreator(undefined);
$provide.value('storageMock', storage);

$translateProvider
.useStorage('storageMock')
.preferredLanguage('de');
}));

it('should fallback to preferred locale', inject(function($translate) {
expect(storage.get).toHaveBeenCalled();
expect($translate.use()).toEqual('de');
}));
});

describe('but with no loadable translations', function() {

beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) {
storage = storageMockCreator('en');
$provide.value('storageMock', storage);
$provide.factory('loaderMock', function($q) {
return function(options) {
if(options.key === 'en') {
return $q.reject('en');
} else if(options.key === 'de')
return $q.when({
key: 'de',
table: {}
});
}
});

$translateProvider
.useStorage('storageMock')
.useLoader('loaderMock')
.preferredLanguage('de');
}));

it('should fallback to preferred locale', inject(function($translate, $rootScope) {
$rootScope.$digest();
expect(storage.get).toHaveBeenCalled();
expect($translate.use()).toEqual('de');
}));
});
});
});
});

0 comments on commit 247253d

Please sign in to comment.