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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* global $, require, config, interfaceConfig */
  2. import i18n from 'i18next';
  3. import XHR from 'i18next-xhr-backend';
  4. import jqueryI18next from 'jquery-i18next';
  5. var languages = require("../../service/translation/languages");
  6. var languagesR = require("json!../../lang/languages.json");
  7. var mainR = require("json!../../lang/main.json");
  8. var DEFAULT_LANG = languages.EN;
  9. var defaultOptions = {
  10. compatibilityAPI: 'v1',
  11. compatibilityJSON: 'v1',
  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. fallbackOnEmpty: true,
  22. useDataAttrOptions: true,
  23. app: interfaceConfig.APP_NAME
  24. };
  25. function initCompleted() {
  26. $("[data-i18n]").localize();
  27. }
  28. function getLangFromQuery() {
  29. var query = window.location.search.substring(1);
  30. var vars = query.split("&");
  31. for (var i=0;i<vars.length;i++) {
  32. var pair = vars[i].split("=");
  33. if(pair[0] == "lang")
  34. {
  35. return pair[1];
  36. }
  37. }
  38. return null;
  39. }
  40. module.exports = {
  41. init: function (settingsLang) {
  42. let options = defaultOptions;
  43. let lang = getLangFromQuery() || settingsLang || config.defaultLanguage;
  44. // XXX If none of the above has been set then the 'lang' will be
  45. // 'undefined' and the i18n lib will try to auto detect user's
  46. // preferred language based on browser's locale.
  47. // The interface config option allows to disable this auto detection
  48. // by specifying the fallback language in that case.
  49. let langDetection = interfaceConfig.LANG_DETECTION;
  50. if (!langDetection && !lang) {
  51. lang = DEFAULT_LANG;
  52. }
  53. if (lang) {
  54. options.lng = lang;
  55. }
  56. i18n.use(XHR)
  57. .use({
  58. type: 'postProcessor',
  59. name: "resolveAppName",
  60. process:
  61. function (res, key) {
  62. return i18n.t(key, {app: interfaceConfig.APP_NAME});
  63. }
  64. })
  65. .init(options, initCompleted);
  66. // adds default language which is preloaded from code
  67. i18n.addResourceBundle(DEFAULT_LANG, 'main', mainR, true, true);
  68. i18n.addResourceBundle(
  69. DEFAULT_LANG, 'languages', languagesR, true, true);
  70. jqueryI18next.init(i18n, $, {useOptionsAttr: true});
  71. },
  72. setLanguage: function (lang) {
  73. if(!lang)
  74. lang = DEFAULT_LANG;
  75. i18n.setLng(lang, defaultOptions, initCompleted);
  76. },
  77. getCurrentLanguage: function () {
  78. return i18n.lng();
  79. },
  80. translateElement: function (selector, options) {
  81. // i18next expects undefined if options are missing, check if its null
  82. selector.localize(
  83. options === null ? undefined : options);
  84. },
  85. generateTranslationHTML: function (key, options) {
  86. var str = "<span data-i18n=\"" + key + "\"";
  87. if (options) {
  88. str += " data-i18n-options='" + JSON.stringify(options) + "'";
  89. }
  90. str += ">";
  91. // i18next expects undefined if options ARE missing, check if its null
  92. str += i18n.t(key, options === null ? undefined : options);
  93. str += "</span>";
  94. return str;
  95. },
  96. addLanguageChangedListener: function(listener) {
  97. i18n.on('languageChanged', listener);
  98. }
  99. };