From 02688f2be63d8e2ac81524e7296b7d2052bd1006 Mon Sep 17 00:00:00 2001 From: Thorsten Spaeth Date: Mon, 7 Mar 2016 23:32:56 +0100 Subject: [PATCH] fix(service): fix edge-case with .use() and .preferredLanguage() Fix and cover edge case where fallback language is set and preferred language is determined. but use is not explicitly called before calling the $translate service --- src/service/translate.js | 4 +- test/unit/service/translate.spec.js | 61 +++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/service/translate.js b/src/service/translate.js index 565b3145d..e44a27ef8 100644 --- a/src/service/translate.js +++ b/src/service/translate.js @@ -1021,7 +1021,9 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide startFallbackIteration; var $translate = function (translationId, interpolateParams, interpolationId, defaultTranslationText, forceLanguage) { - + if (!$uses && $preferredLanguage) { + $uses = $preferredLanguage; + } var uses = (forceLanguage && forceLanguage !== $uses) ? // we don't want to re-negotiate $uses (negotiateLocale(forceLanguage) || forceLanguage) : $uses; diff --git a/test/unit/service/translate.spec.js b/test/unit/service/translate.spec.js index 60277e184..d60cd28fd 100644 --- a/test/unit/service/translate.spec.js +++ b/test/unit/service/translate.spec.js @@ -2789,4 +2789,65 @@ describe('pascalprecht.translate', function () { }); }); }); + + // Spec for edge case: preferred language is not found + // but another fallback language has a translation file available + // or any other async case + describe('$translate with async loading having an invalid preferredLang and one fallbackLang existing', function () { + + var theFallbackLangKey = 'en_US', + thePreferredLangKey = 'ab_CD', + expectedTranslation = 'foo bar bork bork bork', + firstLanguageResponded = false, + secondLanguageResponded = false; + + beforeEach(module('pascalprecht.translate', function ($translateProvider, $provide) { + + $translateProvider.useLoader('customLoader'); + + $translateProvider.preferredLanguage(thePreferredLangKey); + $translateProvider.fallbackLanguage(theFallbackLangKey); + + $provide.service('customLoader', function ($q, $timeout) { + return function (options) { + var deferred = $q.defer(); + var locale = options.key; + + if (locale === theFallbackLangKey) { + secondLanguageResponded = true; + deferred.resolve({ + greeting: expectedTranslation + }); + } + + if (locale === thePreferredLangKey) { + deferred.reject(thePreferredLangKey); + } + + return deferred.promise; + }; + }); + })); + + var $translate; + + beforeEach(inject(function ($timeout, _$translate_, $rootScope) { + $translate = _$translate_; + $rootScope.$digest(); + + })); + + it('should set the language to be the most recently requested one, not the most recently responded one', inject(function ($rootScope, $q) { + + var value; + + $translate('greeting').then(function (translation) { + value = translation; + }); + + $rootScope.$digest(); + expect(value).toEqual(expectedTranslation); + expect(secondLanguageResponded).toEqual(true); + })); + }); });