index.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. const languageListenerObjects = [];
  2. export default {
  3. install(Vue) {
  4. Vue.mixin({
  5. data() {
  6. return {
  7. languageInit: false,
  8. languageData: {},
  9. languageType: window.localStorage['__language:type__'] || 'zh',
  10. }
  11. },
  12. watch: {
  13. languageType: {
  14. handler(type) {
  15. if (type && typeof this.initLanguage === "function") {
  16. this.initLanguage();
  17. }
  18. },
  19. immediate: true
  20. },
  21. },
  22. methods: {
  23. /**
  24. * 初始化语言数据
  25. * @private
  26. */
  27. __initLanguageData() {
  28. if (this.languageInit === false) {
  29. this.languageInit = true;
  30. //
  31. this.addLanguageData({
  32. en: require("../../../../lang/en/general.js").default,
  33. zh: require("../../../../lang/zh/general.js").default
  34. });
  35. //
  36. languageListenerObjects.push((lang) => {
  37. this.languageType = lang;
  38. });
  39. }
  40. },
  41. /**
  42. * 监听语言变化
  43. * @param callback
  44. */
  45. setLanguageListener(callback) {
  46. if (typeof callback === 'function') {
  47. languageListenerObjects.push((lang) => {
  48. callback(lang);
  49. });
  50. }
  51. },
  52. /**
  53. * 语言包数据
  54. * @param language
  55. * @param data
  56. */
  57. addLanguageData(language, data) {
  58. if (typeof language === 'object') {
  59. Object.keys(language).forEach((key) => {
  60. this.addLanguageData(key, language[key]);
  61. });
  62. return;
  63. }
  64. if (!language || typeof data !== "object") {
  65. return;
  66. }
  67. this.__initLanguageData();
  68. if (typeof this.languageData[language] === "undefined") {
  69. this.languageData[language] = {};
  70. }
  71. Object.assign(this.languageData[language], data);
  72. //
  73. if (language === 'en') {
  74. if (typeof this.languageData['zh'] === "undefined") {
  75. this.languageData['zh'] = {};
  76. }
  77. let cnData = {};
  78. for(let key in data) {
  79. if (data.hasOwnProperty(key) && typeof this.languageData['zh'][data[key]] === 'undefined') {
  80. cnData[data[key]] = key;
  81. }
  82. }
  83. Object.assign(this.languageData['zh'], cnData);
  84. }else if (language === 'zh') {
  85. if (typeof this.languageData['en'] === "undefined") {
  86. this.languageData['en'] = {};
  87. }
  88. let enData = {};
  89. for(let key in data) {
  90. if (data.hasOwnProperty(key) && typeof this.languageData['en'][data[key]] === 'undefined') {
  91. enData[data[key]] = key;
  92. }
  93. }
  94. Object.assign(this.languageData['en'], enData);
  95. }
  96. },
  97. /**
  98. * 变化语言
  99. * @param language
  100. */
  101. setLanguage(language) {
  102. this.__initLanguageData();
  103. window.localStorage['__language:type__'] = language;
  104. languageListenerObjects.forEach((call) => {
  105. if (typeof call === 'function') {
  106. call(language);
  107. }
  108. });
  109. },
  110. /**
  111. * 获取语言
  112. * @returns {*}
  113. */
  114. getLanguage() {
  115. this.__initLanguageData();
  116. return this.languageType;
  117. },
  118. /**
  119. * 替换%遍历
  120. * @param text
  121. * @param objects
  122. */
  123. replaceArgumentsLanguage(text, objects) {
  124. let j = 1;
  125. while (text.indexOf("%") !== -1) {
  126. if (typeof objects[j] === "object") {
  127. text = text.replace("%", "");
  128. } else {
  129. text = text.replace("%", objects[j]);
  130. }
  131. j++;
  132. }
  133. return text;
  134. },
  135. /**
  136. * 显示语言
  137. * @return {string}
  138. */
  139. $L(text) {
  140. if (text) {
  141. this.__initLanguageData();
  142. //
  143. if (typeof this.languageData[this.languageType] === "object") {
  144. let temp = this.languageData[this.languageType][text];
  145. if (temp === null) {
  146. return this.replaceArgumentsLanguage(text, arguments);
  147. }
  148. if (typeof temp !== 'undefined') {
  149. return this.replaceArgumentsLanguage(temp, arguments);
  150. }
  151. }
  152. //
  153. try {
  154. let key = '__language:Undefined__';
  155. let tmpData = JSON.parse(window.localStorage[key] || '{}');
  156. if (typeof tmpData[this.languageType] !== "object") {
  157. tmpData[this.languageType] = {};
  158. }
  159. tmpData[this.languageType][text] = "";
  160. window.localStorage[key] = JSON.stringify(tmpData);
  161. }catch (e) {
  162. //
  163. }
  164. }
  165. return this.replaceArgumentsLanguage(text, arguments);
  166. }
  167. }
  168. });
  169. }
  170. }