1/*! 2 * angular-translate - v2.2.0 - 2014-06-03 3 * http://github.com/PascalPrecht/angular-translate 4 * Copyright (c) 2014 ; Licensed MIT 5 */ 6angular.module('pascalprecht.translate', ['ng']).run([ 7 '$translate', 8 function ($translate) { 9 var key = $translate.storageKey(), storage = $translate.storage(); 10 if (storage) { 11 if (!storage.get(key)) { 12 if (angular.isString($translate.preferredLanguage())) { 13 $translate.use($translate.preferredLanguage()); 14 } else { 15 storage.set(key, $translate.use()); 16 } 17 } else { 18 $translate.use(storage.get(key)); 19 } 20 } else if (angular.isString($translate.preferredLanguage())) { 21 $translate.use($translate.preferredLanguage()); 22 } 23 } 24]); 25angular.module('pascalprecht.translate').provider('$translate', [ 26 '$STORAGE_KEY', 27 function ($STORAGE_KEY) { 28 var $translationTable = {}, $preferredLanguage, $availableLanguageKeys = [], $languageKeyAliases, $fallbackLanguage, $fallbackWasString, $uses, $nextLang, $storageFactory, $storageKey = $STORAGE_KEY, $storagePrefix, $missingTranslationHandlerFactory, $interpolationFactory, $interpolatorFactories = [], $interpolationSanitizationStrategy = false, $loaderFactory, $cloakClassName = 'translate-cloak', $loaderOptions, $notFoundIndicatorLeft, $notFoundIndicatorRight, $postCompilingEnabled = false, NESTED_OBJECT_DELIMITER = '.'; 29 var getLocale = function () { 30 var nav = window.navigator; 31 return (nav.language || nav.browserLanguage || nav.systemLanguage || nav.userLanguage || '').split('-').join('_'); 32 }; 33 var negotiateLocale = function (preferred) { 34 var avail = [], locale = angular.lowercase(preferred), i = 0, n = $availableLanguageKeys.length; 35 for (; i < n; i++) { 36 avail.push(angular.lowercase($availableLanguageKeys[i])); 37 } 38 if (avail.indexOf(locale) > -1) { 39 return preferred; 40 } 41 if ($languageKeyAliases) { 42 var alias; 43 for (var langKeyAlias in $languageKeyAliases) { 44 var hasWildcardKey = false; 45 var hasExactKey = $languageKeyAliases.hasOwnProperty(langKeyAlias) && angular.lowercase(langKeyAlias) === angular.lowercase(preferred); 46 if (langKeyAlias.slice(-1) === '*') { 47 hasWildcardKey = langKeyAlias.slice(0, -1) === preferred.slice(0, langKeyAlias.length - 1); 48 } 49 if (hasExactKey || hasWildcardKey) { 50 alias = $languageKeyAliases[langKeyAlias]; 51 if (avail.indexOf(angular.lowercase(alias)) > -1) { 52 return alias; 53 } 54 } 55 } 56 } 57 var parts = preferred.split('_'); 58 if (parts.length > 1 && avail.indexOf(angular.lowercase(parts[0])) > -1) { 59 return parts[0]; 60 } 61 return preferred; 62 }; 63 var translations = function (langKey, translationTable) { 64 if (!langKey && !translationTable) { 65 return $translationTable; 66 } 67 if (langKey && !translationTable) { 68 if (angular.isString(langKey)) { 69 return $translationTable[langKey]; 70 } 71 } else { 72 if (!angular.isObject($translationTable[langKey])) { 73 $translationTable[langKey] = {}; 74 }
75 angular.extend($translationTable[langKey], flatObject(translationTable)); 76 } 77 return this; 78 }; 79 this.translations = translations; 80 this.cloakClassName = function (name) { 81 if (!name) { 82 return $cloakClassName; 83 } 84 $cloakClassName = name; 85 return this; 86 }; 87 var flatObject = function (data, path, result, prevKey) { 88 var key, keyWithPath, keyWithShortPath, val; 89 if (!path) { 90 path = []; 91 } 92 if (!result) { 93 result = {}; 94 } 95 for (key in data) { 96 if (!data.hasOwnProperty(key)) { 97 continue; 98 } 99 val = data[key]; 100 if (angular.isObject(val)) { 101 flatObject(val, path.concat(key), result, key); 102 } else { 103 keyWithPath = path.length ? '' + path.join(NESTED_OBJECT_DELIMITER) + NESTED_OBJECT_DELIMITER + key : key; 104 if (path.length && key === prevKey) { 105 keyWithShortPath = '' + path.join(NESTED_OBJECT_DELIMITER); 106 result[keyWithShortPath] = '@:' + keyWithPath; 107 } 108 result[keyWithPath] = val; 109 } 110 } 111 return result; 112 }; 113 this.addInterpolation = function (factory) { 114 $interpolatorFactories.push(factory); 115 return this; 116 }; 117 this.useMessageFormatInterpolation = function () { 118 return this.useInterpolation('$translateMessageFormatInterpolation'); 119 }; 120 this.useInterpolation = function (factory) { 121 $interpolationFactory = factory; 122 return this; 123 }; 124 this.useSanitizeValueStrategy = function (value) { 125 $interpolationSanitizationStrategy = value; 126 return this; 127 }; 128 this.preferredLanguage = function (langKey) { 129 if (langKey) { 130 $preferredLanguage = langKey; 131 return this; 132 } 133 return $preferredLanguage; 134 }; 135 this.translationNotFoundIndicator = function (indicator) { 136 this.translationNotFoundIndicatorLeft(indicator); 137 this.translationNotFoundIndicatorRight(indicator); 138 return this; 139 }; 140 this.translationNotFoundIndicatorLeft = function (indicator) { 141 if (!indicator) { 142 return $notFoundIndicatorLeft; 143 } 144 $notFoundIndicatorLeft = indicator; 145 return this; 146 }; 147 this.translationNotFoundIndicatorRight = function (indicator) { 148 if (!indicator) { 149 return $notFoundIndicatorRight; 150 } 151 $notFoundIndicatorRight = indicator; 152 return this; 153 }; 154 this.fallbackLanguage = function (langKey) { 155 fallbackStack(langKey); 156 return this; 157 }; 158 var fallbackStack = function (langKey) { 159 if (langKey) { 160 if (angular.isString(langKey)) { 161 $fallbackWasString = true; 162 $fallbackLanguage = [langKey]; 163 } else if (angular.isArray(langKey)) { 164 $fallbackWasString = false; 165 $fallbackLanguage = langKey; 166 } 167 if (angular.isString($preferredLanguage)) { 168 $fallbackLanguage.push($preferredLanguage); 169 } 170 return this; 171 } else { 172 if ($fallbackWasString) { 173 return $fallbackLanguage[0]; 174 } else { 175 return $fallbackLanguage; 176 } 177 } 178 }; 179 this.use = function (langKey) { 180 if (langKey) { 181 if (!$translationTable[langKey] && !$loaderFactory) { 182 throw new Error('$translateProvider couldn\'t find translationTable for langKey: \'' + langKey + '\''); 183 } 184 $uses = langKey; 185 return this; 186 } 187 return $uses; 188 }; 189 var storageKey = function (key) { 190 if (!key) { 191 if ($storagePrefix) { 192 return $storagePrefix + $storageKey; 193 } 194 return $storageKey; 195 } 196 $storageKey = key; 197 }; 198 this.storageKey = storageKey; 199 this.useUrlLoader = function (url) { 200 return this.useLoader('$translateUrlLoader', { url: url }); 201 }; 202 this.useStaticFilesLoader = function (options) { 203 return this.useLoader('$translateStaticFilesLoader', options); 204 }; 205 this.useLoader = function (loaderFactory, options) { 206 $loaderFactory = loaderFactory; 207 $loaderOptions = options || {}; 208 return this; 209 }; 210 this.useLocalStorage = function () { 211 return this.useStorage('$translateLocalStorage'); 212 }; 213 this.useCookieStorage = function () { 214 return this.useStorage('$translateCookieStorage'); 215 }; 216 this.useStorage = function (storageFactory) { 217 $storageFactory = storageFactory; 218 return this; 219 }; 220 this.storagePrefix = function (prefix) { 221 if (!prefix) { 222 return prefix; 223 } 224 $storagePrefix = prefix; 225 return this; 226 }; 227 this.useMissingTranslationHandlerLog = function () { 228 return this.useMissingTranslationHandler('$translateMissingTranslationHandlerLog'); 229 }; 230 this.useMissingTranslationHandler = function (factory) { 231 $missingTranslationHandlerFactory = factory; 232 return this; 233 }; 234 this.usePostCompiling = function (value) { 235 $postCompilingEnabled = !!value; 236 return this; 237 }; 238 this.determinePreferredLanguage = function (fn) { 239 var locale = fn && angular.isFunction(fn) ? fn() : getLocale(); 240 if (!$availableLanguageKeys.length) { 241 $preferredLanguage = locale; 242 } else { 243 $preferredLanguage = negotiateLocale(locale); 244 } 245 return this; 246 }; 247 this.registerAvailableLanguageKeys = function (languageKeys, aliases) { 248 if (languageKeys) { 249 $availableLanguageKeys = languageKeys; 250 if (aliases) { 251 $languageKeyAliases = aliases; 252 } 253 return this; 254 } 255 return $availableLanguageKeys; 256 }; 257 this.$get = [ 258 '$log', 259 '$injector', 260 '$rootScope', 261 '$q', 262 function ($log, $injector, $rootScope, $q) { 263 var Storage, defaultInterpolator = $injector.get($interpolationFactory || '$translateDefaultInterpolation'), pendingLoader = false, interpolatorHashMap = {}, langPromises = {}, fallbackIndex, startFallbackIteration; 264 var $translate = function (translationId, interpolateParams, interpolationId) { 265 if (angular.isArray(translationId)) { 266 var translateAll = function (translationIds) { 267 var results = {}; 268 var promises = []; 269 var translate = function (translationId) { 270 var deferred = $q.defer(); 271 var regardless = function (value) { 272 results[translationId] = value; 273 deferred.resolve([ 274 translationId, 275 value 276 ]); 277 }; 278 $translate(translationId, interpolateParams, interpolationId).then(regardless, regardless); 279 return deferred.promise; 280 }; 281 for (var i = 0, c = translationIds.length; i < c; i++) { 282 promises.push(translate(translationIds[i])); 283 } 284 return $q.all(promises).then(function () { 285 return results; 286 }); 287 }; 288 return translateAll(translationId); 289 } 290 var deferred = $q.defer(); 291 if (translationId) { 292 translationId = translationId.trim(); 293 } 294 var promiseToWaitFor = function () { 295 var promise = $preferredLanguage ? langPromises[$preferredLanguage] : langPromises[$uses]; 296 fallbackIndex = 0; 297 if ($storageFactory && !promise) { 298 var langKey = Storage.get($storageKey); 299 promise = langPromises[langKey]; 300 if ($fallbackLanguage && $fallbackLanguage.length) { 301 var index = indexOf($fallbackLanguage, langKey); 302 fallbackIndex = index > -1 ? index += 1 : 0; 303 $fallbackLanguage.push($preferredLanguage); 304 } 305 } 306 return promise; 307 }(); 308 if (!promiseToWaitFor) { 309 determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); 310 } else { 311 promiseToWaitFor.then(function () { 312 determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); 313 }, deferred.reject); 314 } 315 return deferred.promise; 316 }; 317 var indexOf = function (array, searchElement) { 318 for (var i = 0, len = array.length; i < len; i++) { 319 if (array[i] === searchElement) { 320 return i; 321 } 322 } 323 return -1; 324 }; 325 var applyNotFoundIndicators = function (translationId) { 326 if ($notFoundIndicatorLeft) { 327 translationId = [ 328 $notFoundIndicatorLeft, 329 translationId 330 ].join(' '); 331 } 332 if ($notFoundIndicatorRight) { 333 translationId = [ 334 translationId, 335 $notFoundIndicatorRight 336 ].join(' '); 337 } 338 return translationId; 339 }; 340 var useLanguage = function (key) { 341 $uses = key; 342 $rootScope.$emit('$translateChangeSuccess'); 343 if ($storageFactory) { 344 Storage.set($translate.storageKey(), $uses); 345 } 346 defaultInterpolator.setLocale($uses); 347 angular.forEach(interpolatorHashMap, function (interpolator, id) { 348 interpolatorHashMap[id].setLocale($uses); 349 }); 350 $rootScope.$emit('$translateChangeEnd'); 351 }; 352 var loadAsync = function (key) { 353 if (!key) { 354 throw 'No language key specified for loading.'; 355 } 356 var deferred = $q.defer(); 357 $rootScope.$emit('$translateLoadingStart'); 358 pendingLoader = true; 359 $injector.get($loaderFactory)(angular.extend($loaderOptions, { key: key })).then(function (data) { 360 var translationTable = {}; 361 $rootScope.$emit('$translateLoadingSuccess'); 362 if (angular.isArray(data)) { 363 angular.forEach(data, function (table) { 364 angular.extend(translationTable, flatObject(table)); 365 }); 366 } else { 367 angular.extend(translationTable, flatObject(data)); 368 } 369 pendingLoader = false;
370 deferred.resolve({ 371 key: key, 372 table: translationTable 373 }); 374 $rootScope.$emit('$translateLoadingEnd'); 375 }, function (key) { 376 $rootScope.$emit('$translateLoadingError'); 377 deferred.reject(key); 378 $rootScope.$emit('$translateLoadingEnd'); 379 }); 380 return deferred.promise; 381 }; 382 if ($storageFactory) { 383 Storage = $injector.get($storageFactory); 384 if (!Storage.get || !Storage.set) { 385 throw new Error('Couldn\'t use storage \'' + $storageFactory + '\', missing get() or set() method!'); 386 } 387 } 388 if (angular.isFunction(defaultInterpolator.useSanitizeValueStrategy)) { 389 defaultInterpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy); 390 } 391 if ($interpolatorFactories.length) { 392 angular.forEach($interpolatorFactories, function (interpolatorFactory) { 393 var interpolator = $injector.get(interpolatorFactory); 394 interpolator.setLocale($preferredLanguage || $uses); 395 if (angular.isFunction(interpolator.useSanitizeValueStrategy)) { 396 interpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy); 397 } 398 interpolatorHashMap[interpolator.getInterpolationIdentifier()] = interpolator; 399 }); 400 } 401 var getTranslationTable = function (langKey) { 402 var deferred = $q.defer(); 403 if ($translationTable.hasOwnProperty(langKey)) { 404 deferred.resolve($translationTable[langKey]); 405 return deferred.promise; 406 } else { 407 langPromises[langKey].then(function (data) { 408 translations(data.key, data.table); 409 deferred.resolve(data.table); 410 }, deferred.reject); 411 } 412 return deferred.promise; 413 }; 414 var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator) { 415 var deferred = $q.defer(); 416 getTranslationTable(langKey).then(function (translationTable) { 417 if (translationTable.hasOwnProperty(translationId)) { 418 Interpolator.setLocale(langKey); 419 deferred.resolve(Interpolator.interpolate(translationTable[translationId], interpolateParams)); 420 Interpolator.setLocale($uses); 421 } else { 422 deferred.reject(); 423 } 424 }, deferred.reject); 425 return deferred.promise; 426 }; 427 var getFallbackTranslationInstant = function (langKey, translationId, interpolateParams, Interpolator) { 428 var result, translationTable = $translationTable[langKey]; 429 if (translationTable.hasOwnProperty(translationId)) { 430 Interpolator.setLocale(langKey); 431 result = Interpolator.interpolate(translationTable[translationId], interpolateParams); 432 Interpolator.setLocale($uses); 433 } 434 return result; 435 }; 436 var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) { 437 var deferred = $q.defer(); 438 if (fallbackLanguageIndex < $fallbackLanguage.length) { 439 var langKey = $fallbackLanguage[fallbackLanguageIndex]; 440 getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator).then(function (translation) { 441 deferred.resolve(translation); 442 }, function () { 443 var nextFallbackLanguagePromise = resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator); 444 deferred.resolve(nextFallbackLanguagePromise); 445 }); 446 } else { 447 if ($missingTranslationHandlerFactory) { 448 var resultString = $injector.get($missingTranslationHandlerFactory)(translationId, $uses); 449 if (resultString !== undefined) { 450 deferred.resolve(resultString); 451 } else { 452 deferred.resolve(translationId); 453 } 454 } else { 455 deferred.resolve(translationId); 456 } 457 } 458 return deferred.promise; 459 }; 460 var resolveForFallbackLanguageInstant = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) { 461 var result; 462 if (fallbackLanguageIndex < $fallbackLanguage.length) { 463 var langKey = $fallbackLanguage[fallbackLanguageIndex]; 464 result = getFallbackTranslationInstant(langKey, translationId, interpolateParams, Interpolator); 465 if (!result) { 466 result = resolveForFallbackLanguageInstant(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator); 467 } 468 } 469 return result; 470 }; 471 var fallbackTranslation = function (translationId, interpolateParams, Interpolator) { 472 return resolveForFallbackLanguage(startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex, translationId, interpolateParams, Interpolator); 473 }; 474 var fallbackTranslationInstant = function (translationId, interpolateParams, Interpolator) { 475 return resolveForFallbackLanguageInstant(startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex, translationId, interpolateParams, Interpolator); 476 }; 477 var determineTranslation = function (translationId, interpolateParams, interpolationId) { 478 var deferred = $q.defer(); 479 var table = $uses ? $translationTable[$uses] : $translationTable, Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : defaultInterpolator; 480 if (table && table.hasOwnProperty(translationId)) { 481 var translation = table[translationId]; 482 if (translation.substr(0, 2) === '@:') { 483 $translate(translation.substr(2), interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); 484 } else { 485 deferred.resolve(Interpolator.interpolate(translation, interpolateParams)); 486 } 487 } else { 488 if ($missingTranslationHandlerFactory && !pendingLoader) { 489 $injector.get($missingTranslationHandlerFactory)(translationId, $uses); 490 } 491 if ($uses && $fallbackLanguage && $fallbackLanguage.length) { 492 fallbackTranslation(translationId, interpolateParams, Interpolator).then(function (translation) { 493 deferred.resolve(translation); 494 }, function (_translationId) { 495 deferred.reject(applyNotFoundIndicators(_translationId)); 496 }); 497 } else { 498 deferred.reject(applyNotFoundIndicators(translationId)); 499 } 500 } 501 return deferred.promise; 502 }; 503 var determineTranslationInstant = function (translationId, interpolateParams, interpolationId) { 504 var result, table = $uses ? $translationTable[$uses] : $translationTable, Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : defaultInterpolator; 505 if (table && table.hasOwnProperty(translationId)) { 506 var translation = table[translationId]; 507 if (translation.substr(0, 2) === '@:') { 508 result = determineTranslationInstant(translation.substr(2), interpolateParams, interpolationId); 509 } else { 510 result = Interpolator.interpolate(translation, interpolateParams); 511 } 512 } else { 513 if ($missingTranslationHandlerFactory && !pendingLoader) { 514 $injector.get($missingTranslationHandlerFactory)(translationId, $uses); 515 } 516 if ($uses && $fallbackLanguage && $fallbackLanguage.length) { 517 fallbackIndex = 0; 518 result = fallbackTranslationInstant(translationId, interpolateParams, Interpolator); 519 } else { 520 result = applyNotFoundIndicators(translationId); 521 } 522 } 523 return result; 524 }; 525 $translate.preferredLanguage = function () { 526 return $preferredLanguage; 527 }; 528 $translate.cloakClassName = function () { 529 return $cloakClassName; 530 }; 531 $translate.fallbackLanguage = function (langKey) { 532 if (langKey !== undefined && langKey !== null) { 533 fallbackStack(langKey); 534 if ($loaderFactory) { 535 if ($fallbackLanguage && $fallbackLanguage.length) { 536 for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { 537 if (!langPromises[$fallbackLanguage[i]]) { 538 langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]); 539 } 540 } 541 } 542 } 543 $translate.use($translate.use()); 544 } 545 if ($fallbackWasString) { 546 return $fallbackLanguage[0]; 547 } else { 548 return $fallbackLanguage; 549 } 550 }; 551 $translate.useFallbackLanguage = function (langKey) { 552 if (langKey !== undefined && langKey !== null) { 553 if (!langKey) { 554 startFallbackIteration = 0; 555 } else { 556 var langKeyPosition = indexOf($fallbackLanguage, langKey); 557 if (langKeyPosition > -1) { 558 startFallbackIteration = langKeyPosition; 559 } 560 } 561 } 562 }; 563 $translate.proposedLanguage = function () { 564 return $nextLang; 565 }; 566 $translate.storage = function () { 567 return Storage; 568 }; 569 $translate.use = function (key) { 570 if (!key) { 571 return $uses; 572 } 573 var deferred = $q.defer(); 574 $rootScope.$emit('$translateChangeStart'); 575 var aliasedKey = negotiateLocale(key); 576 if (aliasedKey) { 577 key = aliasedKey; 578 } 579 if (!$translationTable[key] && $loaderFactory) { 580 $nextLang = key; 581 langPromises[key] = loadAsync(key).then(function (translation) { 582 translations(translation.key, translation.table); 583 deferred.resolve(translation.key); 584 if ($nextLang === key) { 585 useLanguage(translation.key); 586 $nextLang = undefined; 587 } 588 }, function (key) { 589 $nextLang = undefined; 590 $rootScope.$emit('$translateChangeError'); 591 deferred.reject(key); 592 $rootScope.$emit('$translateChangeEnd'); 593 }); 594 } else { 595 deferred.resolve(key);
596 useLanguage(key); 597 } 598 return deferred.promise; 599 }; 600 $translate.storageKey = function () { 601 return storageKey(); 602 }; 603 $translate.isPostCompilingEnabled = function () { 604 return $postCompilingEnabled; 605 }; 606 $translate.refresh = function (langKey) { 607 if (!$loaderFactory) { 608 throw new Error('Couldn\'t refresh translation table, no loader registered!'); 609 } 610 var deferred = $q.defer(); 611 function resolve() { 612 deferred.resolve(); 613 $rootScope.$emit('$translateRefreshEnd'); 614 } 615 function reject() { 616 deferred.reject(); 617 $rootScope.$emit('$translateRefreshEnd'); 618 } 619 $rootScope.$emit('$translateRefreshStart'); 620 if (!langKey) { 621 var tables = []; 622 if ($fallbackLanguage && $fallbackLanguage.length) { 623 for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { 624 tables.push(loadAsync($fallbackLanguage[i])); 625 } 626 } 627 if ($uses) { 628 tables.push(loadAsync($uses)); 629 } 630 $q.all(tables).then(function (tableData) { 631 angular.forEach(tableData, function (data) { 632 if ($translationTable[data.key]) { 633 delete $translationTable[data.key]; 634 } 635 translations(data.key, data.table); 636 }); 637 if ($uses) { 638 useLanguage($uses); 639 } 640 resolve(); 641 }); 642 } else if ($translationTable[langKey]) { 643 loadAsync(langKey).then(function (data) { 644 translations(data.key, data.table); 645 if (langKey === $uses) { 646 useLanguage($uses); 647 } 648 resolve(); 649 }, reject); 650 } else { 651 reject(); 652 } 653 return deferred.promise; 654 }; 655 $translate.instant = function (translationId, interpolateParams, interpolationId) { 656 if (translationId === null || angular.isUndefined(translationId)) { 657 return translationId; 658 } 659 if (angular.isArray(translationId)) { 660 var results = {}; 661 for (var i = 0, c = translationId.length; i < c; i++) { 662 results[translationId[i]] = $translate.instant(translationId[i], interpolateParams, interpolationId); 663 } 664 return results; 665 } 666 if (angular.isString(translationId) && translationId.length < 1) { 667 return translationId; 668 } 669 if (translationId) { 670 translationId = translationId.trim(); 671 } 672 var result, possibleLangKeys = []; 673 if ($preferredLanguage) { 674 possibleLangKeys.push($preferredLanguage); 675 } 676 if ($uses) { 677 possibleLangKeys.push($uses); 678 } 679 if ($fallbackLanguage && $fallbackLanguage.length) { 680 possibleLangKeys = possibleLangKeys.concat($fallbackLanguage); 681 } 682 for (var j = 0, d = possibleLangKeys.length; j < d; j++) { 683 var possibleLangKey = possibleLangKeys[j]; 684 if ($translationTable[possibleLangKey]) { 685 if (typeof $translationTable[possibleLangKey][translationId] !== 'undefined') { 686 result = determineTranslationInstant(translationId, interpolateParams, interpolationId); 687 } 688 } 689 if (typeof result !== 'undefined') { 690 break; 691 } 692 } 693 if (!result && result !== '') { 694 result = translationId; 695 if ($missingTranslationHandlerFactory && !pendingLoader) { 696 $injector.get($missingTranslationHandlerFactory)(translationId, $uses); 697 } 698 } 699 return result; 700 }; 701 if ($loaderFactory) { 702 if (angular.equals($translationTable, {})) { 703 $translate.use($translate.use()); 704 } 705 if ($fallbackLanguage && $fallbackLanguage.length) { 706 for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { 707 langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]); 708 } 709 } 710 } 711 return $translate; 712 } 713 ]; 714 } 715]); 716angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation', [ 717 '$interpolate', 718 function ($interpolate) { 719 var $translateInterpolator = {}
719, $locale, $identifier = 'default', $sanitizeValueStrategy = null, sanitizeValueStrategies = { 720 escaped: function (params) { 721 var result = {}; 722 for (var key in params) { 723 if (params.hasOwnProperty(key)) { 724 result[key] = angular.element('<div></div>').text(params[key]).html(); 725 } 726 } 727 return result; 728 } 729 }; 730 var sanitizeParams = function (params) { 731 var result; 732 if (angular.isFunction(sanitizeValueStrategies[$sanitizeValueStrategy])) { 733 result = sanitizeValueStrategies[$sanitizeValueStrategy](params); 734 } else { 735 result = params; 736 } 737 return result; 738 }; 739 $translateInterpolator.setLocale = function (locale) { 740 $locale = locale; 741 }; 742 $translateInterpolator.getInterpolationIdentifier = function () { 743 return $identifier; 744 }; 745 $translateInterpolator.useSanitizeValueStrategy = function (value) { 746 $sanitizeValueStrategy = value; 747 return this; 748 }; 749 $translateInterpolator.interpolate = function (string, interpolateParams) { 750 if ($sanitizeValueStrategy) { 751 interpolateParams = sanitizeParams(interpolateParams); 752 } 753 return $interpolate(string)(interpolateParams || {}); 754 }; 755 return $translateInterpolator; 756 } 757]); 758angular.module('pascalprecht.translate').constant('$STORAGE_KEY', 'NG_TRANSLATE_LANG_KEY'); 759angular.module('pascalprecht.translate').directive('translate', [ 760 '$translate', 761 '$q', 762 '$interpolate', 763 '$compile', 764 '$parse', 765 '$rootScope', 766 function ($translate, $q, $interpolate, $compile, $parse, $rootScope) { 767 return { 768 restrict: 'AE', 769 scope: true, 770 compile: function (tElement, tAttr) { 771 var translateValuesExist = tAttr.translateValues ? tAttr.translateValues : undefined; 772 var translateInterpolation = tAttr.translateInterpolation ? tAttr.translateInterpolation : undefined; 773 var translateValueExist = tElement[0].outerHTML.match(/translate-value-+/i); 774 return function linkFn(scope, iElement, iAttr) { 775 scope.interpolateParams = {}; 776 iAttr.$observe('translate', function (translationId) { 777 if (angular.equals(translationId, '') || !angular.isDefined(translationId)) { 778 scope.translationId = $interpolate(iElement.text().replace(/^\s+|\s+$/g, ''))(scope.$parent); 779 } else { 780 scope.translationId = translationId; 781 } 782 }); 783 iAttr.$observe('translateDefault', function (value) { 784 scope.defaultText = value; 785 }); 786 if (translateValuesExist) { 787 iAttr.$observe('translateValues', function (interpolateParams) { 788 if (interpolateParams) { 789 scope.$parent.$watch(function () { 790 angular.extend(scope.interpolateParams, $parse(interpolateParams)(scope.$parent)); 791 }); 792 } 793 }); 794 } 795 if (translateValueExist) { 796 var fn = function (attrName) { 797 iAttr.$observe(attrName, function (value) { 798 scope.interpolateParams[angular.lowercase(attrName.substr(14, 1)) + attrName.substr(15)] = value; 799 }); 800 }; 801 for (var attr in iAttr) { 802 if (iAttr.hasOwnProperty(attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') { 803 fn(attr); 804 } 805 } 806 } 807 var applyElementContent = function (value, scope, successful) { 808 if (!successful && typeof scope.defaultText !== 'undefined') { 809 value = scope.defaultText; 810 } 811 iElement.html(value); 812 var globallyEnabled = $translate.isPostCompilingEnabled(); 813 var locallyDefined = typeof tAttr.translateCompile !== 'undefined'; 814 var locallyEnabled = locallyDefined && tAttr.translateCompile !== 'false'; 815 if (globallyEnabled && !locallyDefined || locallyEnabled) { 816 $compile(iElement.contents())(scope); 817 } 818 }; 819 var updateTranslationFn = function () { 820 if (!translateValuesExist && !translateValueExist) { 821 return function () { 822 var unwatch = scope.$watch('translationId', function (value) { 823 if (scope.translationId && value) { 824 $translate(value, {}, translateInterpolation).then(function (translation) { 825 applyElementContent(translation, scope, true); 826 unwatch(); 827 }, function (translationId) { 828 applyElementContent(translationId, scope, false); 829 unwatch(); 830 }); 831 } 832 }, true); 833 }; 834 } else { 835 return function () { 836 var updateTranslations = function () { 837 if (scope.translationId && scope.interpolateParams) { 838 $translate(scope.translationId, scope.interpolateParams, translateInterpolation).then(function (translation) { 839 applyElementContent(translation, scope, true); 840 }, function (translationId) { 841 applyElementContent(translationId, scope, false); 842 }); 843 } 844 }; 845 scope.$watch('interpolateParams', updateTranslations, true); 846 scope.$watch('translationId', updateTranslations); 847 }; 848 } 849 }(); 850 var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslationFn); 851 updateTranslationFn(); 852 scope.$on('$destroy', unbind); 853 }; 854 } 855 }; 856 } 857]); 858angular.module('pascalprecht.translate').directive('translateCloak', [ 859 '$rootScope', 860 '$translate', 861 function ($rootScope, $translate) { 862 return { 863 compile: function (tElement) { 864 $rootScope.$on('$translateLoadingSuccess', function () { 865 tElement.removeClass($translate.cloakClassName()); 866 }); 867 tElement.addClass($translate.cloakClassName()); 868 } 869 }; 870 } 871]); 872angular.module('pascalprecht.translate').filter('translate', [ 873 '$parse', 874 '$translate', 875 function ($parse, $translate) { 876 return function (translationId, interpolateParams, interpolation) { 877 if (!angular.isObject(interpolateParams)) { 878 interpolateParams = $parse(interpolateParams)(this); 879 } 880 return $translate.instant(translationId, interpolateParams, interpolation); 881 }; 882 } 883]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.