From 68ee78a577fae88c705ec7e12172d190b7e17bc2 Mon Sep 17 00:00:00 2001
From: Manuel Kocher <manuel.kocher@tugraz.at>
Date: Mon, 11 Jul 2022 10:51:23 +0200
Subject: [PATCH] add missing file error handling to translation-overrides

---
 packages/common/i18next.js | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/packages/common/i18next.js b/packages/common/i18next.js
index 5f56097c..4dd7ce2e 100644
--- a/packages/common/i18next.js
+++ b/packages/common/i18next.js
@@ -9,8 +9,14 @@ async function fetchOverridesByLanguage(overrides, lng) {
       fetch(overrides + lng +'/translation.json', {
           headers: {'Content-Type': 'application/json'},
       });
-  let json = await result.json();
-  return json;
+
+  // throw error if response is not json
+  try {
+    let json = await result.json();
+    return json;
+  } catch(e) {
+    throw new Error("Could not parse response as json: " + e);
+  }
 }
 
 // handles translation cache promises
@@ -165,21 +171,26 @@ export async function setOverridesByGlobalCache(i18n, element) {
     // to the original one. This way we an change the overrides at runtime
     // and can even remove them.
 
-
-
     // The scoped mixin saves the real tag name under data-tag-name
     let tagName = ((element.dataset && element.dataset.tagName) || element.tagName).toLowerCase();
     let namespace = i18n.options.fallbackNS;
     let overrideNamespace = getOverrideNamespace(namespace);
     let hasOverrides = false;
     for (let lng of i18n.languages) {
-        cacheOverrides(element.langDir, lng);
-        translationCache[lng] = await translationCache[lng];
-        i18n.removeResourceBundle(lng, overrideNamespace);
-        if (translationCache[lng] === undefined || translationCache[lng][tagName] === undefined) continue;
-        let resources = translationCache[lng][tagName];
-        hasOverrides = true;
-        i18n.addResourceBundle(lng, overrideNamespace, resources);
+        // check if cacheOverrides throws error
+        try {
+          cacheOverrides(element.langDir, lng);
+          translationCache[lng] = await translationCache[lng];
+          i18n.removeResourceBundle(lng, overrideNamespace);
+          if (translationCache[lng] === undefined || translationCache[lng][tagName] === undefined) continue;
+          let resources = translationCache[lng][tagName];
+          hasOverrides = true;
+          i18n.addResourceBundle(lng, overrideNamespace, resources);
+        } catch(e) {
+          // leave loop and use default translations if error is thrown
+          hasOverrides = false;
+          break;
+        }
     }
     i18n.setDefaultNamespace(hasOverrides ? overrideNamespace : namespace);
     element.requestUpdate();
-- 
GitLab