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 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. var i18n = require("i18next-client");
  2. var languages = require("../../service/translation/languages");
  3. var DEFAULT_LANG = languages.EN;
  4. var initialized = false;
  5. var waitingForInit = [];
  6. i18n.addPostProcessor("resolveAppName", function(value, key, options) {
  7. return value.replace("__app__", interfaceConfig.APP_NAME);
  8. });
  9. var defaultOptions = {
  10. detectLngQS: "lang",
  11. useCookie: false,
  12. fallbackLng: DEFAULT_LANG,
  13. load: "unspecific",
  14. resGetPath: 'lang/__ns__-__lng__.json',
  15. ns: {
  16. namespaces: ['main', 'languages'],
  17. defaultNs: 'main'
  18. },
  19. lngWhitelist : languages.getLanguages(),
  20. fallbackOnNull: true,
  21. useDataAttrOptions: true,
  22. app: interfaceConfig.APP_NAME,
  23. getAsync: true,
  24. customLoad: function(lng, ns, options, done) {
  25. var resPath = "lang/__ns__-__lng__.json";
  26. if(lng === languages.EN)
  27. resPath = "lang/__ns__.json";
  28. var url = i18n.functions.applyReplacement(resPath, { lng: lng, ns: ns });
  29. initialized = false;
  30. i18n.functions.ajax({
  31. url: url,
  32. success: function(data, status, xhr) {
  33. i18n.functions.log('loaded: ' + url);
  34. done(null, data);
  35. },
  36. error : function(xhr, status, error) {
  37. if ((status && status == 200) ||
  38. (xhr && xhr.status && xhr.status == 200)) {
  39. // file loaded but invalid json, stop waste time !
  40. i18n.functions.error('There is a typo in: ' + url);
  41. } else if ((status && status == 404) ||
  42. (xhr && xhr.status && xhr.status == 404)) {
  43. i18n.functions.log('Does not exist: ' + url);
  44. } else {
  45. var theStatus = status ? status :
  46. ((xhr && xhr.status) ? xhr.status : null);
  47. i18n.functions.log(theStatus + ' when loading ' + url);
  48. }
  49. done(error, {});
  50. },
  51. dataType: "json",
  52. async : options.getAsync
  53. });
  54. }
  55. // options for caching
  56. // useLocalStorage: true,
  57. // localStorageExpirationTime: 86400000 // in ms, default 1 week
  58. };
  59. function initCompleted(t)
  60. {
  61. initialized = true;
  62. $("[data-i18n]").i18n();
  63. for(var i = 0; i < waitingForInit.length; i++)
  64. {
  65. var obj = waitingForInit[i];
  66. obj.callback(i18n.t(obj.key));
  67. }
  68. waitingForInit = [];
  69. }
  70. module.exports = {
  71. init: function (lang) {
  72. initialized = false;
  73. var options = defaultOptions;
  74. if(lang)
  75. options.lng = lang;
  76. i18n.init(options, initCompleted);
  77. },
  78. translateString: function (key, cb, defaultValue) {
  79. if(!cb)
  80. return i18n.t(key, defaultValue);
  81. if(initialized)
  82. {
  83. cb(i18n.t(key, defaultValue));
  84. }
  85. else
  86. {
  87. waitingForInit.push({"callback": cb, "key": key});
  88. }
  89. },
  90. setLanguage: function (lang) {
  91. initialized = false;
  92. if(!lang)
  93. lang = DEFAULT_LANG;
  94. i18n.setLng(lang, defaultOptions, initCompleted);
  95. },
  96. getCurrentLanguage: function () {
  97. return i18n.lng();
  98. },
  99. translateElement: function (selector) {
  100. selector.i18n();
  101. }
  102. };