Use gettext .po files for translations
This allows the same workflow as most other projects for translations.
This commit is contained in:
parent
45729def6d
commit
3cdc603aa4
|
@ -1,11 +1,18 @@
|
|||
/*
|
||||
* Translations for de
|
||||
*
|
||||
* This file was autotomatically generated from de.po
|
||||
* DO NOT EDIT!
|
||||
*/
|
||||
|
||||
Language = {
|
||||
"Connecting...": "Verbunden...",
|
||||
"Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ",
|
||||
"Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ",
|
||||
"Must set host and port": "Richten Sie Host und Port ein",
|
||||
"Disconnect timeout": "Timeout beim trennen",
|
||||
"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",
|
||||
"Connecting...": "Verbunden...",
|
||||
"Disconnecting...": "Verbindung trennen...",
|
||||
"Disconnected": "Verbindung zum Server getrennt",
|
||||
"Must set host and port": "Richten Sie Host und Port ein",
|
||||
"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",
|
||||
"Disconnect timeout": "Timeout beim trennen",
|
||||
};
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* Translations for el
|
||||
*
|
||||
* This file was autotomatically generated from el.po
|
||||
* DO NOT EDIT!
|
||||
*/
|
||||
|
||||
Language = {
|
||||
"Connecting...": "Συνδέεται...",
|
||||
"Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
|
||||
"Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
|
||||
"Disconnecting...": "Aποσυνδέεται...",
|
||||
"Disconnected": "Αποσυνδέθηκε",
|
||||
"Must set host and port": "Πρέπει να οριστεί το όνομα και η πόρτα του διακομιστή",
|
||||
"Password is required": "Απαιτείται ο κωδικός",
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Εφαρμογή λειτουργίας αποκοπής αφού δεν υποστηρίζονται οι λωρίδες κύλισης σε πλήρη οθόνη στον IE",
|
||||
"Disconnect timeout": "Παρέλευση χρονικού ορίου αποσύνδεσης",
|
||||
};
|
|
@ -1,11 +0,0 @@
|
|||
Language = {
|
||||
"Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
|
||||
"Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
|
||||
"Must set host and port": "Πρέπει να οριστεί το όνομα και η πόρτα του διακομιστή",
|
||||
"Disconnect timeout": "Παρέλευση χρονικού ορίου αποσύνδεσης",
|
||||
"Password is required": "Απαιτείται ο κωδικός",
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Εφαρμογή λειτουργίας αποκοπής αφού δεν υποστηρίζονται οι λωρίδες κύλισης σε πλήρη οθόνη στον IE",
|
||||
"Connecting...": "Συνδέεται...",
|
||||
"Disconnecting...": "Aποσυνδέεται...",
|
||||
"Disconnected": "Αποσυνδέθηκε",
|
||||
};
|
|
@ -1,11 +0,0 @@
|
|||
Language = {
|
||||
"Connected (encrypted) to ": "Connected (encrypted) to ",
|
||||
"Connected (unencrypted) to ": "Connected (unencrypted) to ",
|
||||
"Must set host and port": "Must set host and port",
|
||||
"Disconnect timeout": "Disconnect timeout",
|
||||
"Password is required": "Password is required",
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Forcing clipping mode since scrollbars aren't supported by IE in fullscreen",
|
||||
"Connecting...": "Connecting...",
|
||||
"Disconnecting...": "Disconnecting...",
|
||||
"Disconnected": "Disconnected",
|
||||
};
|
|
@ -1,11 +1,18 @@
|
|||
/*
|
||||
* Translations for nl
|
||||
*
|
||||
* This file was autotomatically generated from nl.po
|
||||
* DO NOT EDIT!
|
||||
*/
|
||||
|
||||
Language = {
|
||||
"Connecting...": "Verbinden...",
|
||||
"Connected (encrypted) to ": "Verbonden (versleuteld) met ",
|
||||
"Connected (unencrypted) to ": "Verbonden (onversleuteld) met ",
|
||||
"Must set host and port": "Host en poort moeten worden ingesteld",
|
||||
"Disconnect timeout": "Timeout tijdens verbreken van verbinding",
|
||||
"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",
|
||||
"Connecting...": "Verbinden...",
|
||||
"Disconnecting...": "Verbinding verbreken...",
|
||||
"Disconnected": "Verbinding verbroken",
|
||||
"Must set host and port": "Host en poort moeten worden ingesteld",
|
||||
"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",
|
||||
"Disconnect timeout": "Timeout tijdens verbreken van verbinding",
|
||||
};
|
|
@ -1,11 +1,18 @@
|
|||
/*
|
||||
* Translations for sv
|
||||
*
|
||||
* This file was autotomatically generated from sv.po
|
||||
* DO NOT EDIT!
|
||||
*/
|
||||
|
||||
Language = {
|
||||
"Connecting...": "Ansluter...",
|
||||
"Connected (encrypted) to ": "Ansluten (krypterat) till ",
|
||||
"Connected (unencrypted) to ": "Ansluten (okrypterat) till ",
|
||||
"Must set host and port": "Du måste specifiera en host och port",
|
||||
"Disconnect timeout": "Det tog för lång tid att koppla ner",
|
||||
"Password is required": "Lösenord krävs",
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Tvingar 'Clipping mode' eftersom skrollning inte stödjs av IE i fullskärm",
|
||||
"Connecting...": "Ansluter...",
|
||||
"Disconnecting...": "Kopplar ner...",
|
||||
"Disconnected": "Frånkopplad",
|
||||
"Must set host and port": "Du måste specifiera en host och port",
|
||||
"Password is required": "Lösenord krävs",
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Tvingar 'Clipping mode' eftersom skrollning inte stödjs av IE i fullskärm",
|
||||
"Disconnect timeout": "Det tog för lång tid att koppla ner",
|
||||
};
|
15
app/ui.js
15
app/ui.js
|
@ -40,13 +40,20 @@ var UI;
|
|||
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"]});
|
||||
}
|
||||
|
||||
/* [begin skip-as-module] */
|
||||
// Load supporting scripts
|
||||
WebUtil.load_scripts(
|
||||
{'core': [WebUtil.getLanguageFileLocation(), "base64.js", "websock.js",
|
||||
"des.js", "input/keysymdef.js", "input/xtscancodes.js",
|
||||
"input/util.js", "input/devices.js", "display.js",
|
||||
"inflator.js", "rfb.js", "input/keysym.js"]});
|
||||
{'core': ["base64.js", "websock.js", "des.js", "input/keysymdef.js",
|
||||
"input/xtscancodes.js", "input/util.js", "input/devices.js",
|
||||
"display.js", "inflator.js", "rfb.js", "input/keysym.js"]});
|
||||
|
||||
window.onscriptsload = function () { UI.load(); };
|
||||
/* [end skip-as-module] */
|
||||
|
|
|
@ -372,11 +372,6 @@ WebUtil.releaseCapture = function () {
|
|||
};
|
||||
|
||||
|
||||
// Get language file location
|
||||
WebUtil.getLanguageFileLocation = function () {
|
||||
return '../app/locale/locale-'+Util.Localisation.getLanguageCode()+'.js';
|
||||
};
|
||||
|
||||
// Dynamically load scripts without using document.write()
|
||||
// Reference: http://unixpapa.com/js/dyna.html
|
||||
//
|
||||
|
|
109
core/util.js
109
core/util.js
|
@ -368,72 +368,69 @@ Util.Flash = (function () {
|
|||
|
||||
|
||||
Util.Localisation = {
|
||||
defaultLanguage: 'en-GB',
|
||||
// Currently configured language
|
||||
language: 'en',
|
||||
|
||||
/*
|
||||
* Not all languages have been translated
|
||||
* Some countries prefer a certain language
|
||||
*/
|
||||
supportedLanguages: {
|
||||
'en': 'en-GB',
|
||||
'en-GB': 'en-GB',
|
||||
'en-US': 'en-GB',
|
||||
'nl': 'nl-NL',
|
||||
'nl-NL': 'nl-NL',
|
||||
'nl-BE': 'nl-NL',
|
||||
'de': 'de-DE',
|
||||
'de-DE': 'de-DE',
|
||||
'sv-SE': 'sv-SE',
|
||||
'sv': 'sv-SE',
|
||||
'el': 'el-GR',
|
||||
'el-GR': 'el-GR'
|
||||
},
|
||||
// Configure suitable language based on user preferences
|
||||
setup: function (supportedLanguages) {
|
||||
var userLanguages;
|
||||
|
||||
// Get language code from browser and verify it
|
||||
getLanguageCode: function () {
|
||||
var languageCode = Util.Localisation.getUserPreferredLanguage();
|
||||
for (var index = 0; index < languageCode.length; index++) {
|
||||
var supportedLanguageCode = Util.Localisation.getSupportedLanguageCode(languageCode[index]);
|
||||
if (supportedLanguageCode) {
|
||||
return supportedLanguageCode;
|
||||
}
|
||||
}
|
||||
Util.Localisation.language = 'en'; // Default: US English
|
||||
|
||||
return Util.Localisation.defaultLanguage;
|
||||
},
|
||||
|
||||
/*
|
||||
* Retrieve user preferred languages
|
||||
* Navigator.languages only available in Chrome (32+) and FireFox (32+)
|
||||
* Fall back to navigator.language for other browsers
|
||||
*/
|
||||
getUserPreferredLanguage: function () {
|
||||
/*
|
||||
* Navigator.languages only available in Chrome (32+) and FireFox (32+)
|
||||
* Fall back to navigator.language for other browsers
|
||||
*/
|
||||
if (typeof window.navigator.languages == 'object') {
|
||||
return window.navigator.languages;
|
||||
userLanguages = window.navigator.languages;
|
||||
} else {
|
||||
var userLang = navigator.language || navigator.userLanguage;
|
||||
return [userLang];
|
||||
userLanguages = [navigator.language || navigator.userLanguage];
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
* Verify if languagecode is supported
|
||||
* Return the languagecode of the language to use or null if not available
|
||||
*/
|
||||
getSupportedLanguageCode: function (languageCode) {
|
||||
var supportedLanguages = Util.Localisation.supportedLanguages;
|
||||
for (var i = 0;i < userLanguages.length;i++) {
|
||||
var userLang = userLanguages[i];
|
||||
userLang = userLang.toLowerCase();
|
||||
userLang = userLang.replace("_", "-");
|
||||
userLang = userLang.split("-");
|
||||
|
||||
for (var key in supportedLanguages) {
|
||||
if (supportedLanguages.hasOwnProperty(key)) {
|
||||
if (key === languageCode) {
|
||||
// Return the supported language or good alternative
|
||||
return supportedLanguages[key];
|
||||
}
|
||||
// Built-in default?
|
||||
if ((userLang[0] === 'en') &&
|
||||
((userLang[1] === undefined) || (userLang[1] === 'us'))) {
|
||||
return;
|
||||
}
|
||||
|
||||
// First pass: perfect match
|
||||
for (var j = 0;j < supportedLanguages.length;j++) {
|
||||
var supLang = supportedLanguages[j];
|
||||
supLang = supLang.toLowerCase();
|
||||
supLang = supLang.replace("_", "-");
|
||||
supLang = supLang.split("-");
|
||||
|
||||
if (userLang[0] !== supLang[0])
|
||||
continue;
|
||||
if (userLang[1] !== supLang[1])
|
||||
continue;
|
||||
|
||||
Util.Localisation.language = supportedLanguages[j];
|
||||
return;
|
||||
}
|
||||
|
||||
// Second pass: fallback
|
||||
for (var j = 0;j < supportedLanguages.length;j++) {
|
||||
supLang = supportedLanguages[j];
|
||||
supLang = supLang.toLowerCase();
|
||||
supLang = supLang.replace("_", "-");
|
||||
supLang = supLang.split("-");
|
||||
|
||||
if (userLang[0] !== supLang[0])
|
||||
continue;
|
||||
if (supLang[1] !== undefined)
|
||||
continue;
|
||||
|
||||
Util.Localisation.language = supportedLanguages[j];
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// LanguageCode not supported
|
||||
return null;
|
||||
},
|
||||
|
||||
// Retrieve localised text
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
"mocha": "^3.1.2",
|
||||
"open": "^0.0.5",
|
||||
"phantomjs-prebuilt": "^2.1.13",
|
||||
"po2json": "*",
|
||||
"sinon": "^1.17.6",
|
||||
"sinon-chai": "^2.8.0",
|
||||
"spooky": "^0.2.5",
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
all:
|
||||
.PHONY: update-po update-js update-pot
|
||||
|
||||
LINGUAS := de el nl sv
|
||||
|
||||
VERSION := $(shell grep '"version"' ../package.json | cut -d '"' -f 4)
|
||||
|
||||
POFILES := $(addsuffix .po,$(LINGUAS))
|
||||
JSFILES := $(addprefix ../app/locale/,$(addsuffix .js,$(LINGUAS)))
|
||||
|
||||
update-po: $(POFILES)
|
||||
update-js: $(JSFILES)
|
||||
|
||||
%.po: noVNC.pot
|
||||
msgmerge --update --lang=$* $@ $<
|
||||
../app/locale/%.js: %.po
|
||||
./po2js $< $@
|
||||
|
||||
update-pot:
|
||||
xgettext --output=noVNC.pot \
|
||||
--copyright-holder="Various Authors" \
|
||||
--package-name="noVNC" \
|
||||
--package-version="$(VERSION)" \
|
||||
--msgid-bugs-address="novnc@googlegroups.com" \
|
||||
--add-comments=TRANSLATORS: \
|
||||
--sort-by-file \
|
||||
../app/*.js \
|
||||
../core/*.js \
|
||||
../core/input/*.js
|
|
@ -0,0 +1,58 @@
|
|||
# German translations for noVNC package
|
||||
# German translation for noVNC.
|
||||
# Copyright (C) 2016 Various Authors
|
||||
# This file is distributed under the same license as the noVNC package.
|
||||
# Loek Janssen <loekjanssen@gmail.com>, 2016.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: noVNC 0.6.1\n"
|
||||
"Report-Msgid-Bugs-To: novnc@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2016-11-15 08:11+0100\n"
|
||||
"PO-Revision-Date: 2016-11-15 07:51+0100\n"
|
||||
"Last-Translator: Loek Janssen <loekjanssen@gmail.com>\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../app/ui.js:402
|
||||
msgid "Connecting..."
|
||||
msgstr "Verbunden..."
|
||||
|
||||
#: ../app/ui.js:409
|
||||
msgid "Connected (encrypted) to "
|
||||
msgstr "Verbunden mit (verschlüsselt) "
|
||||
|
||||
#: ../app/ui.js:411
|
||||
msgid "Connected (unencrypted) to "
|
||||
msgstr "Verbunden mit (unverschlüsselt) "
|
||||
|
||||
#: ../app/ui.js:416
|
||||
msgid "Disconnecting..."
|
||||
msgstr "Verbindung trennen..."
|
||||
|
||||
#: ../app/ui.js:421
|
||||
msgid "Disconnected"
|
||||
msgstr "Verbindung zum Server getrennt"
|
||||
|
||||
#: ../app/ui.js:1006 ../core/rfb.js:278
|
||||
msgid "Must set host and port"
|
||||
msgstr "Richten Sie Host und Port ein"
|
||||
|
||||
#: ../app/ui.js:1059
|
||||
msgid "Password is required"
|
||||
msgstr "Passwort ist erforderlich"
|
||||
|
||||
#: ../app/ui.js:1272
|
||||
msgid ""
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen"
|
||||
msgstr ""
|
||||
"'Clipping-Modus' aktiviert, Scrollbalken in 'IE-Vollbildmodus' werden nicht "
|
||||
"unterstützt"
|
||||
|
||||
#: ../core/rfb.js:556
|
||||
msgid "Disconnect timeout"
|
||||
msgstr "Timeout beim trennen"
|
|
@ -0,0 +1,57 @@
|
|||
# Greek translations for noVNC package.
|
||||
# Copyright (C) 2016 Various Authors
|
||||
# This file is distributed under the same license as the noVNC package.
|
||||
# Giannis Kosmas <kosmasgiannis@gmail.com>, 2016.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: noVNC 0.6.1\n"
|
||||
"Report-Msgid-Bugs-To: novnc@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2016-11-15 08:11+0100\n"
|
||||
"PO-Revision-Date: 2016-11-15 07:51+0100\n"
|
||||
"Last-Translator: Giannis Kosmas <kosmasgiannis@gmail.com>\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../app/ui.js:402
|
||||
msgid "Connecting..."
|
||||
msgstr "Συνδέεται..."
|
||||
|
||||
#: ../app/ui.js:409
|
||||
msgid "Connected (encrypted) to "
|
||||
msgstr "Συνδέθηκε (κρυπτογραφημένα) με το "
|
||||
|
||||
#: ../app/ui.js:411
|
||||
msgid "Connected (unencrypted) to "
|
||||
msgstr "Συνδέθηκε (μη κρυπτογραφημένα) με το "
|
||||
|
||||
#: ../app/ui.js:416
|
||||
msgid "Disconnecting..."
|
||||
msgstr "Aποσυνδέεται..."
|
||||
|
||||
#: ../app/ui.js:421
|
||||
msgid "Disconnected"
|
||||
msgstr "Αποσυνδέθηκε"
|
||||
|
||||
#: ../app/ui.js:1006 ../core/rfb.js:278
|
||||
msgid "Must set host and port"
|
||||
msgstr "Πρέπει να οριστεί το όνομα και η πόρτα του διακομιστή"
|
||||
|
||||
#: ../app/ui.js:1059
|
||||
msgid "Password is required"
|
||||
msgstr "Απαιτείται ο κωδικός"
|
||||
|
||||
#: ../app/ui.js:1272
|
||||
msgid ""
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen"
|
||||
msgstr ""
|
||||
"Εφαρμογή λειτουργίας αποκοπής αφού δεν υποστηρίζονται οι λωρίδες κύλισης σε "
|
||||
"πλήρη οθόνη στον IE"
|
||||
|
||||
#: ../core/rfb.js:556
|
||||
msgid "Disconnect timeout"
|
||||
msgstr "Παρέλευση χρονικού ορίου αποσύνδεσης"
|
|
@ -0,0 +1,58 @@
|
|||
# Dutch translations for noVNC package
|
||||
# Nederlandse vertalingen voor het pakket noVNC.
|
||||
# Copyright (C) 2016 Various Authors
|
||||
# This file is distributed under the same license as the noVNC package.
|
||||
# Loek Janssen <loekjanssen@gmail.com>, 2016.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: noVNC 0.6.1\n"
|
||||
"Report-Msgid-Bugs-To: novnc@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2016-11-15 08:11+0100\n"
|
||||
"PO-Revision-Date: 2016-11-15 07:51+0100\n"
|
||||
"Last-Translator: Loek Janssen <loekjanssen@gmail.com>\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../app/ui.js:402
|
||||
msgid "Connecting..."
|
||||
msgstr "Verbinden..."
|
||||
|
||||
#: ../app/ui.js:409
|
||||
msgid "Connected (encrypted) to "
|
||||
msgstr "Verbonden (versleuteld) met "
|
||||
|
||||
#: ../app/ui.js:411
|
||||
msgid "Connected (unencrypted) to "
|
||||
msgstr "Verbonden (onversleuteld) met "
|
||||
|
||||
#: ../app/ui.js:416
|
||||
msgid "Disconnecting..."
|
||||
msgstr "Verbinding verbreken..."
|
||||
|
||||
#: ../app/ui.js:421
|
||||
msgid "Disconnected"
|
||||
msgstr "Verbinding verbroken"
|
||||
|
||||
#: ../app/ui.js:1006 ../core/rfb.js:278
|
||||
msgid "Must set host and port"
|
||||
msgstr "Host en poort moeten worden ingesteld"
|
||||
|
||||
#: ../app/ui.js:1059
|
||||
msgid "Password is required"
|
||||
msgstr "Wachtwoord is vereist"
|
||||
|
||||
#: ../app/ui.js:1272
|
||||
msgid ""
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen"
|
||||
msgstr ""
|
||||
"''Clipping mode' ingeschakeld, omdat schuifbalken in volledige-scherm-modus "
|
||||
"in IE niet worden ondersteund"
|
||||
|
||||
#: ../core/rfb.js:556
|
||||
msgid "Disconnect timeout"
|
||||
msgstr "Timeout tijdens verbreken van verbinding"
|
|
@ -0,0 +1,55 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Various Authors
|
||||
# This file is distributed under the same license as the noVNC package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: noVNC 0.6.1\n"
|
||||
"Report-Msgid-Bugs-To: novnc@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2016-11-15 08:11+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../app/ui.js:402
|
||||
msgid "Connecting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../app/ui.js:409
|
||||
msgid "Connected (encrypted) to "
|
||||
msgstr ""
|
||||
|
||||
#: ../app/ui.js:411
|
||||
msgid "Connected (unencrypted) to "
|
||||
msgstr ""
|
||||
|
||||
#: ../app/ui.js:416
|
||||
msgid "Disconnecting..."
|
||||
msgstr ""
|
||||
|
||||
#: ../app/ui.js:421
|
||||
msgid "Disconnected"
|
||||
msgstr ""
|
||||
|
||||
#: ../app/ui.js:1006 ../core/rfb.js:278
|
||||
msgid "Must set host and port"
|
||||
msgstr ""
|
||||
|
||||
#: ../app/ui.js:1059
|
||||
msgid "Password is required"
|
||||
msgstr ""
|
||||
|
||||
#: ../app/ui.js:1272
|
||||
msgid ""
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen"
|
||||
msgstr ""
|
||||
|
||||
#: ../core/rfb.js:556
|
||||
msgid "Disconnect timeout"
|
||||
msgstr ""
|
|
@ -0,0 +1,56 @@
|
|||
#!/usr/bin/env node
|
||||
/*
|
||||
* ps2js: gettext .po to noVNC .js converter
|
||||
* Copyright (C) 2016 Pierre Ossman
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
var getopt = require('node-getopt');
|
||||
var fs = require('fs');
|
||||
var po2json = require("po2json");
|
||||
|
||||
opt = getopt.create([
|
||||
['h' , 'help' , 'display this help'],
|
||||
]).bindHelp().parseSystem();
|
||||
|
||||
if (opt.argv.length != 2) {
|
||||
console.error("Incorrect number of arguments given");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
var data = po2json.parseFileSync(opt.argv[0]);
|
||||
|
||||
var output =
|
||||
"/*\n" +
|
||||
" * Translations for " + data[""]["language"] + "\n" +
|
||||
" *\n" +
|
||||
" * This file was autotomatically generated from " + opt.argv[0] + "\n" +
|
||||
" * DO NOT EDIT!\n" +
|
||||
" */\n" +
|
||||
"\n" +
|
||||
"Language = {\n";
|
||||
|
||||
for (msgid in data) {
|
||||
if (msgid === "")
|
||||
continue;
|
||||
|
||||
msgstr = data[msgid][1];
|
||||
output += " " + JSON.stringify(msgid) + ": " +
|
||||
JSON.stringify(msgstr) + ",\n";
|
||||
}
|
||||
|
||||
output += "};\n";
|
||||
|
||||
fs.writeFileSync(opt.argv[1], output);
|
|
@ -0,0 +1,57 @@
|
|||
# Swedish translations for noVNC package
|
||||
# Svenska översättningar för paket noVNC.
|
||||
# Copyright (C) 2016 Various Authors
|
||||
# This file is distributed under the same license as the noVNC package.
|
||||
# Samuel Mannehed <samuel@cendio.se>, 2016.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: noVNC 0.6.1\n"
|
||||
"Report-Msgid-Bugs-To: novnc@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2016-11-15 08:11+0100\n"
|
||||
"PO-Revision-Date: 2016-11-15 07:51+0100\n"
|
||||
"Last-Translator: Samuel Mannehed <samuel@cendio.se>\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: sv\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../app/ui.js:402
|
||||
msgid "Connecting..."
|
||||
msgstr "Ansluter..."
|
||||
|
||||
#: ../app/ui.js:409
|
||||
msgid "Connected (encrypted) to "
|
||||
msgstr "Ansluten (krypterat) till "
|
||||
|
||||
#: ../app/ui.js:411
|
||||
msgid "Connected (unencrypted) to "
|
||||
msgstr "Ansluten (okrypterat) till "
|
||||
|
||||
#: ../app/ui.js:416
|
||||
msgid "Disconnecting..."
|
||||
msgstr "Kopplar ner..."
|
||||
|
||||
#: ../app/ui.js:421
|
||||
msgid "Disconnected"
|
||||
msgstr "Frånkopplad"
|
||||
|
||||
#: ../app/ui.js:1006 ../core/rfb.js:278
|
||||
msgid "Must set host and port"
|
||||
msgstr "Du måste specifiera en host och port"
|
||||
|
||||
#: ../app/ui.js:1059
|
||||
msgid "Password is required"
|
||||
msgstr "Lösenord krävs"
|
||||
|
||||
#: ../app/ui.js:1272
|
||||
msgid ""
|
||||
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen"
|
||||
msgstr ""
|
||||
"Tvingar 'Clipping mode' eftersom skrollning inte stödjs av IE i fullskärm"
|
||||
|
||||
#: ../core/rfb.js:556
|
||||
msgid "Disconnect timeout"
|
||||
msgstr "Det tog för lång tid att koppla ner"
|
|
@ -56,6 +56,47 @@ describe('Utils', function() {
|
|||
});
|
||||
});
|
||||
|
||||
describe('language selection', function () {
|
||||
it('should use English by default', function() {
|
||||
expect(Util.Localisation.language).to.equal('en');
|
||||
});
|
||||
it('should use English if no user language matches', function() {
|
||||
window.navigator.languages = ["nl", "de"];
|
||||
Util.Localisation.setup(["es", "fr"]);
|
||||
expect(Util.Localisation.language).to.equal('en');
|
||||
});
|
||||
it('should use the most preferred user language', function() {
|
||||
window.navigator.languages = ["nl", "de", "fr"];
|
||||
Util.Localisation.setup(["es", "fr", "de"]);
|
||||
expect(Util.Localisation.language).to.equal('de');
|
||||
});
|
||||
it('should prefer sub-languages languages', function() {
|
||||
window.navigator.languages = ["pt-BR"];
|
||||
Util.Localisation.setup(["pt", "pt-BR"]);
|
||||
expect(Util.Localisation.language).to.equal('pt-BR');
|
||||
});
|
||||
it('should fall back to language "parents"', function() {
|
||||
window.navigator.languages = ["pt-BR"];
|
||||
Util.Localisation.setup(["fr", "pt", "de"]);
|
||||
expect(Util.Localisation.language).to.equal('pt');
|
||||
});
|
||||
it('should not use specific language when user asks for a generic language', function() {
|
||||
window.navigator.languages = ["pt", "de"];
|
||||
Util.Localisation.setup(["fr", "pt-BR", "de"]);
|
||||
expect(Util.Localisation.language).to.equal('de');
|
||||
});
|
||||
it('should handle underscore as a separator', function() {
|
||||
window.navigator.languages = ["pt-BR"];
|
||||
Util.Localisation.setup(["pt_BR"]);
|
||||
expect(Util.Localisation.language).to.equal('pt_BR');
|
||||
});
|
||||
it('should handle difference in case', function() {
|
||||
window.navigator.languages = ["pt-br"];
|
||||
Util.Localisation.setup(["pt-BR"]);
|
||||
expect(Util.Localisation.language).to.equal('pt-BR');
|
||||
});
|
||||
});
|
||||
|
||||
// TODO(directxman12): test the conf_default and conf_defaults methods
|
||||
// TODO(directxman12): test decodeUTF8
|
||||
// TODO(directxman12): test the event methods (addEvent, removeEvent, stopEvent)
|
||||
|
|
|
@ -81,8 +81,7 @@
|
|||
WebUtil.load_scripts({
|
||||
'core': ["base64.js", "websock.js", "des.js", "input/keysymdef.js",
|
||||
"input/xtscancodes.js", "input/util.js", "input/devices.js",
|
||||
"display.js", "inflator.js", "rfb.js", "input/keysym.js"],
|
||||
'app': [WebUtil.getLanguageFileLocation(), "webutil.js"]});
|
||||
"display.js", "inflator.js", "rfb.js", "input/keysym.js"]});
|
||||
|
||||
var rfb;
|
||||
var resizeTimeout;
|
||||
|
@ -153,24 +152,22 @@
|
|||
var cad = document.getElementById('sendCtrlAltDelButton');
|
||||
switch (state) {
|
||||
case 'connecting':
|
||||
status(Util.Localisation.get("Connecting"), "normal");
|
||||
status("Connecting", "normal");
|
||||
break;
|
||||
case 'connected':
|
||||
if (rfb && rfb.get_encrypt()) {
|
||||
status(Util.Localisation.
|
||||
get("Connected (encrypted) to ") +
|
||||
status("Connected (encrypted) to " +
|
||||
desktopName, "normal");
|
||||
} else {
|
||||
status(Util.Localisation.
|
||||
get("Connected (unencrypted) to ") +
|
||||
status("Connected (unencrypted) to " +
|
||||
desktopName, "normal");
|
||||
}
|
||||
break;
|
||||
case 'disconnecting':
|
||||
status(Util.Localisation.get("Disconnecting"), "normal");
|
||||
status("Disconnecting", "normal");
|
||||
break;
|
||||
case 'disconnected':
|
||||
status(Util.Localisation.get("Disconnected"), "normal");
|
||||
status("Disconnected", "normal");
|
||||
break;
|
||||
default:
|
||||
status(state, "warn");
|
||||
|
|
Loading…
Reference in New Issue