| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- (function () {
- 'use strict';
- angular.module('ariaNg').factory('ariaNgLanguageLoader', ['$http', '$q', 'ariaNgConstants', 'ariaNgLanguages', 'ariaNgAssetsCacheService', 'ariaNgNotificationService', 'ariaNgLogService', 'ariaNgStorageService', 'ariaNgNativeElectronService', function ($http, $q, ariaNgConstants, ariaNgLanguages, ariaNgAssetsCacheService, ariaNgNotificationService, ariaNgLogService, ariaNgStorageService, ariaNgNativeElectronService) {
- var getKeyValuePair = function (line) {
- for (var i = 0; i < line.length; i++) {
- if (i > 0 && line.charAt(i - 1) !== '\\' && line.charAt(i) === '=') {
- return {
- key: line.substring(0, i).replace('\\=', '='),
- value: line.substring(i + 1, line.length).replace('\\=', '=')
- };
- }
- }
- return {
- value: line
- };
- };
- var getCategory = function (langObj, category) {
- var currentCategory = langObj;
- if (!category) {
- return currentCategory;
- }
- if (category[0] === '[' && category[category.length - 1] === ']') {
- category = category.substring(1, category.length - 1);
- }
- if (category === 'global') {
- return currentCategory;
- }
- var categoryNames = category.split('.');
- for (var i = 0; i < categoryNames.length; i++) {
- var categoryName = categoryNames[i];
- if (!currentCategory[categoryName]) {
- currentCategory[categoryName] = {};
- }
- currentCategory = currentCategory[categoryName];
- }
- return currentCategory;
- };
- var getLanguageObject = function (languageContent) {
- var langObj = {};
- if (!languageContent) {
- return langObj;
- }
- var lines = languageContent.split('\n');
- var currentCatagory = langObj;
- for (var i = 0; i < lines.length; i++) {
- var line = lines[i];
- if (!line) {
- continue;
- }
- line = line.replace('\r', '');
- if (/^\[.+\]$/.test(line)) {
- currentCatagory = getCategory(langObj, line);
- continue;
- }
- var pair = getKeyValuePair(line);
- if (pair && pair.key) {
- currentCatagory[pair.key] = pair.value;
- }
- }
- return langObj;
- };
- var isLanguageResourceEquals = function (langObj1, langObj2) {
- if (!angular.isObject(langObj1) || !angular.isObject(langObj2)) {
- return false;
- }
- for (var key in langObj2) {
- if (!langObj2.hasOwnProperty(key)) {
- continue;
- }
- var value = langObj2[key];
- if (angular.isObject(value)) {
- var result = isLanguageResourceEquals(langObj1[key], value);
- if (!result) {
- return false;
- }
- } else {
- if (value !== langObj1[key]) {
- return false;
- }
- }
- }
- return true;
- };
- return function (options) {
- var deferred = $q.defer();
- if (!ariaNgLanguages[options.key]) {
- deferred.reject(options.key);
- return deferred.promise;
- }
- var languageKey = ariaNgConstants.languageStorageKeyPrefix + '.' + options.key;
- var languageResource = null; // AriaNg Native DO NOT cache language resource
- if (languageResource) {
- deferred.resolve(languageResource);
- }
- if (ariaNgAssetsCacheService.getLanguageAsset(options.key)) {
- var languageObject = getLanguageObject(ariaNgAssetsCacheService.getLanguageAsset(options.key));
- ariaNgStorageService.set(languageKey, languageObject);
- deferred.resolve(languageObject);
- return deferred.promise;
- }
- var languagePath = ariaNgConstants.languagePath + '/' + options.key + ariaNgConstants.languageFileExtension;
- try {
- var languageContent = ariaNgNativeElectronService.readPackageFile(languagePath);
- ariaNgLogService.info('[ariaNgLanguageLoader] sync load language resource successfully, path=' + languagePath);
- var languageObject = getLanguageObject(languageContent);
- deferred.resolve(languageObject);
- return deferred.promise;
- } catch (ex) {
- ariaNgLogService.error('[ariaNgLanguageLoader] cannot load language resource synchronously, path=' + languagePath, ex);
- }
- $http({
- url: languagePath,
- method: 'GET'
- }).then(function onSuccess(response) {
- var languageObject = getLanguageObject(response.data);
- var languageUpdated = false;
- if (languageResource) {
- languageUpdated = !isLanguageResourceEquals(languageResource, languageObject);
- }
- ariaNgStorageService.set(languageKey, languageObject);
- if (languageUpdated) {
- ariaNgLogService.info('[ariaNgLanguageLoader] load language resource successfully, and resource is updated');
- ariaNgNotificationService.notifyInPage('', 'Language resource has been updated, please reload the page for the changes to take effect.', {
- delay: false,
- type: 'info',
- templateUrl: 'views/notification-reloadable.html'
- });
- } else {
- ariaNgLogService.info('[ariaNgLanguageLoader] load language resource successfully, but resource is not updated');
- }
- return deferred.resolve(languageObject);
- }).catch(function onError(response) {
- ariaNgLogService.warn('[ariaNgLanguageLoader] cannot get language resource');
- if (!languageResource) {
- ariaNgNotificationService.notifyInPage('', 'AriaNg cannot get language resources, and will display in default language.', {
- type: 'error',
- delay: false
- });
- }
- return deferred.reject(options.key);
- });
- return deferred.promise;
- };
- }]);
- }());
|