diff --git a/src/service/translate.js b/src/service/translate.js index ee8136114..4749cf3fe 100644 --- a/src/service/translate.js +++ b/src/service/translate.js @@ -36,7 +36,7 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide $notFoundIndicatorRight, $postCompilingEnabled = false, $forceAsyncReloadEnabled = false, - NESTED_OBJECT_DELIMITER = '.', + $nestedObjectDelimeter = '.', loaderCache, directivePriority = 0, statefulFilter = true, @@ -261,6 +261,26 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide return this; }; + /** + * @ngdoc function + * @name pascalprecht.translate.$translateProvider#nestedObjectDelimeter + * @methodOf pascalprecht.translate.$translateProvider + * + * @description + * + * Let's you change the delimiter for namespaced translations. + * Default delimiter is `.`. + * + * @param {string} delimiter namespace separator + */ + this.nestedObjectDelimeter = function (delimiter) { + if (!delimiter) { + return $nestedObjectDelimeter; + } + $nestedObjectDelimeter = delimiter; + return this; + }; + /** * @name flatObject * @private @@ -286,10 +306,10 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide if (angular.isObject(val)) { flatObject(val, path.concat(key), result, key); } else { - keyWithPath = path.length ? ('' + path.join(NESTED_OBJECT_DELIMITER) + NESTED_OBJECT_DELIMITER + key) : key; + keyWithPath = path.length ? ('' + path.join($nestedObjectDelimeter) + $nestedObjectDelimeter + key) : key; if(path.length && key === prevKey){ // Create shortcut path (foo.bar == foo.bar.bar) - keyWithShortPath = '' + path.join(NESTED_OBJECT_DELIMITER); + keyWithShortPath = '' + path.join($nestedObjectDelimeter); // Link it to original path result[keyWithShortPath] = '@:' + keyWithPath; } @@ -1558,6 +1578,20 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide return $cloakClassName; }; + /** + * @ngdoc function + * @name pascalprecht.translate.$translate#nestedObjectDelimeter + * @methodOf pascalprecht.translate.$translate + * + * @description + * Returns the configured delimiter for nested namespaces. + * + * @return {string} nestedObjectDelimeter + */ + $translate.nestedObjectDelimeter = function () { + return $nestedObjectDelimeter; + }; + /** * @ngdoc function * @name pascalprecht.translate.$translate#fallbackLanguage diff --git a/test/unit/service/translate.spec.js b/test/unit/service/translate.spec.js index 6dd6d7647..2ed782417 100644 --- a/test/unit/service/translate.spec.js +++ b/test/unit/service/translate.spec.js @@ -123,6 +123,17 @@ describe('pascalprecht.translate', function () { }); }); + describe('$translate#nestedObjectDelimeter()', function () { + + it('should be a function', function () { + expect(typeof $translate.nestedObjectDelimeter).toBe('function'); + }); + + it('should return \'.\' if no delimiter is specified', function () { + expect($translate.nestedObjectDelimeter()).toEqual('.'); + }); + }); + it('should return a promise', function () { expect($translate('FOO').then).toBeDefined(); expect(typeof $translate('FOO').then).toEqual('function'); @@ -304,6 +315,23 @@ describe('pascalprecht.translate', function () { }); }); + describe('$translate#nestedObjectDelimeter()', function () { + + beforeEach(module('pascalprecht.translate', function ($translateProvider) { + $translateProvider.nestedObjectDelimeter('_'); + })); + + var $translate; + + beforeEach(inject(function (_$translate_) { + $translate = _$translate_; + })); + + it('should return \'_\' if such delimiter is specified', function () { + expect($translate.nestedObjectDelimeter()).toEqual('_'); + }); + }); + describe('$translate#use()', function () { beforeEach(module('pascalprecht.translate', function ($translateProvider) {