loc.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /**
  2. * the default language to use
  3. *
  4. * @var {string}
  5. * @author svartoyg
  6. */
  7. var _languageDefault = null;
  8. /**
  9. * the fallback language to use
  10. *
  11. * @var {string}
  12. * @author svartoyg
  13. */
  14. var _languageFallback = null;
  15. /**
  16. * two level map with ISO-639-1 code as first key and translation id as second key
  17. *
  18. * @var {Map<string,Map<string,string>>}
  19. * @author svartoyg
  20. */
  21. var _data = {};
  22. /**
  23. * @param {string} language
  24. * @return Promise<Map<string,string>>
  25. * @author svartoyg
  26. */
  27. async function retrieveData (language) {
  28. let json
  29. try {
  30. json = (await import(`../loc/${language}.json`)).default
  31. } catch (exception) {
  32. json = (await import(`../loc/${language.substr(0, language.indexOf('-'))}.json`)).default
  33. }
  34. const map = {}
  35. flatten(json, '', map)
  36. return map
  37. }
  38. function flatten (tree, prefix, result) {
  39. for (const [key, value] of Object.entries(tree)) {
  40. if (typeof value === 'string') {
  41. result[prefix + key] = value
  42. } else {
  43. flatten(value, prefix + key + '.', result)
  44. }
  45. }
  46. }
  47. /**
  48. * @param {string} languageDefault
  49. * @param {string} [languageFallback]
  50. * @author svartoyg
  51. */
  52. export async function initialize (languageDefault, languageFallback = 'en') {
  53. _languageFallback = languageFallback;
  54. _languageDefault = languageDefault;
  55. for (const language of [_languageFallback, _languageDefault]) {
  56. if (_data.hasOwnProperty(language)) continue;
  57. console.log('--', 'loading localization data for language "' + language + '" ...');
  58. let data;
  59. try {
  60. data = await retrieveData(language);
  61. } catch (exception) {
  62. console.warn(exception.toString());
  63. }
  64. _data[language] = data;
  65. }
  66. }
  67. /**
  68. * gets a translation by its key for a specific language
  69. *
  70. * @param {string} key
  71. * @param {string} [languageChosen]
  72. * @return {string}
  73. * @author svartoyg
  74. */
  75. export function translate (key, languageChosen = _languageDefault) {
  76. let result = undefined;
  77. for (const language of [languageChosen, _languageFallback]) {
  78. if (_data.hasOwnProperty(language) && (_data[language] !== undefined) && _data[language].hasOwnProperty(key)) {
  79. result = _data[language][key];
  80. break;
  81. }
  82. }
  83. if (result === undefined) {
  84. result = ('{{' + key + '}}');
  85. }
  86. return result;
  87. }