[tor-commits] [snowflake/master] Hook up localized messages.json to website

cohosh at torproject.org cohosh at torproject.org
Wed Oct 16 16:33:36 UTC 2019


commit f6517f60ce82cfbcdd7f2b894638ded4accfc129
Author: Cecylia Bocovich <cohosh at torproject.org>
Date:   Tue Oct 8 18:00:43 2019 -0400

    Hook up localized messages.json to website
    
    Right now we use the navigator language to determine localization and
    replace the website contents with translated strings.
---
 proxy/make.js           |  2 ++
 proxy/static/index.html |  5 +++--
 proxy/static/index.js   | 60 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+), 2 deletions(-)

diff --git a/proxy/make.js b/proxy/make.js
index bbaf0ca..defcf1f 100755
--- a/proxy/make.js
+++ b/proxy/make.js
@@ -94,6 +94,8 @@ task('build', 'build the snowflake proxy', function() {
   execSync(`cp -r ${STATIC}/ ${outDir}/`);
   copyTranslations(outDir);
   concatJS(outDir, 'badge', 'embed.js', availableLangs());
+  writeFileSync(`${outDir}/index.js`, availableLangs(), 'utf8');
+  execSync(`cat ${STATIC}/index.js >> ${outDir}/index.js`);
   console.log('Snowflake prepared.');
 });
 
diff --git a/proxy/static/index.html b/proxy/static/index.html
index ae17d42..3aa254b 100644
--- a/proxy/static/index.html
+++ b/proxy/static/index.html
@@ -1,5 +1,5 @@
 <!doctype html>
-<html lang="en">
+<html>
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
@@ -18,7 +18,7 @@
 
       <p class="diagram"><img src="https://trac.torproject.org/projects/tor/raw-attachment/wiki/doc/Snowflake/snowflake-schematic.png" alt="Diagram" /></p>
 
-      <p data-mdgid="__MSG_websiteIntro__">Snowflake is a system to defeat internet censorship. People who are
+      <p data-msgid="__MSG_websiteIntro__">Snowflake is a system to defeat internet censorship. People who are
       censored can use Snowflake to access the internet. Their connection goes
       through Snowflake proxies, which are run by volunteers. For more detailed
       information about how Snowflake works see our
@@ -96,5 +96,6 @@
       </section>
 
     </section>
+    <script src="index.js"></script>
   </body>
 </html>
diff --git a/proxy/static/index.js b/proxy/static/index.js
new file mode 100644
index 0000000..599b533
--- /dev/null
+++ b/proxy/static/index.js
@@ -0,0 +1,60 @@
+class Messages {
+  constructor(json) {
+    this.json = json;
+  }
+  getMessage(m, ...rest) {
+    if (this.json.hasOwnProperty(m)) {
+    let message = this.json[m].message;
+    return message.replace(/\$(\d+)/g, (...args) => {
+      return rest[Number(args[1]) - 1];
+    });
+    }
+  }
+}
+
+
+defaultLang = "en_US";
+
+var getLang = function() {
+  let lang = navigator.language || defaultLang;
+  lang = lang.replace(/-/g, '_');
+  if (availableLangs.has(lang)) {
+    return lang;
+  }
+  lang = lang.split('_')[0];
+  if (availableLangs.has(lang)) {
+    return lang;
+  }
+  return defaultLang;
+}
+
+var fill = function(n, func) {
+  switch(n.nodeType) {
+    case 1:  // Node.ELEMENT_NODE
+      const m = /^__MSG_([^_]*)__$/.exec(n.dataset.msgid);
+      if (m) {
+          val = func(m[1]);
+          if (val != undefined) {
+            n.innerHTML = val
+          }
+      }
+      n.childNodes.forEach(c => fill(c, func));
+      break;
+  }
+}
+
+console.log("Fetching", `./_locales/${getLang()}/messages.json`);
+
+fetch(`./_locales/${getLang()}/messages.json`)
+  .then((res) => {
+    if (!res.ok) { return; }
+    return res.json();
+  })
+  .then((json) => {
+    messages = new Messages(json);
+        console.log("Filling document body");
+    fill(document.body, (m) => {
+        console.log("Filling ", m);
+      return messages.getMessage(m);
+    });
+  });





More information about the tor-commits mailing list