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

Commit

Permalink
fix(directive, service): return value of translate-default also in ca…
Browse files Browse the repository at this point in the history
…se fallback languages are used - related to #765 (replaces #767)
  • Loading branch information
tspaeth authored and knalli committed Jan 11, 2015
1 parent 36402de commit fcd6b3e
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 17 deletions.
6 changes: 3 additions & 3 deletions src/directive/translate.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,14 +194,14 @@ angular.module('pascalprecht.translate')
var updateTranslations = function () {
for (var key in translationIds) {
if (translationIds.hasOwnProperty(key) && translationIds[key]) {
updateTranslation(key, translationIds[key], scope, scope.interpolateParams);
updateTranslation(key, translationIds[key], scope, scope.interpolateParams, scope.defaultText);
}
}
};

// Put translation processing function outside loop
var updateTranslation = function(translateAttr, translationId, scope, interpolateParams) {
$translate(translationId, interpolateParams, translateInterpolation)
var updateTranslation = function(translateAttr, translationId, scope, interpolateParams, defaultTranslationText) {
$translate(translationId, interpolateParams, translateInterpolation, defaultTranslationText)
.then(function (translation) {
applyTranslation(translation, scope, true, translateAttr);
}, function (translationId) {
Expand Down
43 changes: 29 additions & 14 deletions src/service/translate.js
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
fallbackIndex,
startFallbackIteration;

var $translate = function (translationId, interpolateParams, interpolationId) {
var $translate = function (translationId, interpolateParams, interpolationId, defaultTranslationText) {

// Duck detection: If the first argument is an array, a bunch of translations was requested.
// The result is an object.
Expand All @@ -821,7 +821,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
deferred.resolve([translationId, value]);
};
// we don't care whether the promise was resolved or rejected; just store the values
$translate(translationId, interpolateParams, interpolationId).then(regardless, regardless);
$translate(translationId, interpolateParams, interpolationId, defaultTranslationText).then(regardless, regardless);
return deferred.promise;
};
for (var i = 0, c = translationIds.length; i < c; i++) {
Expand Down Expand Up @@ -878,10 +878,10 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
// no promise to wait for? okay. Then there's no loader registered
// nor is a one pending for language that comes from storage.
// We can just translate.
determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject);
determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText).then(deferred.resolve, deferred.reject);
} else {
promiseToWaitFor.then(function () {
determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject);
determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText).then(deferred.resolve, deferred.reject);
}, deferred.reject);
}
return deferred.promise;
Expand Down Expand Up @@ -1158,7 +1158,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
* @param Interpolator
* @returns {Q.promise} Promise that will resolve to the translation.
*/
var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) {
var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator, defaultTranslationText) {
var deferred = $q.defer();

if (fallbackLanguageIndex < $fallbackLanguage.length) {
Expand All @@ -1168,12 +1168,19 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
function () {
// Look in the next fallback language for a translation.
// It delays the resolving by passing another promise to resolve.
resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator).then(deferred.resolve);
resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator, defaultTranslationText).then(deferred.resolve);
}
);
} else {
// No translation found in any fallback language
deferred.resolve(translateByHandler(translationId));
// if a default translation text is set in the directive, then return this as a result
if (defaultTranslationText) {
deferred.resolve(defaultTranslationText);
} else {
// if no default translation is set and an error handler is defined, send it to the handler
// and then return the result
deferred.resolve(translateByHandler(translationId));
}
}
return deferred.promise;
};
Expand Down Expand Up @@ -1212,9 +1219,9 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
* @param Interpolator
* @returns {Q.promise} Promise, that resolves to the translation.
*/
var fallbackTranslation = function (translationId, interpolateParams, Interpolator) {
var fallbackTranslation = function (translationId, interpolateParams, Interpolator, defaultTranslationText) {
// Start with the fallbackLanguage with index 0
return resolveForFallbackLanguage((startFallbackIteration>0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator);
return resolveForFallbackLanguage((startFallbackIteration>0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, defaultTranslationText);
};

/**
Expand All @@ -1230,7 +1237,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
return resolveForFallbackLanguageInstant((startFallbackIteration>0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator);
};

var determineTranslation = function (translationId, interpolateParams, interpolationId) {
var determineTranslation = function (translationId, interpolateParams, interpolationId, defaultTranslationText) {

var deferred = $q.defer();

Expand All @@ -1244,7 +1251,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
// If using link, rerun $translate with linked translationId and return it
if (translation.substr(0, 2) === '@:') {

$translate(translation.substr(2), interpolateParams, interpolationId)
$translate(translation.substr(2), interpolateParams, interpolationId, defaultTranslationText)
.then(deferred.resolve, deferred.reject);
} else {
deferred.resolve(Interpolator.interpolate(translation, interpolateParams));
Expand All @@ -1260,7 +1267,7 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
// we try it now with one or more fallback languages, if fallback language(s) is
// configured.
if ($uses && $fallbackLanguage && $fallbackLanguage.length) {
fallbackTranslation(translationId, interpolateParams, Interpolator)
fallbackTranslation(translationId, interpolateParams, Interpolator, defaultTranslationText)
.then(function (translation) {
deferred.resolve(translation);
}, function (_translationId) {
Expand All @@ -1270,9 +1277,17 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
// looks like the requested translation id doesn't exists.
// Now, if there is a registered handler for missing translations and no
// asyncLoader is pending, we execute the handler
deferred.resolve(missingTranslationHandlerTranslation);
if (defaultTranslationText) {
deferred.resolve(defaultTranslationText);
} else {
deferred.resolve(missingTranslationHandlerTranslation);
}
} else {
deferred.reject(applyNotFoundIndicators(translationId));
if (defaultTranslationText) {
deferred.resolve(defaultTranslationText);
} else {
deferred.reject(applyNotFoundIndicators(translationId));
}
}
}
return deferred.promise;
Expand Down
49 changes: 49 additions & 0 deletions test/unit/service/translate.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,27 @@ describe('pascalprecht.translate', function () {
expect(value[1]).toEqual('');
});

it('should return translation if translation id exists and return a default value if not existing', function () {
var deferred = $q.defer(),
promise = deferred.promise,
value;
promise.then(function (translation) {
value = translation;
});

$q.all([
$translate("EXISTING_TRANSLATION_ID"),
$translate("NON_EXISTING_KEY", undefined, undefined, "Default Translation")
]).then(function (translations) {
deferred.resolve(translations);
});

$rootScope.$digest();
expect(value[0]).toEqual('foo');
expect(value[1]).toEqual('Default Translation');
});


it('should return translations of multiple translation ids if exists', function () {
var deferred = $q.defer(),
promise = deferred.promise,
Expand Down Expand Up @@ -784,6 +805,34 @@ describe('pascalprecht.translate', function () {
expect(value[3]).toEqual('it really does!');
expect(value[4]).toEqual('NO KEY FOUND');
});

it('should use fallback languages and return a default value for one of the translation keys', function () {
var deferred = $q.defer(),
promise = deferred.promise,
value;

promise.then(function (translations) {
value = translations;
});

$q.all([
$translate('EXISTING_TRANSLATION_ID'),
$translate('TRANSLATION__ID'),
$translate('SUPERTEST'),
$translate('YAY'),
$translate('NOT_EXISTING', undefined, undefined, 'Defaultvalue')
]).then(function (translations) {
deferred.resolve(translations);
});

$rootScope.$digest();

expect(value[0]).toEqual('foo');
expect(value[1]).toEqual('bazinga');
expect(value[2]).toEqual('it works!');
expect(value[3]).toEqual('it really does!');
expect(value[4]).toEqual('Defaultvalue');
});
});


Expand Down

0 comments on commit fcd6b3e

Please sign in to comment.