Load translations over XHR
This commit causes translations to be loaded over XHR instead of the import system.
This commit is contained in:
parent
bc35b1d27e
commit
2a7c6d20ab
|
@ -1,11 +1,4 @@
|
||||||
/*
|
{
|
||||||
* Translations for de
|
|
||||||
*
|
|
||||||
* This file was autotomatically generated from de.po
|
|
||||||
* DO NOT EDIT!
|
|
||||||
*/
|
|
||||||
|
|
||||||
Language = {
|
|
||||||
"Connecting...": "Verbunden...",
|
"Connecting...": "Verbunden...",
|
||||||
"Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ",
|
"Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ",
|
||||||
"Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ",
|
"Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ",
|
||||||
|
@ -14,5 +7,5 @@ Language = {
|
||||||
"Must set host and port": "Richten Sie Host und Port ein",
|
"Must set host and port": "Richten Sie Host und Port ein",
|
||||||
"Password is required": "Passwort ist erforderlich",
|
"Password is required": "Passwort ist erforderlich",
|
||||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "'Clipping-Modus' aktiviert, Scrollbalken in 'IE-Vollbildmodus' werden nicht unterstützt",
|
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "'Clipping-Modus' aktiviert, Scrollbalken in 'IE-Vollbildmodus' werden nicht unterstützt",
|
||||||
"Disconnect timeout": "Timeout beim trennen",
|
"Disconnect timeout": "Timeout beim trennen"
|
||||||
};
|
}
|
|
@ -1,11 +1,4 @@
|
||||||
/*
|
{
|
||||||
* Translations for el
|
|
||||||
*
|
|
||||||
* This file was autotomatically generated from el.po
|
|
||||||
* DO NOT EDIT!
|
|
||||||
*/
|
|
||||||
|
|
||||||
Language = {
|
|
||||||
"Connecting...": "Συνδέεται...",
|
"Connecting...": "Συνδέεται...",
|
||||||
"Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
|
"Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
|
||||||
"Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
|
"Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
|
||||||
|
@ -15,7 +8,7 @@ Language = {
|
||||||
"Password is required": "Απαιτείται ο κωδικός πρόσβασης",
|
"Password is required": "Απαιτείται ο κωδικός πρόσβασης",
|
||||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Εφαρμογή λειτουργίας αποκοπής αφού δεν υποστηρίζονται οι λωρίδες κύλισης σε πλήρη οθόνη στον IE",
|
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Εφαρμογή λειτουργίας αποκοπής αφού δεν υποστηρίζονται οι λωρίδες κύλισης σε πλήρη οθόνη στον IE",
|
||||||
"Disconnect timeout": "Παρέλευση χρονικού ορίου αποσύνδεσης",
|
"Disconnect timeout": "Παρέλευση χρονικού ορίου αποσύνδεσης",
|
||||||
"noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα",
|
"noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα:",
|
||||||
"Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου",
|
"Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου",
|
||||||
"Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου",
|
"Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου",
|
||||||
"viewport drag": "σύρσιμο θεατού πεδίου",
|
"viewport drag": "σύρσιμο θεατού πεδίου",
|
||||||
|
@ -65,10 +58,13 @@ Language = {
|
||||||
"default": "προεπιλεγμένο",
|
"default": "προεπιλεγμένο",
|
||||||
"Logging:": "Καταγραφή:",
|
"Logging:": "Καταγραφή:",
|
||||||
"Apply": "Εφαρμογή",
|
"Apply": "Εφαρμογή",
|
||||||
|
"Connect": "Σύνδεση",
|
||||||
|
"Disconnect": "Αποσύνδεση",
|
||||||
|
"Connection": "Σύνδεση",
|
||||||
"Host:": "Όνομα διακομιστή:",
|
"Host:": "Όνομα διακομιστή:",
|
||||||
"Port:": "Πόρτα διακομιστή:",
|
"Port:": "Πόρτα διακομιστή:",
|
||||||
"Password:": "Κωδικός Πρόσβασης:",
|
"Password:": "Κωδικός Πρόσβασης:",
|
||||||
"Token:": "Διακριτικό:",
|
"Token:": "Διακριτικό:",
|
||||||
"Send Password": "Αποστολή Κωδικού Πρόσβασης",
|
"Send Password": "Αποστολή Κωδικού Πρόσβασης",
|
||||||
"Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas",
|
"Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas"
|
||||||
};
|
}
|
|
@ -1,11 +1,4 @@
|
||||||
/*
|
{
|
||||||
* Translations for nl
|
|
||||||
*
|
|
||||||
* This file was autotomatically generated from nl.po
|
|
||||||
* DO NOT EDIT!
|
|
||||||
*/
|
|
||||||
|
|
||||||
Language = {
|
|
||||||
"Connecting...": "Verbinden...",
|
"Connecting...": "Verbinden...",
|
||||||
"Connected (encrypted) to ": "Verbonden (versleuteld) met ",
|
"Connected (encrypted) to ": "Verbonden (versleuteld) met ",
|
||||||
"Connected (unencrypted) to ": "Verbonden (onversleuteld) met ",
|
"Connected (unencrypted) to ": "Verbonden (onversleuteld) met ",
|
||||||
|
@ -14,5 +7,5 @@ Language = {
|
||||||
"Must set host and port": "Host en poort moeten worden ingesteld",
|
"Must set host and port": "Host en poort moeten worden ingesteld",
|
||||||
"Password is required": "Wachtwoord is vereist",
|
"Password is required": "Wachtwoord is vereist",
|
||||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "''Clipping mode' ingeschakeld, omdat schuifbalken in volledige-scherm-modus in IE niet worden ondersteund",
|
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "''Clipping mode' ingeschakeld, omdat schuifbalken in volledige-scherm-modus in IE niet worden ondersteund",
|
||||||
"Disconnect timeout": "Timeout tijdens verbreken van verbinding",
|
"Disconnect timeout": "Timeout tijdens verbreken van verbinding"
|
||||||
};
|
}
|
|
@ -1,11 +1,4 @@
|
||||||
/*
|
{
|
||||||
* Translations for sv
|
|
||||||
*
|
|
||||||
* This file was autotomatically generated from sv.po
|
|
||||||
* DO NOT EDIT!
|
|
||||||
*/
|
|
||||||
|
|
||||||
Language = {
|
|
||||||
"Connecting...": "Ansluter...",
|
"Connecting...": "Ansluter...",
|
||||||
"Connected (encrypted) to ": "Ansluten (krypterat) till ",
|
"Connected (encrypted) to ": "Ansluten (krypterat) till ",
|
||||||
"Connected (unencrypted) to ": "Ansluten (okrypterat) till ",
|
"Connected (unencrypted) to ": "Ansluten (okrypterat) till ",
|
||||||
|
@ -73,5 +66,5 @@ Language = {
|
||||||
"Password:": "Lösenord:",
|
"Password:": "Lösenord:",
|
||||||
"Token:": "Token:",
|
"Token:": "Token:",
|
||||||
"Send Password": "Skicka Lösenord",
|
"Send Password": "Skicka Lösenord",
|
||||||
"Canvas not supported.": "Canvas stöds ej",
|
"Canvas not supported.": "Canvas stöds ej"
|
||||||
};
|
}
|
24
app/ui.js
24
app/ui.js
|
@ -63,14 +63,6 @@ var UI;
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set up translations
|
|
||||||
var LINGUAS = ["de", "el", "nl", "sv"];
|
|
||||||
Util.Localisation.setup(LINGUAS);
|
|
||||||
if (Util.Localisation.language !== "en") {
|
|
||||||
WebUtil.load_scripts(
|
|
||||||
{'app': ["locale/" + Util.Localisation.language + ".js"]});
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = Util.Localisation.get;
|
var _ = Util.Localisation.get;
|
||||||
|
|
||||||
UI = {
|
UI = {
|
||||||
|
@ -1743,7 +1735,21 @@ var UI;
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
UI.load();
|
// Set up translations
|
||||||
|
var LINGUAS = ["de", "el", "nl", "sv"];
|
||||||
|
Util.Localisation.setup(LINGUAS);
|
||||||
|
if (Util.Localisation.language !== "en" && Util.Localisation.dictionary === undefined) {
|
||||||
|
WebUtil.fetchJSON('app/locale/' + Util.Localisation.language + '.json', function (translations) {
|
||||||
|
Util.Localisation.dictionary = translations;
|
||||||
|
|
||||||
|
// wait for translations to load before loading the UI
|
||||||
|
UI.load();
|
||||||
|
}, function (err) {
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
UI.load();
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
export default UI;
|
export default UI;
|
||||||
|
|
|
@ -277,4 +277,38 @@ WebUtil.load_scripts = function (files_by_dir) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// sadly, we can't use the Fetch API until we decide to drop
|
||||||
|
// IE11 support or polyfill promises and fetch in IE11.
|
||||||
|
// resolve will receive an object on success, while reject
|
||||||
|
// will receive either an event or an error on failure.
|
||||||
|
WebUtil.fetchJSON = function (path, resolve, reject) {
|
||||||
|
// NB: IE11 doesn't support JSON as a responseType
|
||||||
|
const req = new XMLHttpRequest();
|
||||||
|
req.open('GET', path);
|
||||||
|
|
||||||
|
req.onload = function () {
|
||||||
|
if (req.status === 200) {
|
||||||
|
try {
|
||||||
|
var resObj = JSON.parse(req.responseText);
|
||||||
|
} catch (err) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(resObj);
|
||||||
|
} else {
|
||||||
|
reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
req.onerror = function (evt) {
|
||||||
|
reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message));
|
||||||
|
};
|
||||||
|
|
||||||
|
req.ontimeout = function (evt) {
|
||||||
|
reject(new Error("XHR timed out while trying to load '" + path + "'"));
|
||||||
|
};
|
||||||
|
|
||||||
|
req.send();
|
||||||
|
};
|
||||||
|
|
||||||
export default WebUtil;
|
export default WebUtil;
|
||||||
|
|
|
@ -6,14 +6,14 @@ LINGUAS := de el nl sv
|
||||||
VERSION := $(shell grep '"version"' ../package.json | cut -d '"' -f 4)
|
VERSION := $(shell grep '"version"' ../package.json | cut -d '"' -f 4)
|
||||||
|
|
||||||
POFILES := $(addsuffix .po,$(LINGUAS))
|
POFILES := $(addsuffix .po,$(LINGUAS))
|
||||||
JSFILES := $(addprefix ../app/locale/,$(addsuffix .js,$(LINGUAS)))
|
JSONFILES := $(addprefix ../app/locale/,$(addsuffix .json,$(LINGUAS)))
|
||||||
|
|
||||||
update-po: $(POFILES)
|
update-po: $(POFILES)
|
||||||
update-js: $(JSFILES)
|
update-js: $(JSONFILES)
|
||||||
|
|
||||||
%.po: noVNC.pot
|
%.po: noVNC.pot
|
||||||
msgmerge --update --lang=$* $@ $<
|
msgmerge --update --lang=$* $@ $<
|
||||||
../app/locale/%.js: %.po
|
../app/locale/%.json: %.po
|
||||||
./po2js $< $@
|
./po2js $< $@
|
||||||
|
|
||||||
update-pot:
|
update-pot:
|
||||||
|
|
25
po/po2js
25
po/po2js
|
@ -32,25 +32,12 @@ if (opt.argv.length != 2) {
|
||||||
|
|
||||||
var data = po2json.parseFileSync(opt.argv[0]);
|
var data = po2json.parseFileSync(opt.argv[0]);
|
||||||
|
|
||||||
var output =
|
var bodyPart = Object.keys(data).filter((msgid) => msgid !== "").map((msgid) => {
|
||||||
"/*\n" +
|
if (msgid === "") return;
|
||||||
" * Translations for " + data[""]["language"] + "\n" +
|
var msgstr = data[msgid][1];
|
||||||
" *\n" +
|
return " " + JSON.stringify(msgid) + ": " + JSON.stringify(msgstr);
|
||||||
" * This file was autotomatically generated from " + opt.argv[0] + "\n" +
|
}).join(",\n");
|
||||||
" * DO NOT EDIT!\n" +
|
|
||||||
" */\n" +
|
|
||||||
"\n" +
|
|
||||||
"Language = {\n";
|
|
||||||
|
|
||||||
for (msgid in data) {
|
var output = "{\n" + bodyPart + "\n}";
|
||||||
if (msgid === "")
|
|
||||||
continue;
|
|
||||||
|
|
||||||
msgstr = data[msgid][1];
|
|
||||||
output += " " + JSON.stringify(msgid) + ": " +
|
|
||||||
JSON.stringify(msgstr) + ",\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
output += "};\n";
|
|
||||||
|
|
||||||
fs.writeFileSync(opt.argv[1], output);
|
fs.writeFileSync(opt.argv[1], output);
|
||||||
|
|
Loading…
Reference in New Issue