From 26ec3088bcc50bacb8370e352e556d4e48830b64 Mon Sep 17 00:00:00 2001 From: Manuel Ohlendorf Date: Fri, 7 Mar 2014 15:23:47 +0100 Subject: [PATCH] fix($translate): use case-insensitive check for language key aliases When language key aliases are available they are now compared to the browsers locale in a case-insensitive manner. Closes Issue #431 --- src/service/translate.js | 14 ++++++---- test/unit/service/translate.spec.js | 43 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/service/translate.js b/src/service/translate.js index 82b4bbc02..7557ecdda 100644 --- a/src/service/translate.js +++ b/src/service/translate.js @@ -60,12 +60,14 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY', } if ($languageKeyAliases) { - - if ($languageKeyAliases[preferred]) { - var alias = $languageKeyAliases[preferred]; - - if (avail.indexOf(angular.lowercase(alias)) > -1) { - return alias; + var alias; + for (var langKeyAlias in $languageKeyAliases) { + if ($languageKeyAliases.hasOwnProperty(langKeyAlias) && + angular.lowercase(langKeyAlias) === angular.lowercase(preferred)) { + alias = $languageKeyAliases[langKeyAlias]; + if (avail.indexOf(angular.lowercase(alias)) > -1) { + return alias; + } } } } diff --git a/test/unit/service/translate.spec.js b/test/unit/service/translate.spec.js index e831f67f9..60d7046ea 100644 --- a/test/unit/service/translate.spec.js +++ b/test/unit/service/translate.spec.js @@ -1158,6 +1158,49 @@ describe('pascalprecht.translate', function () { }); }); }); + + describe('with locale negotiation and lower-case navigation language', function () { + + beforeEach(module('pascalprecht.translate', function ($translateProvider) { + $translateProvider + .translations('en', { FOO: 'bar' }) + .translations('de', { FOO: 'foo' }) + .registerAvailableLanguageKeys(['en', 'de'], { + 'en_US': 'en', + 'de_DE': 'de' + }) + .determinePreferredLanguage(function () { + // mocking + // Work's like `window.navigator.lang = 'en_US'` + var nav = { + language: 'en_us' + }; + return (( + nav.language || + nav.browserLanguage || + nav.systemLanguage || + nav.userLanguage + ) || '').split('-').join('_'); + }); + })); + + it('should determine browser language', function () { + inject(function ($translate, $q, $rootScope) { + var deferred = $q.defer(), + promise = deferred.promise, + value; + + promise.then(function (foo) { + value = foo; + }); + $translate('FOO').then(function (translation) { + deferred.resolve(translation); + }); + $rootScope.$digest(); + expect(value).toEqual('bar'); + }); + }); + }); }); describe('$translate.instant', function () {