選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

translation.js 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* global $, require, config, interfaceConfig */
  2. import i18n from 'i18next';
  3. import XHR from 'i18next-xhr-backend';
  4. import jqueryI18next from 'jquery-i18next';
  5. import languagesR from "../../lang/languages.json";
  6. import mainR from "../../lang/main.json";
  7. import languages from "../../service/translation/languages";
  8. const DEFAULT_LANG = languages.EN;
  9. const 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. class Translation {
  41. init (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: (res, key) => {
  61. return i18n.t(key, {app: options.app});
  62. }
  63. })
  64. .init(options, initCompleted);
  65. // adds default language which is preloaded from code
  66. i18n.addResourceBundle(DEFAULT_LANG, 'main', mainR, true, true);
  67. i18n.addResourceBundle(
  68. DEFAULT_LANG, 'languages', languagesR, true, true);
  69. jqueryI18next.init(i18n, $, {useOptionsAttr: true});
  70. }
  71. setLanguage (lang) {
  72. if(!lang)
  73. lang = DEFAULT_LANG;
  74. i18n.setLng(lang, defaultOptions, initCompleted);
  75. }
  76. getCurrentLanguage () {
  77. return i18n.lng();
  78. }
  79. translateElement (selector, options) {
  80. // i18next expects undefined if options are missing, check if its null
  81. selector.localize(
  82. options === null ? undefined : options);
  83. }
  84. generateTranslationHTML (key, options) {
  85. let optAttr = options
  86. ? ` data-i18n-options='${JSON.stringify(options)}'` : "";
  87. let text = i18n.t(key, options === null ? undefined : options);
  88. return `<span data-i18n="${key}"${optAttr}>${text}</span>`;
  89. }
  90. addLanguageChangedListener(listener) {
  91. i18n.on('languageChanged', listener);
  92. }
  93. }
  94. export default new Translation();