diff --git a/.gitignore b/.gitignore index f3af78e..1bae622 100644 --- a/.gitignore +++ b/.gitignore @@ -19,5 +19,6 @@ proxy/webext/popup.js proxy/webext/embed.html proxy/webext/embed.css proxy/webext/assets/ +proxy/webext/_locales/ ignore/ npm-debug.log diff --git a/proxy/init-badge.js b/proxy/init-badge.js index dbe7fea..b906f62 100644 --- a/proxy/init-badge.js +++ b/proxy/init-badge.js @@ -4,6 +4,20 @@ UI */ +class Messages { + constructor(json) { + this.json = json; + } + getMessage(m, ...rest) { + let message = this.json[m].message; + return message.replace(/\$(\d+)/g, (...args) => { + return rest[Number(args[1]) - 1]; + }); + } +} + +let messages = null; + class BadgeUI extends UI { constructor() { @@ -16,7 +30,7 @@ class BadgeUI extends UI { missingFeature(missing) { this.popup.setEnabled(false); this.popup.setActive(false); - this.popup.setStatusText("Snowflake is off"); + this.popup.setStatusText(messages.getMessage('popupStatusOff')); this.popup.setStatusDesc(missing, true); this.popup.hideButton(); } @@ -24,20 +38,23 @@ class BadgeUI extends UI { turnOn() { const clients = this.active ? 1 : 0; this.popup.setChecked(true); - this.popup.setToggleText('Turn Off'); - this.popup.setStatusText(`${clients} client${(clients !== 1) ? 's' : ''} connected.`); + this.popup.setToggleText(messages.getMessage('popupTurnOff')); + if (clients > 0) { + this.popup.setStatusText(messages.getMessage('popupStatusOn', String(clients))); + } else { + this.popup.setStatusText(messages.getMessage('popupStatusReady')); + } // FIXME: Share stats from webext - const total = 0; - this.popup.setStatusDesc(`Your snowflake has helped ${total} user${(total !== 1) ? 's' : ''} circumvent censorship in the last 24 hours.`); + this.popup.setStatusDesc(''); this.popup.setEnabled(true); this.popup.setActive(this.active); } turnOff() { this.popup.setChecked(false); - this.popup.setToggleText('Turn On'); - this.popup.setStatusText("Snowflake is off"); - this.popup.setStatusDesc(""); + this.popup.setToggleText(messages.getMessage('popupTurnOn')); + this.popup.setStatusText(messages.getMessage('popupStatusOff')); + this.popup.setStatusDesc(''); this.popup.setEnabled(false); this.popup.setActive(false); } @@ -108,12 +125,12 @@ var debug, snowflake, config, broker, ui, log, dbg, init, update, silenceNotific ui = new BadgeUI(); if (!Util.hasWebRTC()) { - ui.missingFeature("WebRTC feature is not detected."); + ui.missingFeature(messages.getMessage('popupWebRTCOff')); return; } if (!Util.hasCookies()) { - ui.missingFeature("Cookies are not enabled."); + ui.missingFeature(messages.getMessage('badgeCookiesOff')); return; } @@ -153,6 +170,20 @@ var debug, snowflake, config, broker, ui, log, dbg, init, update, silenceNotific return null; }; - window.onload = init; + window.onload = function() { + const lang = 'en_US'; + fetch(`./_locales/${lang}/messages.json`) + .then((res) => { + if (!res.ok) { return; } + return res.json(); + }) + .then((json) => { + messages = new Messages(json); + Popup.fill(document.body, (m) => { + return messages.getMessage(m); + }); + init(); + }); + } }()); diff --git a/proxy/make.js b/proxy/make.js index 59165b2..58b7fce 100755 --- a/proxy/make.js +++ b/proxy/make.js @@ -32,7 +32,8 @@ var SHARED_FILES = [ 'embed.html', 'embed.css', 'popup.js', - 'assets' + 'assets', + '_locales', ]; var concatJS = function(outDir, init, outFile) { @@ -67,7 +68,7 @@ task('test', 'snowflake unit tests', function() { }); task('build', 'build the snowflake proxy', function() { - execSync('rm -r build'); + execSync('rm -rf build'); execSync('cp -r ' + STATIC + '/ build/'); concatJS('build', 'badge', 'embed.js'); console.log('Snowflake prepared.'); @@ -87,7 +88,7 @@ task('node', 'build the node binary', function() { }); task('clean', 'remove all built files', function() { - execSync('rm -r build test spec/support'); + execSync('rm -rf build test spec/support'); }); var cmd = process.argv[2]; diff --git a/proxy/static/_locales/en_US/messages.json b/proxy/static/_locales/en_US/messages.json new file mode 100644 index 0000000..f9de9d4 --- /dev/null +++ b/proxy/static/_locales/en_US/messages.json @@ -0,0 +1,32 @@ +{ + "appDesc": { + "message": "Snowflake is a WebRTC pluggable transport for Tor." + }, + "popupTurnOn": { + "message": "Turn On" + }, + "popupTurnOff": { + "message": "Turn Off" + }, + "popupLearnMore": { + "message": "Learn more" + }, + "popupStatusOff": { + "message": "Snowflake is off" + }, + "popupStatusOn": { + "message": "Number of users currently connected: $1" + }, + "popupStatusReady": { + "message": "Your Snowflake is ready to help users circumvent censorship!" + }, + "popupWebRTCOff": { + "message": "WebRTC feature is not detected." + }, + "popupDescOn": { + "message": "Number of users your Snowflake has helped circumvent censorship in the last 24 hours: $1" + }, + "badgeCookiesOff": { + "message": "Cookies are not enabled." + } +} diff --git a/proxy/static/embed.html b/proxy/static/embed.html index 441241a..eb75c30 100644 --- a/proxy/static/embed.html +++ b/proxy/static/embed.html @@ -11,18 +11,18 @@
Snowflake is off
+__MSG_popupStatusOff__