From cce897a34a2087c6799cd11889bc90db3c56f227 Mon Sep 17 00:00:00 2001 From: Thorsten Spaeth Date: Mon, 6 Oct 2014 15:52:55 +0200 Subject: [PATCH] fix(service): fallback languages follow shortcuts (fixes #758) --- src/service/translate.js | 11 +++- test/unit/service/translate.spec.js | 87 ++++++++++++++++++++++++++++- 2 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/service/translate.js b/src/service/translate.js index 4c09e1684..1efd9dc60 100644 --- a/src/service/translate.js +++ b/src/service/translate.js @@ -1074,7 +1074,13 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY', getTranslationTable(langKey).then(function (translationTable) { if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) { Interpolator.setLocale(langKey); - deferred.resolve(Interpolator.interpolate(translationTable[translationId], interpolateParams)); + var translation = translationTable[translationId]; + if (translation.substr(0, 2) === '@:') { + getFallbackTranslation(langKey, translation.substr(2), interpolateParams, Interpolator) + .then(deferred.resolve, deferred.reject); + } else { + deferred.resolve(Interpolator.interpolate(translationTable[translationId], interpolateParams)); + } Interpolator.setLocale($uses); } else { deferred.reject(); @@ -1104,6 +1110,9 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY', if (translationTable && Object.prototype.hasOwnProperty.call(translationTable, translationId)) { Interpolator.setLocale(langKey); result = Interpolator.interpolate(translationTable[translationId], interpolateParams); + if (result.substr(0, 2) === '@:') { + return getFallbackTranslationInstant(langKey, result.substr(2), interpolateParams, Interpolator); + } Interpolator.setLocale($uses); } diff --git a/test/unit/service/translate.spec.js b/test/unit/service/translate.spec.js index 9f285d2a1..70226ccdd 100644 --- a/test/unit/service/translate.spec.js +++ b/test/unit/service/translate.spec.js @@ -1578,7 +1578,7 @@ describe('pascalprecht.translate', function () { expect($translate.instant('FOO')).toEqual('bar'); }); - it('should return translation id if translation id nost exist', function () { + it('should return translation id if translation id not exist', function () { expect($translate.instant('FOO2')).toEqual('FOO2'); }); @@ -1644,4 +1644,89 @@ describe('pascalprecht.translate', function () { expect($translate.instant('FOO4 {{value}}', {'value': 'PARAM'})).toEqual('FOO4 PARAM'); }); }); + + describe('$translate#determineTranslation with fallback for shortcuts', function () { + + var missingTranslations = {}; + + beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) { + $translateProvider + .translations('en', { + 'NAMESPACE1': + { + 'SUBSPACE1': + { + 'FOO': 'Translation1', + 'BAR': 'Translation2', + 'SUBSPACE1': 'Subtrans' + } + } + }) + .translations('de', { + 'FOO': 'Ich bin ein Foo' + }) + .translations('fr', { + 'NAMESPACE1': { + 'SUBSPACE1': { + 'FOO': 'Translation1 Francais', + 'BAR': 'Translation2 Francais', + 'SUBSPACE1': 'Subtrans', + 'SUBSPACE2': 'Subtrans un a deux' + }, + 'SUBSPACE_FR': { + 'SUBSPACE_FR': 'Francais angular' + }, + 'FALLBACK': '@:NAMESPACE1.SUBSPACE1.FOO' + } + }) + .fallbackLanguage(['de', 'fr']) + .preferredLanguage('en'); + + + })); + + var $translate, $q, $rootScope; + + beforeEach(inject(function (_$translate_, _$q_, _$rootScope_) { + $translate = _$translate_; + $q = _$q_; + $rootScope = _$rootScope_; + })); + + it('should invoke the translation method and return the sh1ortcut translation value', function () { + var deferred = $q.defer(), + promise = deferred.promise, + value; + + promise.then(function (foo) { + value = foo; + }); + $translate('NAMESPACE1.SUBSPACE1').then(function (translation) { + deferred.resolve(translation); + }); + $rootScope.$digest(); + expect(value).toEqual('Subtrans'); + }); + + it('should invoke the translation fallback stack and return the resolved french shortcut', function () { + var deferred = $q.defer(), + promise = deferred.promise, + value; + + promise.then(function (foo) { + value = foo; + }); + $translate('NAMESPACE1.SUBSPACE_FR').then(function (translation) { + deferred.resolve(translation); + }); + $rootScope.$digest(); + expect(value).toEqual('Francais angular'); + }); + + it('should invoke the translation fallback stack and return the resolved at syntax based shortcut', function () { + expect($translate.instant('NAMESPACE1.FALLBACK')).toBe('Translation1 Francais'); + }); + + }); + });