You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

translation.js 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. var i18n = require("i18next-client");
  2. var languages = require("../../service/translation/languages");
  3. var Settings = require("../settings/Settings");
  4. var DEFAULT_LANG = languages.EN;
  5. var initialized = false;
  6. var waitingForInit = [];
  7. i18n.addPostProcessor("resolveAppName", function(value, key, options) {
  8. return value.replace("__app__", interfaceConfig.APP_NAME);
  9. });
  10. var defaultOptions = {
  11. detectLngQS: "lang",
  12. useCookie: false,
  13. fallbackLng: DEFAULT_LANG,
  14. shortcutFunction: 'defaultValue',
  15. load: "unspecific",
  16. resGetPath: 'lang/__ns__-__lng__.json',
  17. ns: {
  18. namespaces: ['main', 'languages'],
  19. defaultNs: 'main'
  20. },
  21. lngWhitelist : languages.getLanguages(),
  22. fallbackOnNull: true,
  23. fallbackOnEmpty: true,
  24. useDataAttrOptions: true,
  25. app: interfaceConfig.APP_NAME,
  26. getAsync: true,
  27. customLoad: function(lng, ns, options, done) {
  28. var resPath = "lang/__ns__-__lng__.json";
  29. if(lng === languages.EN)
  30. resPath = "lang/__ns__.json";
  31. var url = i18n.functions.applyReplacement(resPath, { lng: lng, ns: ns });
  32. initialized = false;
  33. i18n.functions.ajax({
  34. url: url,
  35. success: function(data, status, xhr) {
  36. i18n.functions.log('loaded: ' + url);
  37. done(null, data);
  38. },
  39. error : function(xhr, status, error) {
  40. if ((status && status == 200) ||
  41. (xhr && xhr.status && xhr.status == 200)) {
  42. // file loaded but invalid json, stop waste time !
  43. i18n.functions.error('There is a typo in: ' + url);
  44. } else if ((status && status == 404) ||
  45. (xhr && xhr.status && xhr.status == 404)) {
  46. i18n.functions.log('Does not exist: ' + url);
  47. } else {
  48. var theStatus = status ? status :
  49. ((xhr && xhr.status) ? xhr.status : null);
  50. i18n.functions.log(theStatus + ' when loading ' + url);
  51. }
  52. done(error, {});
  53. },
  54. dataType: "json",
  55. async : options.getAsync
  56. });
  57. }
  58. // options for caching
  59. // useLocalStorage: true,
  60. // localStorageExpirationTime: 86400000 // in ms, default 1 week
  61. };
  62. function initCompleted(t)
  63. {
  64. initialized = true;
  65. $("[data-i18n]").i18n();
  66. for(var i = 0; i < waitingForInit.length; i++)
  67. {
  68. var obj = waitingForInit[i];
  69. obj.callback(i18n.t(obj.key));
  70. }
  71. waitingForInit = [];
  72. }
  73. function checkForParameter() {
  74. var query = window.location.search.substring(1);
  75. var vars = query.split("&");
  76. for (var i=0;i<vars.length;i++) {
  77. var pair = vars[i].split("=");
  78. if(pair[0] == "lang")
  79. {
  80. return pair[1];
  81. }
  82. }
  83. return null;
  84. }
  85. module.exports = {
  86. init: function (lang) {
  87. initialized = false;
  88. var options = defaultOptions;
  89. if(!lang)
  90. {
  91. lang = checkForParameter();
  92. if(!lang)
  93. {
  94. var settings = Settings.getSettings();
  95. if(settings)
  96. lang = settings.language;
  97. }
  98. }
  99. if(lang) {
  100. options.lng = lang;
  101. }
  102. i18n.init(options, initCompleted);
  103. },
  104. translateString: function (key, cb, options) {
  105. if(!cb)
  106. return i18n.t(key, options);
  107. if(initialized)
  108. {
  109. cb(i18n.t(key, options));
  110. }
  111. else
  112. {
  113. waitingForInit.push({"callback": cb, "key": key});
  114. }
  115. },
  116. setLanguage: function (lang) {
  117. initialized = false;
  118. if(!lang)
  119. lang = DEFAULT_LANG;
  120. i18n.setLng(lang, defaultOptions, initCompleted);
  121. },
  122. getCurrentLanguage: function () {
  123. return i18n.lng();
  124. },
  125. translateElement: function (selector) {
  126. selector.i18n();
  127. },
  128. generateTranslatonHTML: function (key, defaultString, options) {
  129. var str = "<span data-i18n=\"" + key + "\"";
  130. if(options)
  131. {
  132. str += " data-i18n-options=\"" + JSON.stringify(options) + "\"";
  133. }
  134. str += ">";
  135. if(!options)
  136. options = {};
  137. if(defaultString)
  138. {
  139. options.defaultValue = defaultString;
  140. }
  141. str += this.translateString(key, null, options);
  142. str += "</span>";
  143. return str;
  144. }
  145. };