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 @@ - +
@@ -18,7 +18,7 @@Snowflake is a system to defeat internet censorship. People who are +
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 @@ + 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); + }); + });