index.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* global availableLangs */
  2. class Messages {
  3. constructor(json) {
  4. this.json = json;
  5. }
  6. getMessage(m, ...rest) {
  7. if (Object.prototype.hasOwnProperty.call(this.json, m)) {
  8. let message = this.json[m].message;
  9. return message.replace(/\$(\d+)/g, (...args) => {
  10. return rest[Number(args[1]) - 1];
  11. });
  12. }
  13. }
  14. }
  15. var defaultLang = "en_US";
  16. var getLang = function() {
  17. let lang = navigator.language || defaultLang;
  18. lang = lang.replace(/-/g, '_');
  19. //prioritize override language
  20. var url_string = window.location.href; //window.location.href
  21. var url = new URL(url_string);
  22. var override_lang = url.searchParams.get("lang");
  23. if (override_lang != null) {
  24. lang = override_lang;
  25. }
  26. if (Object.prototype.hasOwnProperty.call(availableLangs, lang)) {
  27. return lang;
  28. }
  29. lang = lang.split('_')[0];
  30. if (Object.prototype.hasOwnProperty.call(availableLangs, lang)) {
  31. return lang;
  32. }
  33. return defaultLang;
  34. }
  35. var fill = function(n, func) {
  36. switch(n.nodeType) {
  37. case 1: // Node.ELEMENT_NODE
  38. {
  39. const m = /^__MSG_([^_]*)__$/.exec(n.dataset.msgid);
  40. if (m) {
  41. var val = func(m[1]);
  42. if (val != undefined) {
  43. n.innerHTML = val
  44. }
  45. }
  46. n.childNodes.forEach(c => fill(c, func));
  47. break;
  48. }
  49. }
  50. }
  51. fetch(`./_locales/${getLang()}/messages.json`)
  52. .then((res) => {
  53. if (!res.ok) { return; }
  54. return res.json();
  55. })
  56. .then((json) => {
  57. var language = document.getElementById('language-switcher');
  58. var lang = `${getLang()}`
  59. language.innerText = availableLangs[lang].name + ' (' + lang + ')';
  60. var messages = new Messages(json);
  61. fill(document.body, (m) => {
  62. return messages.getMessage(m);
  63. });
  64. });
  65. // Populate language switcher list
  66. for (var lang in availableLangs) {
  67. var languageList = document.getElementById('supported-languages');
  68. var link = document.createElement('a');
  69. link.setAttribute('href', '?lang='+lang);
  70. link.setAttribute('class', "dropdown-item");
  71. link.innerText = availableLangs[lang].name + ' (' + lang + ')';
  72. languageList.lastChild.after(link);
  73. }