UNPKG

pip-webui

Version:

HTML5 UI for LOB applications

302 lines (241 loc) 11.7 kB
/** * @file Translatation service * @copyright Digital Living Software Corp. 2014-2016 * @todo: * - Move directives to more appropriate places */ /* global _, angular */ (function () { 'use strict'; var thisModule = angular.module('pipTranslate', ['LocalStorageModule', 'pipAssert']); thisModule.provider('pipTranslate', function(pipAssertProvider) { var language = 'en', persist = true, setRoot = true, translationMap = { en: { 'en': 'English', 'ru': 'Russian', 'es': 'Spanish', 'pt': 'Portuguese', 'de': 'German', 'fr': 'French' }, ru: { 'en': 'Английский', 'ru': 'Русский', 'es': 'Испанский', 'pt': 'Португальский', 'de': 'Немецкий', 'fr': 'Французский' } }; this.translations = setTranslations; this.language = initLanguage; this.use = initLanguage; this.persist = initPersist; this.setRoot = initSetRoot; this.$get = function ($rootScope, $timeout, localStorageService, pipAssert) { // Read language from persistent storage if (persist) language = localStorageService.get('language') || language; // Set root variable if (setRoot) $rootScope.$language = language; // Resetting root scope to force update language on the screen function reset(fullReset, partialReset) { fullReset = fullReset !== undefined ? !!fullReset : true; partialReset = partialReset !== undefined ? !!partialReset : true; $rootScope.$reset = fullReset; $rootScope.$partialReset = partialReset; $timeout(function() { $rootScope.$reset = false; $rootScope.$partialReset = false; }, 0); } return { use: function (newLanguage, fullReset, partialReset) { pipAssert.isString(newLanguage || '', "pipTranslate.use: argument should be a string"); if (newLanguage != null && newLanguage != language) { language = newLanguage; if (persist) localStorageService.set('language', language); if (setRoot) $rootScope.$language = language; reset(fullReset, partialReset); } return language; }, translations: setTranslations, translate: translate, translateArray: translateArray, translateSet: translateSet, translateObjects: translateObjects, translateById: translateById, translateSetById: translateSetById, translateStringsSet: translateStringsSet } }; // Initialize language selection function initLanguage(newLanguage) { pipAssertProvider.isString(newLanguage || '', "pipTranslateProvider.use or pipTranslateProvider.language: argument should be a string"); if (newLanguage != null) { language = newLanguage; } return language; } // Initialize persistence flag function initPersist(newPersist) { if (newPersist != null) { pipAssertProvider.isBoolean(newPersist || '', "pipTranslateProvider.persist: argument should be a boolean"); persist = newPersist; } return persist; } // Initialize set root flag function initSetRoot(newSetRoot) { if (newSetRoot != null) { pipAssertProvider.isBoolean(newSetRoot || '', "pipTranslateProvider.setRoot: argument should be a boolean"); setRoot = newSetRoot; } return setRoot; } // Set translation strings for specific language function setTranslations(language, languageMap) { pipAssertProvider.isString(language, "pipTranslate.setTranslations or pipTranslateProvider.translations: first argument should be a string"); pipAssertProvider.isObject(languageMap, "pipTranslate.setTranslations or pipTranslateProvider.translations: second argument should be an object"); var map = translationMap[language] || {}; translationMap[language] = _.extend(map, languageMap); } // Translate a string by key using set language function translate(key) { if (_.isNull(key) || _.isUndefined(key)) return ''; var map = translationMap[language] || {}; return map[key] || key; } // Translate an array of strings function translateArray(keys) { if (_.isNull(keys) || keys.length == 0) return []; pipAssertProvider.isArray(keys, "pipTranslate.translateArray: argument should be an array"); var values = []; var map = translationMap[language] || {}; _.each(keys, function (k) { var key = k || ''; values.push(map[key] || key); }); return values; } // Translate an array of strings into array of objects (set) function translateSet(keys, key, value) { if (_.isNull(keys) || keys.length == 0) return []; pipAssertProvider.isArray(keys, "pipTranslate.translateSet: first argument should be an array"); pipAssertProvider.isString(key || '', "pipTranslate.translateSet: second argument should be a string"); pipAssertProvider.isString(value || '', "pipTranslate.translateSet: third argument should be a string"); key = key || 'id'; value = value || 'name'; var values = []; var map = translationMap[language] || {}; _.each(keys, function (k) { var obj = {}, mapKey = k || ''; obj[key] = mapKey; obj[value] = map[mapKey] || mapKey; values.push(obj); }); return values; } // Translate a collection of objects function translateObjects(items, key, value) { if (_.isNull(items) || items.length == 0) return []; pipAssertProvider.isArray(items, "pipTranslate.translateObjects: first argument should be an array"); pipAssertProvider.isString(key || '', "pipTranslate.translateObjects: second argument should be a string"); pipAssertProvider.isString(value || '', "pipTranslate.translateObjects: third argument should be a string"); key = key || 'name'; value = value || 'nameLocal'; var map = translationMap[language] || {}; _.each(items, function (i) { var item = i, mapKey = item[key] || ''; item[value] = map[mapKey] || mapKey; }); return items; } // Translate a string by key with prefix using set language todo function translateById(prefix, key) { pipAssertProvider.isString(key || '', "pipTranslate.translateById: second argument should be a string"); pipAssertProvider.isString(prefix || '', "pipTranslate.translateById: first argument should be a string"); prefix = prefix ? prefix + '_' : ''; key = (prefix + key).replace(/ /g, '_').toUpperCase(); if (key == null) return ''; var map = translationMap[language] || {}; return map[key] || key; }; function translateSetById(keys, prefix, key, value) { if (_.isNull(keys) || keys.length == 0) return []; pipAssertProvider.isArray(keys, "pipTranslate.translateSetById: first argument should be an array"); pipAssertProvider.isString(prefix || '', "pipTranslate.translateSetById: second argument should be a string"); pipAssertProvider.isString(key || '', "pipTranslate.translateSetById: third argument should be a string"); pipAssertProvider.isString(value || '', "pipTranslate.translateSetById: forth argument should be a string"); prefix = prefix ? prefix.replace(/ /g, '_').toUpperCase() : ''; key = key || 'id'; value = value || 'name'; var values = []; var map = translationMap[language] || {}; _.each(keys, function (k) { var obj = {}, mapKey = k || ''; obj[key] = mapKey; obj[value] = map[prefix + '_' + mapKey] || mapKey; values.push(obj); }); return values; } // Translate an array of strings, apply uppercase and replace ' ' => '_' function translateStringsSet(keys, prefix, key, value) { if (_.isNull(keys) || keys.length == 0) return []; pipAssertProvider.isArray(keys, "pipTranslate.translateStringsSet: first argument should be an array"); pipAssertProvider.isString(prefix || '', "pipTranslate.translateStringsSet: second argument should be a string"); pipAssertProvider.isString(key || '', "pipTranslate.translateStringsSet: third argument should be a string"); pipAssertProvider.isString(value || '', "pipTranslate.translateStringsSet: forth argument should be a string"); key = key || 'id'; value = value || 'name'; prefix = prefix ? prefix.replace(/ /g, '_').toUpperCase() + '_': ''; var values = []; var map = translationMap[language] || {}; _.each(keys, function (k) { var obj = {}, mapKey = k || ''; obj[key] = mapKey; obj[value] = map[prefix + mapKey.replace(/ /g, '_').toUpperCase()] || (prefix + mapKey.replace(/ /g, '_').toUpperCase()); values.push(obj); }); return values; } }); thisModule.directive('pipTranslate', function(pipTranslate) { return { restrict: 'EA', scope: { key1: '@pipTranslate', key2: '@key' }, link: function (scope, element, attrs) { var key = scope.key1 || scope.key2; var value = pipTranslate.translate(key); element.text(value); } }; }); thisModule.directive('pipTranslateHtml', function(pipTranslate) { return { restrict: 'EA', scope: { key1: '@pipTranslateHtml', key2: '@key' }, link: function (scope, element, attrs) { var key = scope.key1 || scope.key2; var value = pipTranslate.translate(key); element.html(value); } }; }); })();