ariaNgLanguageLoader.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. (function () {
  2. 'use strict';
  3. angular.module('ariaNg').factory('ariaNgLanguageLoader', ['$http', '$q', 'ariaNgConstants', 'ariaNgLanguages', 'ariaNgAssetsCacheService', 'ariaNgNotificationService', 'ariaNgLogService', 'ariaNgStorageService', 'ariaNgNativeElectronService', function ($http, $q, ariaNgConstants, ariaNgLanguages, ariaNgAssetsCacheService, ariaNgNotificationService, ariaNgLogService, ariaNgStorageService, ariaNgNativeElectronService) {
  4. var getKeyValuePair = function (line) {
  5. for (var i = 0; i < line.length; i++) {
  6. if (i > 0 && line.charAt(i - 1) !== '\\' && line.charAt(i) === '=') {
  7. return {
  8. key: line.substring(0, i).replace('\\=', '='),
  9. value: line.substring(i + 1, line.length).replace('\\=', '=')
  10. };
  11. }
  12. }
  13. return {
  14. value: line
  15. };
  16. };
  17. var getCategory = function (langObj, category) {
  18. var currentCategory = langObj;
  19. if (!category) {
  20. return currentCategory;
  21. }
  22. if (category[0] === '[' && category[category.length - 1] === ']') {
  23. category = category.substring(1, category.length - 1);
  24. }
  25. if (category === 'global') {
  26. return currentCategory;
  27. }
  28. var categoryNames = category.split('.');
  29. for (var i = 0; i < categoryNames.length; i++) {
  30. var categoryName = categoryNames[i];
  31. if (!currentCategory[categoryName]) {
  32. currentCategory[categoryName] = {};
  33. }
  34. currentCategory = currentCategory[categoryName];
  35. }
  36. return currentCategory;
  37. };
  38. var getLanguageObject = function (languageContent) {
  39. var langObj = {};
  40. if (!languageContent) {
  41. return langObj;
  42. }
  43. var lines = languageContent.split('\n');
  44. var currentCatagory = langObj;
  45. for (var i = 0; i < lines.length; i++) {
  46. var line = lines[i];
  47. if (!line) {
  48. continue;
  49. }
  50. line = line.replace('\r', '');
  51. if (/^\[.+\]$/.test(line)) {
  52. currentCatagory = getCategory(langObj, line);
  53. continue;
  54. }
  55. var pair = getKeyValuePair(line);
  56. if (pair && pair.key) {
  57. currentCatagory[pair.key] = pair.value;
  58. }
  59. }
  60. return langObj;
  61. };
  62. var isLanguageResourceEquals = function (langObj1, langObj2) {
  63. if (!angular.isObject(langObj1) || !angular.isObject(langObj2)) {
  64. return false;
  65. }
  66. for (var key in langObj2) {
  67. if (!langObj2.hasOwnProperty(key)) {
  68. continue;
  69. }
  70. var value = langObj2[key];
  71. if (angular.isObject(value)) {
  72. var result = isLanguageResourceEquals(langObj1[key], value);
  73. if (!result) {
  74. return false;
  75. }
  76. } else {
  77. if (value !== langObj1[key]) {
  78. return false;
  79. }
  80. }
  81. }
  82. return true;
  83. };
  84. return function (options) {
  85. var deferred = $q.defer();
  86. if (!ariaNgLanguages[options.key]) {
  87. deferred.reject(options.key);
  88. return deferred.promise;
  89. }
  90. var languageKey = ariaNgConstants.languageStorageKeyPrefix + '.' + options.key;
  91. var languageResource = null; // AriaNg Native DO NOT cache language resource
  92. if (languageResource) {
  93. deferred.resolve(languageResource);
  94. }
  95. if (ariaNgAssetsCacheService.getLanguageAsset(options.key)) {
  96. var languageObject = getLanguageObject(ariaNgAssetsCacheService.getLanguageAsset(options.key));
  97. ariaNgStorageService.set(languageKey, languageObject);
  98. deferred.resolve(languageObject);
  99. return deferred.promise;
  100. }
  101. var languagePath = ariaNgConstants.languagePath + '/' + options.key + ariaNgConstants.languageFileExtension;
  102. try {
  103. var languageContent = ariaNgNativeElectronService.readPackageFile(languagePath);
  104. ariaNgLogService.info('[ariaNgLanguageLoader] sync load language resource successfully, path=' + languagePath);
  105. var languageObject = getLanguageObject(languageContent);
  106. deferred.resolve(languageObject);
  107. return deferred.promise;
  108. } catch (ex) {
  109. ariaNgLogService.error('[ariaNgLanguageLoader] cannot load language resource synchronously, path=' + languagePath, ex);
  110. }
  111. $http({
  112. url: languagePath,
  113. method: 'GET'
  114. }).then(function onSuccess(response) {
  115. var languageObject = getLanguageObject(response.data);
  116. var languageUpdated = false;
  117. if (languageResource) {
  118. languageUpdated = !isLanguageResourceEquals(languageResource, languageObject);
  119. }
  120. ariaNgStorageService.set(languageKey, languageObject);
  121. if (languageUpdated) {
  122. ariaNgLogService.info('[ariaNgLanguageLoader] load language resource successfully, and resource is updated');
  123. ariaNgNotificationService.notifyInPage('', 'Language resource has been updated, please reload the page for the changes to take effect.', {
  124. delay: false,
  125. type: 'info',
  126. templateUrl: 'views/notification-reloadable.html'
  127. });
  128. } else {
  129. ariaNgLogService.info('[ariaNgLanguageLoader] load language resource successfully, but resource is not updated');
  130. }
  131. return deferred.resolve(languageObject);
  132. }).catch(function onError(response) {
  133. ariaNgLogService.warn('[ariaNgLanguageLoader] cannot get language resource');
  134. if (!languageResource) {
  135. ariaNgNotificationService.notifyInPage('', 'AriaNg cannot get language resources, and will display in default language.', {
  136. type: 'error',
  137. delay: false
  138. });
  139. }
  140. return deferred.reject(options.key);
  141. });
  142. return deferred.promise;
  143. };
  144. }]);
  145. }());