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

Commit

Permalink
feat($translateProvider): adds registerAvailableLanguagesKeys for neg…
Browse files Browse the repository at this point in the history
…otiation

makes it possible to define available languages keys and possible aliases
to automatically determine locale.
  • Loading branch information
0x-r4bbit committed Dec 18, 2013
1 parent 7cbfabe commit 6bef6bd
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 15 deletions.
71 changes: 69 additions & 2 deletions src/service/translate.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',

var $translationTable = {},
$preferredLanguage,
$availableLanguageKeys = [],
$languageKeyAliases,
$fallbackLanguage,
$fallbackWasString,
$uses,
Expand Down Expand Up @@ -44,6 +46,39 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
return lang;
};

var negotiateLocale = function (preferred) {

var avail = [],
locale = angular.lowercase(preferred),
i = 0,
n = $availableLanguageKeys.length;

for (; i < n; i++) {
avail.push(angular.lowercase($availableLanguageKeys[i]));
}

if (avail.indexOf(locale) > -1) {
return locale;
}

if ($languageKeyAliases) {

if ($languageKeyAliases[preferred]) {
var alias = $languageKeyAliases[preferred];

if (avail.indexOf(angular.lowercase(alias)) > -1) {
return alias;
}
}
}

var parts = preferred.split('_');

if (parts.length > 1 && avail.indexOf(angular.lowercase(parts[0])) > 1) {
return parts[0];
}
};

/**
* @ngdoc function
* @name pascalprecht.translate.$translateProvider#translations
Expand Down Expand Up @@ -528,8 +563,40 @@ angular.module('pascalprecht.translate').provider('$translate', ['$STORAGE_KEY',
* @param {object=} fn Function to determine a browser's locale
*/
this.determinePreferredLanguage = function (fn) {
$preferredLanguage = (fn && angular.isFunction(fn)) ? fn() : getLocale();
return this;

var locale = (fn && angular.isFunction(fn)) ? fn() : getLocale();

if (!$availableLanguageKeys.length) {
$preferredLanguage = locale;
return this;
} else {
$preferredLanguage = negotiateLocale(locale);
}
};

/**
* @ngdoc function
* @name pascalprecht.translate.$translateProvider#registerAvailableLanguageKeys
* @methodOf pascalprecht.translate.$translateProvider
*
* @description
* Registers a set of language keys the app will work with. Use this method in
* combination with
* {@link pascalprecht.translate.$translateProvider#determinePreferredLanguage determinePreferredLanguage}. When available languages keys are registered, angular-translate
* tries to find the best fitting language key depending on the browsers locale,
* considering your language key convention.
*
* @param {object} languageKeys Array of language keys the your app will use
*/
this.registerAvailableLanguageKeys = function (languageKeys, aliases) {
if (languageKeys) {
$availableLanguageKeys = languageKeys;
if (aliases) {
$languageKeyAliases = aliases;
}
return this;
}
return $availableLanguageKeys;
};

/**
Expand Down
53 changes: 40 additions & 13 deletions test/unit/service/translate.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1650,22 +1650,49 @@ describe('pascalprecht.translate', function () {

describe('determineLanguage()', function () {

beforeEach(module('pascalprecht.translate', function ($translateProvider) {
$translateProvider.translations('en_US', {
FOO: 'bar'
});
describe('without locale negotiation', function () {
beforeEach(module('pascalprecht.translate', function ($translateProvider) {
$translateProvider.translations('en_US', {
FOO: 'bar'
});

$translateProvider.translations('de_DE', {
FOO: 'foo'
$translateProvider.translations('de_DE', {
FOO: 'foo'
});
$translateProvider.determinePreferredLanguage();
// mocking
window.navigator.lang = 'en_US';

This comment has been minimized.

Copy link
@knalli

knalli Dec 21, 2013

Member

typo? window.navigator.language?

This comment has been minimized.

Copy link
@0x-r4bbit

0x-r4bbit Dec 21, 2013

Author Member

yupp, typo!

}));

it('should determine browser language', function () {
inject(function ($translate) {
expect($translate('FOO')).toEqual('bar');
});
});
$translateProvider.determinePreferredLanguage();
// mocking
window.navigator.lang = 'en_US';
}));
});

it('should determine browser language', function () {
inject(function ($translate) {
expect($translate('FOO')).toEqual('bar');
describe('with locale negotiation', function () {
beforeEach(module('pascalprecht.translate', function ($translateProvider) {
$translateProvider.translations('en', {
FOO: 'bar'
});

$translateProvider.translations('de', {
FOO: 'foo'
});
$translateProvider.registerAvailableLanguageKeys(['en', 'de'], {
'en_US': 'en',
'de_DE': 'de'
});
$translateProvider.determinePreferredLanguage();
// mocking
window.navigator.lang = 'en_US';

This comment has been minimized.

Copy link
@knalli

knalli Dec 21, 2013

Member

typo? window.navigator.language?

}));

it('should determine browser language', function () {
inject(function ($translate) {
expect($translate('FOO')).toEqual('bar');
});
});
});
});
Expand Down

0 comments on commit 6bef6bd

Please sign in to comment.