Run Prettier to format the files for consistency

This commit is contained in:
Pratik Borsadiya 2018-08-30 15:07:55 +05:30
parent 499f272ac7
commit 4c3d2fddc9
49 changed files with 6469 additions and 5890 deletions

View File

@ -1,46 +1,55 @@
angular angular
.module('webui.services.configuration', []) .module("webui.services.configuration", [])
.constant('$name', 'Aria2 WebUI') // name used across the entire UI .constant("$name", "Aria2 WebUI") // name used across the entire UI
.constant('$titlePattern', 'active: {active} - waiting: {waiting} - stopped: {stopped} — {name}') .constant("$titlePattern", "active: {active} - waiting: {waiting} - stopped: {stopped} — {name}")
.constant('$pageSize', 11) // number of downloads shown before pagination kicks in .constant("$pageSize", 11) // number of downloads shown before pagination kicks in
.constant('$authconf', { // default authentication configuration, never fill it in case the webui is hosted in public IP as it can be compromised .constant("$authconf", {
host: location.protocol.startsWith('http') ? location.hostname : 'localhost', // default authentication configuration, never fill it in case the webui is hosted in public IP as it can be compromised
path: '/jsonrpc', host: location.protocol.startsWith("http") ? location.hostname : "localhost",
port: 6800, path: "/jsonrpc",
encrypt: false, port: 6800,
auth: { // either add the token field or the user and pass field, not both. encrypt: false,
// token: '$YOUR_SECRET_TOKEN$' auth: {
/*-----------------------------*/ // either add the token field or the user and pass field, not both.
// user: '*YOUR_USERNAME*', // token: '$YOUR_SECRET_TOKEN$'
// pass: '*YOUR_SECRET_PASS*' /*-----------------------------*/
}, // user: '*YOUR_USERNAME*',
directURL: '' // If supplied, links will be created to enable direct download from the aria2 server, requires appropriate webserver to be configured // pass: '*YOUR_SECRET_PASS*'
}) },
.constant('$enable', { directURL: "" // If supplied, links will be created to enable direct download from the aria2 server, requires appropriate webserver to be configured
})
.constant("$enable", {
torrent: true, // bittorrent support only enabled if supported by aria2 build, set to false otherwise to permanently disable it
torrent: true, // bittorrent support only enabled if supported by aria2 build, set to false otherwise to permanently disable it metalink: true, // metalink support only enabled if supported by aria2 build, set to false to permanently disable it
metalink: true, // metalink support only enabled if supported by aria2 build, set to false to permanently disable it sidebar: {
// configuration related to the sidebar next to the list of downloads
show: true, // set to false to completely hide the sidebar. Other elements inside will be automatically hidden
sidebar: { // configuration related to the sidebar next to the list of downloads stats: true, // set to false to hide the global statistic section (contains the speed graph for now)
show: true, // set to false to completely hide the sidebar. Other elements inside will be automatically hidden
stats: true, // set to false to hide the global statistic section (contains the speed graph for now)
filters: true, // set to false to hide the Download Filters
starredProps: true // only shown when at least one property is added to the starred list, set to false to permanently hide the Quick Access Settings inside the sidebar
}
})
.constant('$starredProps', [ // default list of Quick Access Properties. Can be overridden by making modification through the Global Settings dialog
// go to Global Settings dialog to see their description
'dir', 'conf-path', 'auto-file-renaming', 'max-connection-per-server'
])
.constant('$downloadProps', [ // Similar to starred Quick Access properties but for adding new downloads.
// go to Advance Download Options when adding a new download to view the list of possible options
'header', 'http-user', 'http-passwd', 'pause', 'dir', 'max-connection-per-server'
])
.constant('$globalTimeout', 1000) // interval to update the individual downloads
;
filters: true, // set to false to hide the Download Filters
starredProps: true // only shown when at least one property is added to the starred list, set to false to permanently hide the Quick Access Settings inside the sidebar
}
})
.constant("$starredProps", [
// default list of Quick Access Properties. Can be overridden by making modification through the Global Settings dialog
// go to Global Settings dialog to see their description
"dir",
"conf-path",
"auto-file-renaming",
"max-connection-per-server"
])
.constant("$downloadProps", [
// Similar to starred Quick Access properties but for adding new downloads.
// go to Advance Download Options when adding a new download to view the list of possible options
"header",
"http-user",
"http-passwd",
"pause",
"dir",
"max-connection-per-server"
])
.constant("$globalTimeout", 1000); // interval to update the individual downloads

View File

@ -27,24 +27,31 @@
word-wrap: break-word; word-wrap: break-word;
} }
.active-download, .waiting-download, .stopped-download, .download { .active-download,
.waiting-download,
.stopped-download,
.download {
cursor: pointer; cursor: pointer;
width: 100%; width: 100%;
padding: 4px 5px; padding: 4px 5px;
background-color: #fff; background-color: #fff;
margin-bottom: 20px; margin-bottom: 20px;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
0 2px 1px -1px rgba(0, 0, 0, 0.12);
} }
/* fix table layout to break words */ /* fix table layout to break words */
@media (max-width: 767px) { @media (max-width: 767px) {
.active-download, .waiting-download, .stopped-download, .download { .active-download,
.waiting-download,
.stopped-download,
.download {
table-layout: fixed; table-layout: fixed;
} }
} }
.download-graph { .download-graph {
margin: .5em 30px .5em 0; margin: 0.5em 30px 0.5em 0;
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {

View File

@ -45,4 +45,4 @@
.selectFiles div.recursivedir { .selectFiles div.recursivedir {
width: 100%; width: 100%;
} }

View File

@ -1,13 +1,14 @@
@import 'https://fonts.googleapis.com/css?family=Lato:400,700'; @import "https://fonts.googleapis.com/css?family=Lato:400,700";
body { body {
font-family: 'Lato', sans-serif; font-family: "Lato", sans-serif;
overflow-y: scroll; overflow-y: scroll;
background-color: #f5f5f5; background-color: #f5f5f5;
padding-bottom: 5em; padding-bottom: 5em;
} }
input[type=checkbox], input[type=radio] { input[type="checkbox"],
input[type="radio"] {
vertical-align: middle; vertical-align: middle;
position: relative; position: relative;
} }
@ -21,8 +22,10 @@ input[type=checkbox], input[type=radio] {
background-color: #428bca; background-color: #428bca;
} }
.label-active, .badge-active, .progress-active .bar { .label-active,
background-color: #62C462; .badge-active,
.progress-active .bar {
background-color: #62c462;
} }
.progress-success .bar { .progress-success .bar {
@ -81,8 +84,8 @@ input[type=checkbox], input[type=radio] {
.main-navbar { .main-navbar {
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1);
background-color: #00897B; background-color: #00897b;
border-color: #00897B; border-color: #00897b;
} }
.main-navbar .navbar-brand { .main-navbar .navbar-brand {
@ -110,7 +113,8 @@ input[type=checkbox], input[type=radio] {
margin-bottom: 30px; margin-bottom: 30px;
background-color: #fff; background-color: #fff;
padding: 10px 20px 20px; padding: 10px 20px 20px;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
0 2px 1px -1px rgba(0, 0, 0, 0.12);
} }
.filter-input-group { .filter-input-group {
@ -121,6 +125,6 @@ input[type=checkbox], input[type=radio] {
.filter-input-group > .clear-button { .filter-input-group > .clear-button {
position: absolute; position: absolute;
right: 25px; right: 25px;
top: 6px; top: 6px;
cursor: pointer; cursor: pointer;
} }

View File

@ -1,33 +1,33 @@
angular.module('webui.ctrls.alert', [ angular.module("webui.ctrls.alert", ["webui.services.alerts"]).controller("AlertCtrl", [
'webui.services.alerts' "$scope",
]) "$alerts",
.controller('AlertCtrl', ['$scope', '$alerts', '$sce', "$sce",
function(scope, alerts, sce) { function(scope, alerts, sce) {
scope.pendingAlerts = []; scope.pendingAlerts = [];
scope.removeAlert = function(ind) { scope.removeAlert = function(ind) {
this.pendingAlerts.splice(ind, 1); this.pendingAlerts.splice(ind, 1);
}; };
alerts.addAlerter(function(msg, type) { alerts.addAlerter(function(msg, type) {
type = type || 'warning'; type = type || "warning";
var obj = { msg: sce.trustAsHtml(msg), type: type }; var obj = { msg: sce.trustAsHtml(msg), type: type };
scope.pendingAlerts = _.filter(scope.pendingAlerts, function(al) { scope.pendingAlerts = _.filter(scope.pendingAlerts, function(al) {
return !al.expired; return !al.expired;
});
scope.pendingAlerts.push(obj);
setTimeout(function() {
var ind = scope.pendingAlerts.indexOf(obj);
if (ind != -1) {
scope.pendingAlerts[ind].expired = true;
// only remove if more notifications are pending in the pipeline
if (scope.pendingAlerts.length > 0) scope.removeAlert(ind);
}
}, type == "error" ? 15000 : 5000);
scope.$digest();
}); });
scope.pendingAlerts.push(obj); }
]);
setTimeout(function() {
var ind = scope.pendingAlerts.indexOf(obj);
if (ind != -1) {
scope.pendingAlerts[ind].expired = true;
// only remove if more notifications are pending in the pipeline
if (scope.pendingAlerts.length > 0)
scope.removeAlert(ind);
}
}, type == "error" ? 15000 : 5000);
scope.$digest();
});
}]);

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@ var parseFiles = function(files, cb) {
var txts = []; var txts = [];
var onload = function(res) { var onload = function(res) {
var txt = res.target.result; var txt = res.target.result;
txts.push(txt.split(',')[1]); txts.push(txt.split(",")[1]);
cnt--; cnt--;
if (!cnt) { if (!cnt) {
cb(txts); cb(txts);
@ -11,13 +11,13 @@ var parseFiles = function(files, cb) {
}; };
_.each(files, function(file) { _.each(files, function(file) {
cnt++; cnt++;
console.log('starting file reader'); console.log("starting file reader");
var reader = new FileReader(); var reader = new FileReader();
reader.onload = onload; reader.onload = onload;
reader.onerror = function(err) { reader.onerror = function(err) {
// return error // return error
// TODO: find a better way to propogate error upstream // TODO: find a better way to propogate error upstream
console.log('got back error', err); console.log("got back error", err);
cb([]); cb([]);
}; };
reader.readAsDataURL(file); reader.readAsDataURL(file);
@ -25,261 +25,294 @@ var parseFiles = function(files, cb) {
}; };
angular angular
.module('webui.ctrls.modal', [ .module("webui.ctrls.modal", [
"ui.bootstrap", 'webui.services.deps', 'webui.services.modals', 'webui.services.rpc', "ui.bootstrap",
'webui.services.configuration' "webui.services.deps",
]) "webui.services.modals",
.controller('ModalCtrl', [ "webui.services.rpc",
'$_', '$scope', '$modal', "$modals", '$rpc','$fileSettings', '$downloadProps', "webui.services.configuration"
function(_, scope, $modal, modals, rpc, fsettings, dprops) { ])
.controller("ModalCtrl", [
"$_",
"$scope",
"$modal",
"$modals",
"$rpc",
"$fileSettings",
"$downloadProps",
function(_, scope, $modal, modals, rpc, fsettings, dprops) {
scope.getUris = {
open: function(cb) {
var self = this;
this.uris = "";
this.downloadSettingsCollapsed = true;
this.advancedSettingsCollapsed = true;
this.settings = {};
this.fsettings = _.cloneDeep(fsettings);
this.cb = cb;
scope.getUris = { // fill in default download properties
open: function(cb) { _.forEach(dprops, function(p) {
var self = this; self.settings[p] = self.fsettings[p];
this.uris = ""; delete self.fsettings[p];
this.downloadSettingsCollapsed = true;
this.advancedSettingsCollapsed = true;
this.settings = {};
this.fsettings = _.cloneDeep(fsettings);
this.cb = cb;
// fill in default download properties
_.forEach(dprops, function(p) {
self.settings[p] = self.fsettings[p];
delete self.fsettings[p];
});
this.inst = $modal.open({
templateUrl: "getUris.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(function() {
delete self.inst;
if (self.cb) {
var settings = {};
// no need to send in default values, just the changed ones
for (var i in self.settings) {
if (fsettings[i].val != self.settings[i].val)
settings[i] = self.settings[i].val;
}
for (var i in self.fsettings) {
if (fsettings[i].val != self.fsettings[i].val)
settings[i] = self.fsettings[i].val;
}
console.log('sending settings:', settings);
self.cb(self.parse(), settings);
}
},
function() {
delete self.inst;
});
},
parse: function() {
return _
.chain(this.uris.trim().split(/\r?\n/g))
.map(function(d) {
return _(d)
.replace(/["'][^"']*["']/g, function(c) {
return c.replace(/%/g,'%25').replace(/ /g,'%20');
})
.trim()
.split(/\s+/g)
.map(function(c) {
return c.replace(/%20/g,' ').replace(/%25/g,'%').replace(/["']/g,'');
});
})
.filter(function(d) { return d.length })
.value();
}
};
scope.settings = {
open: function(settings, title, actionText, cb) {
var self = this;
this.settings = settings;
this.title = title;
this.actionText = actionText;
this.inst = $modal.open({
templateUrl: "settings.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(function() {
delete self.inst;
if (cb) {
cb(self.settings);
}
},
function() {
delete self.inst;
});
}
};
scope.selectFiles = {
open: function(files, cb) {
var self = this;
this.files = _.cloneDeep(files);
var groupFiles = function (files) {
// sort files alphabetically
files.sort(function (a, b) {
if (a.relpath < b.relpath) {
return -1;
} else {
return 1;
}
}); });
function OrganizedFolder () {
this.inst = $modal.open({
templateUrl: "getUris.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(
function() {
delete self.inst;
if (self.cb) {
var settings = {};
// no need to send in default values, just the changed ones
for (var i in self.settings) {
if (fsettings[i].val != self.settings[i].val) settings[i] = self.settings[i].val;
}
for (var i in self.fsettings) {
if (fsettings[i].val != self.fsettings[i].val)
settings[i] = self.fsettings[i].val;
}
console.log("sending settings:", settings);
self.cb(self.parse(), settings);
}
},
function() {
delete self.inst;
}
);
},
parse: function() {
return _.chain(this.uris.trim().split(/\r?\n/g))
.map(function(d) {
return _(d)
.replace(/["'][^"']*["']/g, function(c) {
return c.replace(/%/g, "%25").replace(/ /g, "%20");
})
.trim()
.split(/\s+/g)
.map(function(c) {
return c
.replace(/%20/g, " ")
.replace(/%25/g, "%")
.replace(/["']/g, "");
});
})
.filter(function(d) {
return d.length;
})
.value();
}
};
scope.settings = {
open: function(settings, title, actionText, cb) {
var self = this;
this.settings = settings;
this.title = title;
this.actionText = actionText;
this.inst = $modal.open({
templateUrl: "settings.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(
function() {
delete self.inst;
if (cb) {
cb(self.settings);
}
},
function() {
delete self.inst;
}
);
}
};
scope.selectFiles = {
open: function(files, cb) {
var self = this;
this.files = _.cloneDeep(files);
var groupFiles = function(files) {
// sort files alphabetically
files.sort(function(a, b) {
if (a.relpath < b.relpath) {
return -1;
} else {
return 1;
}
});
function OrganizedFolder() {
this.dirs = {}; this.dirs = {};
this.files = []; this.files = [];
this.show = false; this.show = false;
this.selected = true; this.selected = true;
} }
var folder = new OrganizedFolder(), tmp; var folder = new OrganizedFolder(),
for (var i = 0; i < files.length; i++) { tmp;
for (var i = 0; i < files.length; i++) {
tmp = folder; tmp = folder;
var str = files[i].relpath; var str = files[i].relpath;
var arr = str.split("/"); var arr = str.split("/");
for (var j = 0; j < arr.length - 1; j++) { for (var j = 0; j < arr.length - 1; j++) {
if (!tmp.dirs[arr[j]]) { if (!tmp.dirs[arr[j]]) {
tmp.dirs[arr[j]] = new OrganizedFolder(); tmp.dirs[arr[j]] = new OrganizedFolder();
} }
tmp = tmp.dirs[arr[j]]; tmp = tmp.dirs[arr[j]];
} }
tmp.files.push(files[i]); tmp.files.push(files[i]);
} }
return folder; return folder;
};
this.groupedFiles = groupFiles(this.files);
this.inst = $modal.open({
templateUrl: "selectFiles.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(
function() {
delete self.inst;
if (cb) {
cb(self.files);
}
},
function() {
delete self.inst;
}
);
}
}; };
this.groupedFiles = groupFiles(this.files);
this.inst = $modal.open({
templateUrl: "selectFiles.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(function() { scope.connection = {
delete self.inst; open: function(defaults, cb) {
var self = this;
if (cb) { // XXX We need to actually clone this!
cb(self.files); this.conf = rpc.getConfiguration();
} this.inst = $modal.open({
}, templateUrl: "connection.html",
function() { scope: scope,
delete self.inst; windowClass: "modal-large"
}); });
}
};
scope.connection = { this.inst.result.then(
open: function(defaults, cb) { function() {
var self = this; delete self.inst;
if (cb) {
// XXX We need to actually clone this! cb(self.conf);
this.conf = rpc.getConfiguration();
this.inst = $modal.open({
templateUrl: "connection.html",
scope: scope,
windowClass: "modal-large",
});
this.inst.result.then(function() {
delete self.inst;
if (cb) {
cb(self.conf);
}
},
function() {
delete self.inst;
});
}
};
_.each(['getTorrents', 'getMetalinks'], function(name) {
scope[name] = {
open: function(cb) {
var self = this;
this.files = [];
this.collapsed = true;
this.settings = {};
this.fsettings = _.cloneDeep(fsettings);
// fill in default download properties
_.forEach(dprops, function(p) {
self.settings[p] = self.fsettings[p];
delete self.fsettings[p];
});
this.inst = $modal.open({
templateUrl: name + ".html",
scope: scope,
windowClass: "modal-large",
});
this.inst.result.then(function() {
delete self.inst;
if (cb) {
parseFiles(self.files, function(txts) {
var settings = {};
// no need to send in default values, just the changed ones
for (var i in self.settings) {
if (fsettings[i].val != self.settings[i].val)
settings[i] = self.settings[i].val;
}
for (var i in self.fsettings) {
if (fsettings[i].val != self.fsettings[i].val)
settings[i] = self.fsettings[i].val;
} }
},
function() {
delete self.inst;
}
);
}
};
console.log('sending settings:', settings); _.each(["getTorrents", "getMetalinks"], function(name) {
cb(txts, settings); scope[name] = {
open: function(cb) {
var self = this;
this.files = [];
this.collapsed = true;
this.settings = {};
this.fsettings = _.cloneDeep(fsettings);
// fill in default download properties
_.forEach(dprops, function(p) {
self.settings[p] = self.fsettings[p];
delete self.fsettings[p];
}); });
this.inst = $modal.open({
templateUrl: name + ".html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(
function() {
delete self.inst;
if (cb) {
parseFiles(self.files, function(txts) {
var settings = {};
// no need to send in default values, just the changed ones
for (var i in self.settings) {
if (fsettings[i].val != self.settings[i].val)
settings[i] = self.settings[i].val;
}
for (var i in self.fsettings) {
if (fsettings[i].val != self.fsettings[i].val)
settings[i] = self.fsettings[i].val;
}
console.log("sending settings:", settings);
cb(txts, settings);
});
}
},
function() {
delete self.inst;
}
);
} }
}, };
function() { });
delete self.inst;
});
}
};
});
_.each(["about", "server_info"], function(name) { _.each(["about", "server_info"], function(name) {
scope[name] = { scope[name] = {
open: function() { open: function() {
var self = this; var self = this;
this.inst = $modal.open({ this.inst = $modal.open({
templateUrl: name + ".html", templateUrl: name + ".html",
scope: scope scope: scope
}); });
this.inst.result.then(function() { this.inst.result.then(
delete self.inst; function() {
}, delete self.inst;
function() { },
delete self.inst; function() {
}); delete self.inst;
} }
}; );
}); }
};
});
rpc.once('getVersion', [], function(data) { rpc.once("getVersion", [], function(data) {
scope.miscellaneous = data[0]; scope.miscellaneous = data[0];
}); });
_.each([ _.each(
'getUris', 'getTorrents', 'getMetalinks', 'selectFiles', [
'settings', 'connection', 'server_info', 'about' "getUris",
], function(name) { "getTorrents",
modals.register(name, function() { "getMetalinks",
if (scope[name].inst) { "selectFiles",
// Already open. "settings",
return; "connection",
} "server_info",
var args = Array.prototype.slice.call(arguments, 0); "about"
scope[name].open.apply(scope[name], args); ],
}); function(name) {
}); modals.register(name, function() {
if (scope[name].inst) {
}]); // Already open.
return;
}
var args = Array.prototype.slice.call(arguments, 0);
scope[name].open.apply(scope[name], args);
});
}
);
}
]);

View File

@ -1,145 +1,148 @@
angular angular
.module('webui.ctrls.nav', [ .module("webui.ctrls.nav", [
'webui.services.configuration', 'webui.services.modals', "webui.services.configuration",
'webui.services.rpc', 'webui.services.rpc.helpers', "webui.services.modals",
'webui.services.settings', 'webui.services.utils' "webui.services.rpc",
]) "webui.services.rpc.helpers",
.controller('NavCtrl', [ "webui.services.settings",
'$scope', '$modals', "webui.services.utils"
'$rpc', '$rpchelpers', '$fileSettings', ])
'$globalSettings', '$globalExclude', .controller("NavCtrl", [
'$utils', '$translate', '$filter', "$scope",
function( "$modals",
scope, modals, "$rpc",
rpc, rhelpers, fsettings, "$rpchelpers",
gsettings, gexclude, "$fileSettings",
utils, translate, filter "$globalSettings",
) { "$globalExclude",
"$utils",
"$translate",
"$filter",
function(
scope,
modals,
rpc,
rhelpers,
fsettings,
gsettings,
gexclude,
utils,
translate,
filter
) {
scope.isFeatureEnabled = function(f) {
return rhelpers.isFeatureEnabled(f);
};
scope.isFeatureEnabled = function(f) { return rhelpers.isFeatureEnabled(f) }; // initially collapsed in mobile resolution
scope.collapsed = true;
// initially collapsed in mobile resolution scope.onDownloadFilter = function() {
scope.collapsed = true; // Forward to MainCtrl.
scope.$parent.downloadFilter = scope.downloadFilter;
scope.$parent.onDownloadFilter();
};
scope.onDownloadFilter = function() { // manage download functions
// Forward to MainCtrl. scope.forcePauseAll = function() {
scope.$parent.downloadFilter = scope.downloadFilter; rpc.once("forcePauseAll", []);
scope.$parent.onDownloadFilter(); };
};
// manage download functions scope.purgeDownloadResult = function() {
scope.forcePauseAll = function() { rpc.once("purgeDownloadResult", []);
rpc.once('forcePauseAll', []); };
}
scope.purgeDownloadResult = function() { scope.unpauseAll = function() {
rpc.once('purgeDownloadResult', []); rpc.once("unpauseAll", []);
} };
scope.unpauseAll = function() { scope.addUris = function() {
rpc.once('unpauseAll', []); modals.invoke("getUris", _.bind(rhelpers.addUris, rhelpers));
} };
scope.addUris = function() { scope.addMetalinks = function() {
modals.invoke( modals.invoke("getMetalinks", _.bind(rhelpers.addMetalinks, rhelpers));
'getUris', _.bind(rhelpers.addUris, rhelpers) };
);
};
scope.addMetalinks = function() { scope.addTorrents = function() {
modals.invoke( modals.invoke("getTorrents", _.bind(rhelpers.addTorrents, rhelpers));
'getMetalinks', _.bind(rhelpers.addMetalinks, rhelpers) };
);
};
scope.addTorrents = function() { scope.changeCSettings = function() {
modals.invoke( modals.invoke("connection", rpc.getConfiguration(), _.bind(rpc.configure, rpc));
'getTorrents', _.bind(rhelpers.addTorrents, rhelpers) };
);
};
scope.changeCSettings = function() { scope.changeGSettings = function() {
modals.invoke( rpc.once("getGlobalOption", [], function(data) {
'connection', rpc.getConfiguration(), _.bind(rpc.configure, rpc) var starred = utils.getCookie("aria2props");
); if (!starred || !starred.indexOf) starred = [];
} var vals = data[0];
var settings = {};
scope.changeGSettings = function() { // global settings divided into
rpc.once('getGlobalOption', [], function(data) { // file settings + some global specific
var starred = utils.getCookie('aria2props'); // settings
if (!starred || !starred.indexOf) starred = [];
var vals = data[0];
var settings = {};
// global settings divided into _.forEach([fsettings, gsettings], function(sets) {
// file settings + some global specific for (var i in sets) {
// settings if (gexclude.indexOf(i) != -1) continue;
_.forEach([fsettings, gsettings], function(sets) { settings[i] = _.cloneDeep(sets[i]);
for (var i in sets) { settings[i].starred = starred.indexOf(i) != -1;
if (gexclude.indexOf(i) != -1) continue; }
});
settings[i] = _.cloneDeep(sets[i]); for (var i in vals) {
settings[i].starred = starred.indexOf(i) != -1; if (i in gexclude) continue;
}
});
for (var i in vals) { if (!(i in settings)) {
if (i in gexclude) continue; settings[i] = { name: i, val: vals[i], desc: "", starred: starred.indexOf(i) != -1 };
} else {
settings[i].val = vals[i];
}
}
if (!(i in settings)) { modals.invoke(
settings[i] = { name: i, val: vals[i], desc: '', starred: starred.indexOf(i) != -1 }; "settings",
} _.cloneDeep(settings),
filter("translate")("Global Settings"),
filter("translate")("Save"),
function(chsettings) {
var sets = {};
var starred = [];
for (var i in chsettings) {
// no need to change default values
if (settings[i].val != chsettings[i].val) sets[i] = chsettings[i].val;
else { if (chsettings[i].starred) {
settings[i].val = vals[i]; starred.push(i);
} }
} }
modals.invoke( console.log("saving aria2 settings:", sets);
'settings', _.cloneDeep(settings), console.log("saving aria2 starred:", starred);
filter('translate')('Global Settings'),
filter('translate')('Save'),
function(chsettings) {
var sets = {}; rpc.once("changeGlobalOption", [sets]);
var starred = []; utils.setCookie("aria2props", starred);
for (var i in chsettings) { }
// no need to change default values );
if (settings[i].val != chsettings[i].val) });
sets[i] = chsettings[i].val };
if (chsettings[i].starred) { scope.showServerInfo = function() {
starred.push(i); modals.invoke("server_info");
} };
};
console.log('saving aria2 settings:', sets); scope.showAbout = function() {
console.log('saving aria2 starred:', starred); modals.invoke("about");
};
rpc.once('changeGlobalOption', [sets]); scope.changeLanguage = function(langkey) {
utils.setCookie('aria2props', starred); translate.use(langkey);
}); };
});
};
scope.showServerInfo = function() { scope.shutDownServer = function() {
modals.invoke( rpc.once("shutdown", []);
'server_info' };
); }
}; ]);
scope.showAbout = function() {
modals.invoke(
'about'
);
};
scope.changeLanguage = function (langkey) {
translate.use(langkey);
};
scope.shutDownServer = function () {
rpc.once('shutdown', []);
};
}]);

View File

@ -1,85 +1,93 @@
angular.module('webui.ctrls.props', [ angular
'webui.services.utils', 'webui.services.settings', 'webui.services.deps', .module("webui.ctrls.props", [
'webui.services.rpc', 'webui.services.configuration', "webui.services.utils",
]) "webui.services.settings",
.controller('StarredPropsCtrl', ['$scope', '$_', '$utils', '$rpc', '$globalSettings', '$fileSettings', '$starredProps', "webui.services.deps",
function(scope, _, utils, rpc, gsettings, fsettings, starredProps) { "webui.services.rpc",
scope._props = []; "webui.services.configuration"
scope.dirty = true; ])
scope.properties = []; .controller("StarredPropsCtrl", [
scope.getProps = function() { "$scope",
var props = utils.getCookie('aria2props'); "$_",
if (!props || !props.indexOf) props = starredProps; // default properties starred in the global configuration file "$utils",
"$rpc",
"$globalSettings",
"$fileSettings",
"$starredProps",
function(scope, _, utils, rpc, gsettings, fsettings, starredProps) {
scope._props = [];
scope.dirty = true;
scope.properties = [];
scope.getProps = function() {
var props = utils.getCookie("aria2props");
if (!props || !props.indexOf) props = starredProps; // default properties starred in the global configuration file
return props; return props;
}; };
scope.enabled = function() { scope.enabled = function() {
for (var i = 0; i < scope.properties.length; i++) { for (var i = 0; i < scope.properties.length; i++) {
if (scope.properties[i]._val != scope.properties[i].val) return true; if (scope.properties[i]._val != scope.properties[i].val) return true;
}
return false;
}
scope.save = function() {
var sets = {};
var found = false;
for (var i = 0; i < scope.properties.length; i++) {
if (scope.properties[i]._val != scope.properties[i].val) {
sets[scope.properties[i].name] = scope.properties[i].val;
found = true;
}
}
if (found) {
rpc.once('changeGlobalOption', [sets]);
}
}
rpc.subscribe('getGlobalOption', [], function(data) {
var vals = data[0];
var props = scope.getProps();
var arr = [];
for (var i = 0; i < props.length; i++) {
var set = {};
if (props[i] in gsettings) {
set = gsettings[props[i]];
if (props[i] in vals) {
set.val = vals[props[i]];
} }
set.name = props[i];
arr.push(set); return false;
} };
else if (props[i] in fsettings) {
set = fsettings[props[i]]; scope.save = function() {
if (props[i] in vals) { var sets = {};
set.val = vals[props[i]]; var found = false;
for (var i = 0; i < scope.properties.length; i++) {
if (scope.properties[i]._val != scope.properties[i].val) {
sets[scope.properties[i].name] = scope.properties[i].val;
found = true;
}
} }
set.name = props[i];
arr.push(set); if (found) {
} rpc.once("changeGlobalOption", [sets]);
else if (props[i] in vals) { }
arr.push({name: props[i], val: vals[props[i]]}); };
}
rpc.subscribe("getGlobalOption", [], function(data) {
var vals = data[0];
var props = scope.getProps();
var arr = [];
for (var i = 0; i < props.length; i++) {
var set = {};
if (props[i] in gsettings) {
set = gsettings[props[i]];
if (props[i] in vals) {
set.val = vals[props[i]];
}
set.name = props[i];
arr.push(set);
} else if (props[i] in fsettings) {
set = fsettings[props[i]];
if (props[i] in vals) {
set.val = vals[props[i]];
}
set.name = props[i];
arr.push(set);
} else if (props[i] in vals) {
arr.push({ name: props[i], val: vals[props[i]] });
}
}
utils.mergeMap(arr, scope.properties, function(prop, nprop) {
nprop = nprop || {};
nprop.name = prop.name;
nprop.options = prop.options;
nprop.multiline = prop.multiline;
if (nprop._val == nprop.val || nprop.val == prop.val) {
nprop._val = prop.val;
nprop.val = prop.val;
} else {
nprop._val = prop.val;
}
nprop.desc = prop.desc;
return nprop;
});
});
} }
]);
utils.mergeMap(arr, scope.properties, function(prop, nprop) {
nprop = nprop || {};
nprop.name = prop.name;
nprop.options = prop.options;
nprop.multiline = prop.multiline;
if (nprop._val == nprop.val || nprop.val == prop.val) {
nprop._val = prop.val;
nprop.val = prop.val;
}
else {
nprop._val = prop.val;
}
nprop.desc = prop.desc;
return nprop;
});
});
}]);

View File

@ -1,49 +1,50 @@
var draw = function(canvas, chunks, fillStyle) { var draw = function(canvas, chunks, fillStyle) {
chunks = chunks || []; chunks = chunks || [];
if (!canvas.getContext) { if (!canvas.getContext) {
console.log('use chunk bar on an canvas implementation!'); console.log("use chunk bar on an canvas implementation!");
return; return;
} }
var ctx = canvas.getContext('2d'); var ctx = canvas.getContext("2d");
ctx.fillStyle = fillStyle || "#149BDF"; ctx.fillStyle = fillStyle || "#149BDF";
ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.clearRect(0, 0, canvas.width, canvas.height);
var x = 0, var x = 0,
width = canvas.width, width = canvas.width,
height = canvas.height; height = canvas.height;
chunks.forEach(function(c) { chunks.forEach(function(c) {
var dx = c.ratio * width; var dx = c.ratio * width;
if (c.show) if (c.show) ctx.fillRect(x, 0, dx, height);
ctx.fillRect(x, 0, dx, height);
x += dx; x += dx;
}); });
}; };
// put chunkbar and bitfield attributes in a canvas element // put chunkbar and bitfield attributes in a canvas element
// to use the directive, draw is optional and canvas is // to use the directive, draw is optional and canvas is
// only drawn when it is true if given // only drawn when it is true if given
angular angular.module("webui.directives.chunkbar", ["webui.services.utils"]).directive("chunkbar", [
.module('webui.directives.chunkbar', ['webui.services.utils']) "$utils",
.directive('chunkbar', ['$utils', function(utils) { function(utils) {
return function(scope, elem, attrs) { return function(scope, elem, attrs) {
var bitfield = "", pieces = 0, canDraw = true; var bitfield = "",
var update = function() { pieces = 0,
if (canDraw) canDraw = true;
draw(elem[0], utils.getChunksFromHex(bitfield, pieces), attrs.fillStyle); var update = function() {
}; if (canDraw) draw(elem[0], utils.getChunksFromHex(bitfield, pieces), attrs.fillStyle);
scope.$watch(attrs.bitfield, function(bf) { };
bitfield = bf; scope.$watch(attrs.bitfield, function(bf) {
update(); bitfield = bf;
}); update();
scope.$watch(attrs.pieces, function(p) { });
pieces = p; scope.$watch(attrs.pieces, function(p) {
update(); pieces = p;
}); update();
if (attrs.draw) {
scope.$watch(attrs.draw, function(val) {
canDraw = val;
}); });
}
update(); if (attrs.draw) {
}; scope.$watch(attrs.draw, function(val) {
}]); canDraw = val;
});
}
update();
};
}
]);

View File

@ -2,154 +2,158 @@
// the last 180 secs, it also takes draw as an optional attribute and only // the last 180 secs, it also takes draw as an optional attribute and only
// draws the graph when it is true, if not given then graph is always drawn // draws the graph when it is true, if not given then graph is always drawn
angular angular
.module('webui.directives.dgraph', ['webui.filters.bytes', 'webui.services.deps']) .module("webui.directives.dgraph", ["webui.filters.bytes", "webui.services.deps"])
.directive('dgraph', ['$', '$filter', '$parse', function($, filter, parse) { .directive("dgraph", [
var ratio = 0.6; "$",
var xfmt = "%H:%M:%S"; "$filter",
var yTicks = 7; // Number of y-axis ticks (sans 0) "$parse",
var xticks = 10; // Number of x-axis ticks (sans 0) function($, filter, parse) {
var yTickBase = 10240; // y-axis ticks must be a multiple of this (bytes). var ratio = 0.6;
try { var xfmt = "%H:%M:%S";
// Try to detect AM/PM locales. var yTicks = 7; // Number of y-axis ticks (sans 0)
if (!/16/.test(new Date(2000,0,1,16,7,9).toLocaleTimeString())) { var xticks = 10; // Number of x-axis ticks (sans 0)
xfmt = "%I:%M:%S %P"; var yTickBase = 10240; // y-axis ticks must be a multiple of this (bytes).
try {
// Try to detect AM/PM locales.
if (!/16/.test(new Date(2000, 0, 1, 16, 7, 9).toLocaleTimeString())) {
xfmt = "%I:%M:%S %P";
}
} catch (ex) {
// Ignore. Browser does not support toLocaleTimeString.
}
return function(scope, elem, attrs) {
var canDraw = false;
var graphSize = 180,
dspeed = 0,
uspeed = 0,
hasSpeeds = false,
dconf = {
label: "DOWN",
data: [],
color: "#00ff00",
lines: { show: true }
},
uconf = {
label: "UP",
data: [],
color: "#0000ff",
lines: { show: true }
};
// hack for the null height for flot elem
elem.height(elem.width() * ratio);
var graph = $.plot(elem, [dconf, uconf], {
legend: {
show: attrs.nolabel == undefined,
backgroundOpacity: 0,
margin: [10, 20],
labelFormatter: function(label, series) {
if (!series.data.length) {
return label;
}
return label + " (" + filter("bspeed")(series.data[series.data.length - 1][1]) + ")";
},
position: "sw"
},
xaxis: {
show: true,
mode: "time",
timeformat: xfmt,
ticks: +attrs.xticks || xticks, // allow users of the directive to overwride xticks
minTickSize: [30, "second"] // 180 / 30 == 6
},
yaxis: {
position: "right",
ticks: function(axis) {
var res = [0];
yt = +attrs.yticks || yticks; // allow users of directive to overwride yticks
var step = yTickBase * Math.max(1, Math.ceil(axis.max / (yt * yTickBase)));
for (var s = 0; s < yt; s++) {
var c = step * s;
if (c > axis.max) break;
res.push(step * s);
}
return res;
},
tickFormatter: function(val, axis) {
return filter("bspeed")(val);
},
min: 0
}
});
var draw = function() {
var width = elem.width();
if (width == 0) return;
elem.height(width * ratio);
graph.setData([dconf, uconf]);
graph.resize();
graph.setupGrid();
graph.draw();
};
function update() {
if (!hasSpeeds) {
return;
}
// Convoluted way to get the local date timestamp instead of the UTC one.
var cnt = new Date();
cnt = Date.UTC(
cnt.getFullYear(),
cnt.getMonth(),
cnt.getDate(),
cnt.getHours(),
cnt.getMinutes(),
cnt.getSeconds()
);
if (dconf.data.length === graphSize) dconf.data.shift();
dconf.data.push([cnt, dspeed]);
if (uconf.data.length === graphSize) uconf.data.shift();
uconf.data.push([cnt, uspeed]);
// if any parents is collapsable, then confirm if it isnt
if (canDraw) {
draw();
}
}
scope.$watch(attrs.dspeed, function(val) {
if (val === undefined) {
return;
}
hasSpeeds = true;
dspeed = parseFloat(val) || 0;
});
scope.$watch(attrs.uspeed, function(val) {
if (val === undefined) {
return;
}
hasSpeeds = true;
uspeed = parseFloat(val) || 0;
});
scope.$watch(attrs.draw, function(val) {
canDraw = val;
});
var interval = setInterval(update, 1000);
angular.element(window).bind("resize", draw);
elem.bind("$destroy", function() {
clearInterval(interval);
});
};
} }
} ]);
catch (ex) {
// Ignore. Browser does not support toLocaleTimeString.
}
return function(scope, elem, attrs) {
var canDraw = false;
var graphSize = 180
, dspeed = 0, uspeed = 0, hasSpeeds = false
, dconf = {
label: "DOWN",
data: [],
color: "#00ff00",
lines: { show: true }
}
, uconf = {
label: "UP",
data: [],
color: "#0000ff",
lines: { show: true }
}
;
// hack for the null height for flot elem
elem.height(elem.width() * ratio);
var graph = $.plot(elem, [dconf, uconf], {
legend: {
show: (attrs.nolabel == undefined),
backgroundOpacity: 0,
margin: [10, 20],
labelFormatter: function(label, series) {
if (!series.data.length) {
return label;
}
return label + " (" + filter("bspeed")(series.data[series.data.length-1][1]) + ")";
},
position: "sw"
},
xaxis: {
show: true,
mode: "time",
timeformat: xfmt,
ticks: +attrs.xticks || xticks, // allow users of the directive to overwride xticks
minTickSize: [30, "second"] // 180 / 30 == 6
},
yaxis: {
position: "right",
ticks: function(axis) {
var res = [0];
yt = +attrs.yticks || yticks; // allow users of directive to overwride yticks
var step = yTickBase * Math.max(1, Math.ceil(axis.max / (yt * yTickBase)))
for (var s = 0; s < yt; s++) {
var c = step * s;
if (c > axis.max)
break;
res.push(step * s);
}
return res;
},
tickFormatter: function(val, axis) {
return filter('bspeed')(val);
},
min: 0
}
});
var draw = function() {
var width = elem.width();
if (width == 0) return;
elem.height(width * ratio);
graph.setData([dconf, uconf]);
graph.resize();
graph.setupGrid();
graph.draw();
};
function update() {
if (!hasSpeeds) {
return;
}
// Convoluted way to get the local date timestamp instead of the UTC one.
var cnt = new Date();
cnt = Date.UTC(
cnt.getFullYear(),
cnt.getMonth(),
cnt.getDate(),
cnt.getHours(),
cnt.getMinutes(),
cnt.getSeconds());
if (dconf.data.length === graphSize) dconf.data.shift();
dconf.data.push([cnt, dspeed]);
if (uconf.data.length === graphSize) uconf.data.shift();
uconf.data.push([cnt, uspeed]);
// if any parents is collapsable, then confirm if it isnt
if (canDraw) {
draw();
}
};
scope.$watch(attrs.dspeed, function(val) {
if (val === undefined) {
return;
}
hasSpeeds = true;
dspeed = parseFloat(val) || 0;
});
scope.$watch(attrs.uspeed, function(val) {
if (val === undefined) {
return;
}
hasSpeeds = true;
uspeed = parseFloat(val) || 0;
});
scope.$watch(attrs.draw, function(val) {
canDraw = val;
});
var interval = setInterval(update, 1000);
angular.element(window).bind('resize', draw);
elem.bind('$destroy', function() {
clearInterval(interval);
});
};
}]);

View File

@ -2,125 +2,152 @@
// puts the files selected in an attribute // puts the files selected in an attribute
var app = angular.module("webui.directives.fileselect", ["webui.services.deps"]); var app = angular.module("webui.directives.fileselect", ["webui.services.deps"]);
app.directive("indeterminate", [ app.directive("indeterminate", [
"$parse", function syncInput (parse) { "$parse",
return { function syncInput(parse) {
require : "ngModel", return {
// Restrict the directive so it can only be used as an attribute require: "ngModel",
restrict : "A", // Restrict the directive so it can only be used as an attribute
restrict: "A",
link : function link (scope, elem, attr, ngModelCtrl) { link: function link(scope, elem, attr, ngModelCtrl) {
// Whenever the bound value of the attribute changes we update // Whenever the bound value of the attribute changes we update
// use upward emit notification for change to prevent the performance penalty bring by $scope.$watch // use upward emit notification for change to prevent the performance penalty bring by $scope.$watch
var getter = parse(attr["ngModel"]); var getter = parse(attr["ngModel"]);
// var setter = getter.assign; // var setter = getter.assign;
var children = []; // cache children input var children = []; // cache children input
var cacheSelectedSubInputNumber = 0; var cacheSelectedSubInputNumber = 0;
var cacheNoSelectedSubInputNumber = 0; var cacheNoSelectedSubInputNumber = 0;
var get = function () { var get = function() {
return getter(scope); return getter(scope);
}; };
// the internal 'indeterminate' flag on the attached dom element // the internal 'indeterminate' flag on the attached dom element
var setIndeterminateState = function (newValue) { var setIndeterminateState = function(newValue) {
elem.prop("indeterminate", newValue); elem.prop("indeterminate", newValue);
}; };
var setModelValueWithSideEffect = function (newVal) { // will cause to emit corresponding events var setModelValueWithSideEffect = function(newVal) {
ngModelCtrl.$setViewValue(newVal); // will cause to emit corresponding events
ngModelCtrl.$render(); ngModelCtrl.$setViewValue(newVal);
}; ngModelCtrl.$render();
var passIfIsLeafChild = function (callback) { // ensure to execute callback only when this input has one or more subinputs };
return function () { var passIfIsLeafChild = function(callback) {
if (children.length > 0) { // ensure to execute callback only when this input has one or more subinputs
callback.apply(this, arguments); return function() {
} if (children.length > 0) {
}; callback.apply(this, arguments);
}; }
var passIfNotIsLeafChild = function (callback) { // ensure to execute callback only when this input hasn't any subinput };
return function () { };
if (children.length === 0) { var passIfNotIsLeafChild = function(callback) {
callback.apply(this, arguments); // ensure to execute callback only when this input hasn't any subinput
} return function() {
}; if (children.length === 0) {
}; callback.apply(this, arguments);
var passThroughThisScope = function (callback) { // pass through the event from the scope where they sent }
return function (event) { };
if (event.targetScope !== event.currentScope) { };
return callback.apply(this, arguments); var passThroughThisScope = function(callback) {
} // pass through the event from the scope where they sent
}; return function(event) {
}; if (event.targetScope !== event.currentScope) {
var passIfIsIndeterminate = function (callback) { // pass through the event when this input is indeterminate return callback.apply(this, arguments);
return function () { }
if (!elem.prop("indeterminate")) { };
return callback.apply(this, arguments); };
} var passIfIsIndeterminate = function(callback) {
}; // pass through the event when this input is indeterminate
}; return function() {
/* var catchEventOnlyOnce = function (callback) { // only fire once, and stop event's propagation if (!elem.prop("indeterminate")) {
return callback.apply(this, arguments);
}
};
};
/* var catchEventOnlyOnce = function (callback) { // only fire once, and stop event's propagation
return function (event) { return function (event) {
callback.apply(this, arguments); callback.apply(this, arguments);
return event.stopPropagation(); return event.stopPropagation();
}; };
}; */ }; */
if (attr["indeterminate"] && parse(attr["indeterminate"]).constant) { if (attr["indeterminate"] && parse(attr["indeterminate"]).constant) {
setIndeterminateState(scope.$eval(attr["indeterminate"])); // set to default value (set in template) setIndeterminateState(scope.$eval(attr["indeterminate"])); // set to default value (set in template)
} }
if (attr["indeterminate"] && parse(attr["indeterminate"]).constant && !scope.$eval(attr["indeterminate"])) { if (
// when this input wont have subinput, they will only receive parent change and emit child change event attr["indeterminate"] &&
ngModelCtrl.$viewChangeListeners.push(passIfNotIsLeafChild(function () { parse(attr["indeterminate"]).constant &&
scope.$emit("childSelectedChange", get()); // notifies parents to change their state !scope.$eval(attr["indeterminate"])
})); ) {
scope.$on("ParentSelectedChange", passThroughThisScope(passIfNotIsLeafChild( // when this input wont have subinput, they will only receive parent change and emit child change event
function (event, newVal) { ngModelCtrl.$viewChangeListeners.push(
setModelValueWithSideEffect(newVal); // set value to parent's value; this will cause listener to emit childChange event; this won't be a infinite loop passIfNotIsLeafChild(function() {
}))); scope.$emit("childSelectedChange", get()); // notifies parents to change their state
// init first time and only once })
scope.$emit("i'm child input", get); // traverses upwards toward the root scope notifying the listeners for keep reference to this input's value );
scope.$emit("childSelectedChange", get()); // force emitted, and force the parent change their state base on children at first time scope.$on(
"ParentSelectedChange",
passThroughThisScope(
passIfNotIsLeafChild(function(event, newVal) {
setModelValueWithSideEffect(newVal); // set value to parent's value; this will cause listener to emit childChange event; this won't be a infinite loop
})
)
);
// init first time and only once
scope.$emit("i'm child input", get); // traverses upwards toward the root scope notifying the listeners for keep reference to this input's value
scope.$emit("childSelectedChange", get()); // force emitted, and force the parent change their state base on children at first time
} else {
// establish parent-child's relation
// listen for the child emitted token
scope.$on(
"i'm child input",
passThroughThisScope(
// can't apply pass passIfIsLeafChild, at beginning all has not child input
function(event, child) {
children.push(child);
}
)
);
var updateBaseOnChildrenState = function(event, newChildValue) {
if (cacheSelectedSubInputNumber + cacheNoSelectedSubInputNumber !== children.length) {
// cache childern state
cacheSelectedSubInputNumber = 0;
cacheNoSelectedSubInputNumber = 0;
for (var i = 0; i < children.length; i++) {
if (children[i]()) {
cacheSelectedSubInputNumber += 1;
} else { } else {
// establish parent-child's relation cacheNoSelectedSubInputNumber += 1;
// listen for the child emitted token
scope.$on("i'm child input", passThroughThisScope( // can't apply pass passIfIsLeafChild, at beginning all has not child input
function (event, child) {
children.push(child);
})
);
var updateBaseOnChildrenState = function (event, newChildValue) {
if ((cacheSelectedSubInputNumber + cacheNoSelectedSubInputNumber) !== children.length) {
// cache childern state
cacheSelectedSubInputNumber = 0;
cacheNoSelectedSubInputNumber = 0;
for (var i = 0; i < children.length; i++) {
if (children[i]()) {
cacheSelectedSubInputNumber += 1;
} else {
cacheNoSelectedSubInputNumber += 1;
}
}
} else {
// no need for recalculated children state
// just make a few change to cache value
if (newChildValue) {
cacheSelectedSubInputNumber++;
cacheNoSelectedSubInputNumber--;
} else {
cacheSelectedSubInputNumber--;
cacheNoSelectedSubInputNumber++;
}
}
var allSelected = (cacheNoSelectedSubInputNumber === 0); // if doesn't has any no selected input
var anySeleted = (cacheSelectedSubInputNumber > 0);
setIndeterminateState(allSelected !== anySeleted); // if at least one is selected, but not all then set input property indeterminate to true
setModelValueWithSideEffect(allSelected); // change binding model value and trigger onchange event
};
// is not leaf input, Only receive child change and parent change event
ngModelCtrl.$viewChangeListeners.push(passIfIsLeafChild(passIfIsIndeterminate(function () {
// emit when input property indeterminate is false, prevent recursively emitting event from parent to children, children to parent
scope.$broadcast("ParentSelectedChange", get());
})));
// reset input state base on children inputs
scope.$on("childSelectedChange", passThroughThisScope(passIfIsLeafChild(updateBaseOnChildrenState)));
} }
}
} else {
// no need for recalculated children state
// just make a few change to cache value
if (newChildValue) {
cacheSelectedSubInputNumber++;
cacheNoSelectedSubInputNumber--;
} else {
cacheSelectedSubInputNumber--;
cacheNoSelectedSubInputNumber++;
}
} }
}; var allSelected = cacheNoSelectedSubInputNumber === 0; // if doesn't has any no selected input
} var anySeleted = cacheSelectedSubInputNumber > 0;
setIndeterminateState(allSelected !== anySeleted); // if at least one is selected, but not all then set input property indeterminate to true
setModelValueWithSideEffect(allSelected); // change binding model value and trigger onchange event
};
// is not leaf input, Only receive child change and parent change event
ngModelCtrl.$viewChangeListeners.push(
passIfIsLeafChild(
passIfIsIndeterminate(function() {
// emit when input property indeterminate is false, prevent recursively emitting event from parent to children, children to parent
scope.$broadcast("ParentSelectedChange", get());
})
)
);
// reset input state base on children inputs
scope.$on(
"childSelectedChange",
passThroughThisScope(passIfIsLeafChild(updateBaseOnChildrenState))
);
}
}
};
}
]); ]);

View File

@ -1,15 +1,18 @@
// watches changes in the file upload control (input[file]) and // watches changes in the file upload control (input[file]) and
// puts the files selected in an attribute // puts the files selected in an attribute
angular angular.module("webui.directives.fselect", ["webui.services.deps"]).directive("fselect", [
.module('webui.directives.fselect', ['webui.services.deps']) "$parse",
.directive('fselect', ['$parse', function(parse) { function(parse) {
return function(scope, elem, attrs) { return function(scope, elem, attrs) {
var setfiles = parse(attrs.fselect || attrs.files).assign; var setfiles = parse(attrs.fselect || attrs.files).assign;
elem.bind('change', function() { elem
setfiles(scope, elem[0].files); .bind("change", function() {
}).filestyle({ setfiles(scope, elem[0].files);
placeholder : 'No file selected', })
iconName : 'fa fa-folder-open', .filestyle({
}); placeholder: "No file selected",
}; iconName: "fa fa-folder-open"
}]); });
};
}
]);

View File

@ -2,21 +2,20 @@ webui.directive("textarea", function() {
return { return {
restrict: "E", restrict: "E",
link: function(scope, element) { link: function(scope, element) {
element.attr( element
"placeholder", .attr("placeholder", function(index, placeholder) {
function(index, placeholder) {
if (placeholder !== undefined) { if (placeholder !== undefined) {
return placeholder.replace(/\\n/g, "\n"); return placeholder.replace(/\\n/g, "\n");
} else { } else {
return placeholder; return placeholder;
} }
} })
).bind("keydown keypress", function(event) { .bind("keydown keypress", function(event) {
if (event.ctrlKey && event.which === 13) { if (event.ctrlKey && event.which === 13) {
event.preventDefault(); event.preventDefault();
scope.$close(); scope.$close();
} }
}); });
} }
}; };
}); });

View File

@ -1,25 +1,34 @@
angular.module('webui.filters.bytes', ["webui.services.utils"]) angular
.filter('blength', ['$filter', "$utils", function(filter, utils) { .module("webui.filters.bytes", ["webui.services.utils"])
return utils.fmtsize; .filter("blength", [
}]) "$filter",
.filter('bspeed', ['$filter', "$utils", function(filter, utils) { "$utils",
return utils.fmtspeed; function(filter, utils) {
}]) return utils.fmtsize;
.filter('time', function() { }
function pad(f) { ])
return ("0" + f).substr(-2); .filter("bspeed", [
} "$filter",
"$utils",
function(filter, utils) {
return utils.fmtspeed;
}
])
.filter("time", function() {
function pad(f) {
return ("0" + f).substr(-2);
}
return function(time) { return function(time) {
time = parseInt(time, 10); time = parseInt(time, 10);
if (!time || !isFinite(time)) return "∞"; if (!time || !isFinite(time)) return "∞";
var secs = time % 60; var secs = time % 60;
if (time < 60) return secs + "s"; if (time < 60) return secs + "s";
var mins = Math.floor((time % 3600) / 60) var mins = Math.floor((time % 3600) / 60);
if (time < 3600) return pad(mins) + ":" + pad(secs); if (time < 3600) return pad(mins) + ":" + pad(secs);
var hrs = Math.floor((time % 86400) / 3600); var hrs = Math.floor((time % 86400) / 3600);
if (time < 86400) return pad(hrs) + ":" + pad(mins) + ":" + pad(secs); if (time < 86400) return pad(hrs) + ":" + pad(mins) + ":" + pad(secs);
var days = Math.floor(time / 86400); var days = Math.floor(time / 86400);
return days + "::" + pad(hrs) + ":" + pad(mins) + ":" + pad(secs); return days + "::" + pad(hrs) + ":" + pad(mins) + ":" + pad(secs);
}; };
}); });

View File

@ -1,4 +1,3 @@
angular.module('webui.filters.url', ["webui.services.utils"]) angular.module("webui.filters.url", ["webui.services.utils"]).filter("encodeURI", function() {
.filter('encodeURI', function() {
return window.encodeURI; return window.encodeURI;
}); });

View File

@ -1,68 +1,82 @@
var webui = angular.module('webui', [ var webui = angular.module("webui", [
'webui.services.utils', 'webui.services.deps', 'webui.services.base64', "webui.services.utils",
'webui.services.configuration', 'webui.services.rpc', "webui.services.deps",
'webui.services.modals', 'webui.services.alerts', "webui.services.base64",
'webui.services.settings', 'webui.services.settings.filters', "webui.services.configuration",
'webui.filters.bytes','webui.filters.url', "webui.services.rpc",
'webui.directives.chunkbar', 'webui.directives.dgraph', 'webui.directives.fselect', "webui.directives.fileselect", "webui.services.modals",
'webui.ctrls.download', 'webui.ctrls.nav', 'webui.ctrls.modal', 'webui.ctrls.alert', "webui.services.alerts",
'webui.ctrls.props', "webui.services.settings",
"webui.services.settings.filters",
"webui.filters.bytes",
"webui.filters.url",
"webui.directives.chunkbar",
"webui.directives.dgraph",
"webui.directives.fselect",
"webui.directives.fileselect",
"webui.ctrls.download",
"webui.ctrls.nav",
"webui.ctrls.modal",
"webui.ctrls.alert",
"webui.ctrls.props",
// external deps // external deps
'ui.bootstrap', "ui.bootstrap",
// translate // translate
'pascalprecht.translate' "pascalprecht.translate"
]); ]);
function mergeTranslation(translation, base) { function mergeTranslation(translation, base) {
for (var i in base) { for (var i in base) {
if (!base.hasOwnProperty(i)) { if (!base.hasOwnProperty(i)) {
continue; continue;
} }
if (!translation[i] || !translation[i].length) { if (!translation[i] || !translation[i].length) {
translation[i] = base[i]; translation[i] = base[i];
} }
} }
return translation; return translation;
} }
webui.config(function ($translateProvider, $locationProvider) { webui.config(function($translateProvider, $locationProvider) {
$translateProvider $translateProvider
.translations('en_US', translations.en_US) .translations("en_US", translations.en_US)
.translations('nl_NL', mergeTranslation(translations.nl_NL, translations.en_US)) .translations("nl_NL", mergeTranslation(translations.nl_NL, translations.en_US))
.translations('th_TH', mergeTranslation(translations.th_TH, translations.en_US)) .translations("th_TH", mergeTranslation(translations.th_TH, translations.en_US))
.translations('zh_CN', mergeTranslation(translations.zh_CN, translations.en_US)) .translations("zh_CN", mergeTranslation(translations.zh_CN, translations.en_US))
.translations('zh_TW', mergeTranslation(translations.zh_TW, translations.en_US)) .translations("zh_TW", mergeTranslation(translations.zh_TW, translations.en_US))
.translations('pl_PL', mergeTranslation(translations.pl_PL, translations.en_US)) .translations("pl_PL", mergeTranslation(translations.pl_PL, translations.en_US))
.translations('fr_FR', mergeTranslation(translations.fr_FR, translations.en_US)) .translations("fr_FR", mergeTranslation(translations.fr_FR, translations.en_US))
.translations('de_DE', mergeTranslation(translations.de_DE, translations.en_US)) .translations("de_DE", mergeTranslation(translations.de_DE, translations.en_US))
.translations('es_ES', mergeTranslation(translations.es_ES, translations.en_US)) .translations("es_ES", mergeTranslation(translations.es_ES, translations.en_US))
.translations('ru_RU', mergeTranslation(translations.ru_RU, translations.en_US)) .translations("ru_RU", mergeTranslation(translations.ru_RU, translations.en_US))
.translations('it_IT', mergeTranslation(translations.it_IT, translations.en_US)) .translations("it_IT", mergeTranslation(translations.it_IT, translations.en_US))
.translations('tr_TR', mergeTranslation(translations.tr_TR, translations.en_US)) .translations("tr_TR", mergeTranslation(translations.tr_TR, translations.en_US))
.translations('cs_CZ', mergeTranslation(translations.cs_CZ, translations.en_US)) .translations("cs_CZ", mergeTranslation(translations.cs_CZ, translations.en_US))
.translations('fa_IR', mergeTranslation(translations.fa_IR, translations.en_US)) .translations("fa_IR", mergeTranslation(translations.fa_IR, translations.en_US))
.translations('id_ID', mergeTranslation(translations.id_ID, translations.en_US)) .translations("id_ID", mergeTranslation(translations.id_ID, translations.en_US))
.translations('pt_BR', mergeTranslation(translations.pt_BR, translations.en_US)) .translations("pt_BR", mergeTranslation(translations.pt_BR, translations.en_US))
.useSanitizeValueStrategy('escapeParameters') .useSanitizeValueStrategy("escapeParameters")
.determinePreferredLanguage(); .determinePreferredLanguage();
$locationProvider.html5Mode({ $locationProvider.html5Mode({
enabled: true, enabled: true,
requireBase: false requireBase: false
}); });
}); });
$(function() { $(function() {
if (!String.prototype.startsWith) { if (!String.prototype.startsWith) {
Object.defineProperty(String.prototype, 'startsWith', { Object.defineProperty(String.prototype, "startsWith", {
enumerable: false, configurable: false, writable: false, enumerable: false,
value: function (searchString, position) { configurable: false,
position = position || 0; writable: false,
return this.indexOf(searchString, position) === position; value: function(searchString, position) {
} position = position || 0;
return this.indexOf(searchString, position) === position;
}
}); });
} }
angular.bootstrap(document, ['webui']) angular.bootstrap(document, ["webui"]);
}); });

View File

@ -7,351 +7,397 @@
* Version 1.2.1 * Version 1.2.1
* Licensed under the MIT license. * Licensed under the MIT license.
*/ */
(function($) {"use strict"; (function($) {
"use strict";
var nextId = 0; var nextId = 0;
var Filestyle = function(element, options) { var Filestyle = function(element, options) {
this.options = options; this.options = options;
this.$elementFilestyle = []; this.$elementFilestyle = [];
this.$element = $(element); this.$element = $(element);
}; };
Filestyle.prototype = { Filestyle.prototype = {
clear : function() { clear: function() {
this.$element.val(''); this.$element.val("");
this.$elementFilestyle.find(':text').val(''); this.$elementFilestyle.find(":text").val("");
this.$elementFilestyle.find('.badge').remove(); this.$elementFilestyle.find(".badge").remove();
}, },
destroy : function() { destroy: function() {
this.$element.removeAttr('style').removeData('filestyle'); this.$element.removeAttr("style").removeData("filestyle");
this.$elementFilestyle.remove(); this.$elementFilestyle.remove();
}, },
disabled : function(value) { disabled: function(value) {
if (value === true) { if (value === true) {
if (!this.options.disabled) { if (!this.options.disabled) {
this.$element.attr('disabled', 'true'); this.$element.attr("disabled", "true");
this.$elementFilestyle.find('label').attr('disabled', 'true'); this.$elementFilestyle.find("label").attr("disabled", "true");
this.options.disabled = true; this.options.disabled = true;
} }
} else if (value === false) { } else if (value === false) {
if (this.options.disabled) { if (this.options.disabled) {
this.$element.removeAttr('disabled'); this.$element.removeAttr("disabled");
this.$elementFilestyle.find('label').removeAttr('disabled'); this.$elementFilestyle.find("label").removeAttr("disabled");
this.options.disabled = false; this.options.disabled = false;
} }
} else { } else {
return this.options.disabled; return this.options.disabled;
} }
}, },
buttonBefore : function(value) { buttonBefore: function(value) {
if (value === true) { if (value === true) {
if (!this.options.buttonBefore) { if (!this.options.buttonBefore) {
this.options.buttonBefore = true; this.options.buttonBefore = true;
if (this.options.input) { if (this.options.input) {
this.$elementFilestyle.remove(); this.$elementFilestyle.remove();
this.constructor(); this.constructor();
this.pushNameFiles(); this.pushNameFiles();
} }
} }
} else if (value === false) { } else if (value === false) {
if (this.options.buttonBefore) { if (this.options.buttonBefore) {
this.options.buttonBefore = false; this.options.buttonBefore = false;
if (this.options.input) { if (this.options.input) {
this.$elementFilestyle.remove(); this.$elementFilestyle.remove();
this.constructor(); this.constructor();
this.pushNameFiles(); this.pushNameFiles();
} }
} }
} else { } else {
return this.options.buttonBefore; return this.options.buttonBefore;
} }
}, },
icon : function(value) { icon: function(value) {
if (value === true) { if (value === true) {
if (!this.options.icon) { if (!this.options.icon) {
this.options.icon = true; this.options.icon = true;
this.$elementFilestyle.find('label').prepend(this.htmlIcon()); this.$elementFilestyle.find("label").prepend(this.htmlIcon());
} }
} else if (value === false) { } else if (value === false) {
if (this.options.icon) { if (this.options.icon) {
this.options.icon = false; this.options.icon = false;
this.$elementFilestyle.find('.icon-span-filestyle').remove(); this.$elementFilestyle.find(".icon-span-filestyle").remove();
} }
} else { } else {
return this.options.icon; return this.options.icon;
} }
}, },
input : function(value) { input: function(value) {
if (value === true) { if (value === true) {
if (!this.options.input) { if (!this.options.input) {
this.options.input = true; this.options.input = true;
if (this.options.buttonBefore) { if (this.options.buttonBefore) {
this.$elementFilestyle.append(this.htmlInput()); this.$elementFilestyle.append(this.htmlInput());
} else { } else {
this.$elementFilestyle.prepend(this.htmlInput()); this.$elementFilestyle.prepend(this.htmlInput());
} }
this.$elementFilestyle.find('.badge').remove(); this.$elementFilestyle.find(".badge").remove();
this.pushNameFiles(); this.pushNameFiles();
this.$elementFilestyle.find('.group-span-filestyle').addClass('input-group-btn'); this.$elementFilestyle.find(".group-span-filestyle").addClass("input-group-btn");
} }
} else if (value === false) { } else if (value === false) {
if (this.options.input) { if (this.options.input) {
this.options.input = false; this.options.input = false;
this.$elementFilestyle.find(':text').remove(); this.$elementFilestyle.find(":text").remove();
var files = this.pushNameFiles(); var files = this.pushNameFiles();
if (files.length > 0 && this.options.badge) { if (files.length > 0 && this.options.badge) {
this.$elementFilestyle.find('label').append(' <span class="badge">' + files.length + '</span>'); this.$elementFilestyle
} .find("label")
this.$elementFilestyle.find('.group-span-filestyle').removeClass('input-group-btn'); .append(' <span class="badge">' + files.length + "</span>");
} }
} else { this.$elementFilestyle.find(".group-span-filestyle").removeClass("input-group-btn");
return this.options.input; }
} } else {
}, return this.options.input;
}
},
size : function(value) { size: function(value) {
if (value !== undefined) { if (value !== undefined) {
var btn = this.$elementFilestyle.find('label'), input = this.$elementFilestyle.find('input'); var btn = this.$elementFilestyle.find("label"),
input = this.$elementFilestyle.find("input");
btn.removeClass('btn-lg btn-sm'); btn.removeClass("btn-lg btn-sm");
input.removeClass('input-lg input-sm'); input.removeClass("input-lg input-sm");
if (value != 'nr') { if (value != "nr") {
btn.addClass('btn-' + value); btn.addClass("btn-" + value);
input.addClass('input-' + value); input.addClass("input-" + value);
} }
} else { } else {
return this.options.size; return this.options.size;
} }
}, },
placeholder : function(value) { placeholder: function(value) {
if (value !== undefined) { if (value !== undefined) {
this.options.placeholder = value; this.options.placeholder = value;
this.$elementFilestyle.find('input').attr('placeholder', value); this.$elementFilestyle.find("input").attr("placeholder", value);
} else { } else {
return this.options.placeholder; return this.options.placeholder;
} }
}, },
buttonText : function(value) { buttonText: function(value) {
if (value !== undefined) { if (value !== undefined) {
this.options.buttonText = value; this.options.buttonText = value;
this.$elementFilestyle.find('label .buttonText').html(this.options.buttonText); this.$elementFilestyle.find("label .buttonText").html(this.options.buttonText);
} else { } else {
return this.options.buttonText; return this.options.buttonText;
} }
}, },
buttonName : function(value) { buttonName: function(value) {
if (value !== undefined) { if (value !== undefined) {
this.options.buttonName = value; this.options.buttonName = value;
this.$elementFilestyle.find('label').attr({ this.$elementFilestyle.find("label").attr({
'class' : 'btn ' + this.options.buttonName class: "btn " + this.options.buttonName
}); });
} else { } else {
return this.options.buttonName; return this.options.buttonName;
} }
}, },
iconName : function(value) { iconName: function(value) {
if (value !== undefined) { if (value !== undefined) {
this.$elementFilestyle.find('.icon-span-filestyle').attr({ this.$elementFilestyle.find(".icon-span-filestyle").attr({
'class' : 'icon-span-filestyle ' + this.options.iconName class: "icon-span-filestyle " + this.options.iconName
}); });
} else { } else {
return this.options.iconName; return this.options.iconName;
} }
}, },
htmlIcon : function() { htmlIcon: function() {
if (this.options.icon) { if (this.options.icon) {
return '<span class="icon-span-filestyle ' + this.options.iconName + '"></span> '; return '<span class="icon-span-filestyle ' + this.options.iconName + '"></span> ';
} else { } else {
return ''; return "";
} }
}, },
htmlInput : function() { htmlInput: function() {
if (this.options.input) { if (this.options.input) {
return '<input type="text" class="form-control ' + (this.options.size == 'nr' ? '' : 'input-' + this.options.size) + '" placeholder="'+ this.options.placeholder +'" disabled> '; return (
} else { '<input type="text" class="form-control ' +
return ''; (this.options.size == "nr" ? "" : "input-" + this.options.size) +
} '" placeholder="' +
}, this.options.placeholder +
'" disabled> '
);
} else {
return "";
}
},
// puts the name of the input files // puts the name of the input files
// return files // return files
pushNameFiles : function() { pushNameFiles: function() {
var content = '', files = []; var content = "",
if (this.$element[0].files === undefined) { files = [];
files[0] = { if (this.$element[0].files === undefined) {
'name' : this.$element[0] && this.$element[0].value files[0] = {
}; name: this.$element[0] && this.$element[0].value
} else { };
files = this.$element[0].files; } else {
} files = this.$element[0].files;
}
for (var i = 0; i < files.length; i++) { for (var i = 0; i < files.length; i++) {
content += files[i].name.split("\\").pop() + ', '; content += files[i].name.split("\\").pop() + ", ";
} }
if (content !== '') { if (content !== "") {
this.$elementFilestyle.find(':text').val(content.replace(/\, $/g, '')); this.$elementFilestyle.find(":text").val(content.replace(/\, $/g, ""));
} else { } else {
this.$elementFilestyle.find(':text').val(''); this.$elementFilestyle.find(":text").val("");
} }
return files; return files;
}, },
constructor : function() { constructor: function() {
var _self = this, var _self = this,
html = '', html = "",
id = _self.$element.attr('id'), id = _self.$element.attr("id"),
files = [], files = [],
btn = '', btn = "",
clear = '', clear = "",
$label; $label;
if (id === '' || !id) { if (id === "" || !id) {
id = 'filestyle-' + nextId; id = "filestyle-" + nextId;
_self.$element.attr({ _self.$element.attr({
'id' : id id: id
}); });
nextId++; nextId++;
} }
html = '<div class="group-span-filestyle ' + (_self.options.input ? 'input-group-btn' : html =
'btn-group') + '">'; '<div class="group-span-filestyle ' +
btn = '<label for="' + id + '" class="btn ' + _self.options.buttonName + ' ' + (_self.options.input ? "input-group-btn" : "btn-group") +
(_self.options.size == 'nr' ? '' : 'btn-' + _self.options.size) + '" ' + '">';
(_self.options.disabled || _self.$element.attr('disabled') ? 'disabled="true"' : '') + '>' + btn =
_self.htmlIcon() + '<span class="buttonText">' + _self.options.buttonText + '</span>' + '<label for="' +
'</label>' id +
clear = '<button id="' + id + '-clear" class="btn btn-default" aria-label="Clear">' + '" class="btn ' +
'<i class="fa fa-times"></i></span></button>' _self.options.buttonName +
" " +
(_self.options.size == "nr" ? "" : "btn-" + _self.options.size) +
'" ' +
(_self.options.disabled || _self.$element.attr("disabled") ? 'disabled="true"' : "") +
">" +
_self.htmlIcon() +
'<span class="buttonText">' +
_self.options.buttonText +
"</span>" +
"</label>";
clear =
'<button id="' +
id +
'-clear" class="btn btn-default" aria-label="Clear">' +
'<i class="fa fa-times"></i></span></button>';
html = _self.options.buttonBefore ? html + btn + clear + '</div>' + _self.htmlInput() : _self.htmlInput() + html + clear + btn + '</div>'; html = _self.options.buttonBefore
? html + btn + clear + "</div>" + _self.htmlInput()
: _self.htmlInput() + html + clear + btn + "</div>";
_self.$elementFilestyle = $('<div class="bootstrap-filestyle input-group">' + html + '</div>'); _self.$elementFilestyle = $(
_self.$elementFilestyle.find('.group-span-filestyle').attr('tabindex', "0").keypress(function(e) { '<div class="bootstrap-filestyle input-group">' + html + "</div>"
if (e.keyCode === 13 || e.charCode === 32) { );
_self.$elementFilestyle.find('label').click(); _self.$elementFilestyle
return false; .find(".group-span-filestyle")
} .attr("tabindex", "0")
}); .keypress(function(e) {
_self.$elementFilestyle.find('#' + id + '-clear').click(function(e) { if (e.keyCode === 13 || e.charCode === 32) {
_self.clear(); _self.$elementFilestyle.find("label").click();
}); return false;
}
});
_self.$elementFilestyle.find("#" + id + "-clear").click(function(e) {
_self.clear();
});
// hidding input file and add filestyle // hidding input file and add filestyle
_self.$element.css({ _self.$element
'position' : 'absolute', .css({
'clip' : 'rect(0px 0px 0px 0px)' // using 0px for work in IE8 position: "absolute",
}).attr('tabindex', "-1").after(_self.$elementFilestyle); clip: "rect(0px 0px 0px 0px)" // using 0px for work in IE8
})
.attr("tabindex", "-1")
.after(_self.$elementFilestyle);
if (_self.options.disabled || _self.$element.attr('disabled')) { if (_self.options.disabled || _self.$element.attr("disabled")) {
_self.$element.attr('disabled', 'true'); _self.$element.attr("disabled", "true");
} }
// Getting input file value // Getting input file value
_self.$element.change(function() { _self.$element.change(function() {
var files = _self.pushNameFiles(); var files = _self.pushNameFiles();
if (_self.options.input == false && _self.options.badge) { if (_self.options.input == false && _self.options.badge) {
if (_self.$elementFilestyle.find('.badge').length == 0) { if (_self.$elementFilestyle.find(".badge").length == 0) {
_self.$elementFilestyle.find('label').append(' <span class="badge">' + files.length + '</span>'); _self.$elementFilestyle
} else if (files.length == 0) { .find("label")
_self.$elementFilestyle.find('.badge').remove(); .append(' <span class="badge">' + files.length + "</span>");
} else { } else if (files.length == 0) {
_self.$elementFilestyle.find('.badge').html(files.length); _self.$elementFilestyle.find(".badge").remove();
} } else {
} else { _self.$elementFilestyle.find(".badge").html(files.length);
_self.$elementFilestyle.find('.badge').remove(); }
} } else {
}); _self.$elementFilestyle.find(".badge").remove();
}
});
// Check if browser is Firefox // Check if browser is Firefox
if (window.navigator.userAgent.search(/firefox/i) > -1) { if (window.navigator.userAgent.search(/firefox/i) > -1) {
// Simulating choose file for firefox // Simulating choose file for firefox
_self.$elementFilestyle.find('label').click(function() { _self.$elementFilestyle.find("label").click(function() {
_self.$element.click(); _self.$element.click();
return false; return false;
}); });
} }
} }
}; };
var old = $.fn.filestyle; var old = $.fn.filestyle;
$.fn.filestyle = function(option, value) { $.fn.filestyle = function(option, value) {
var get = '', element = this.each(function() { var get = "",
if ($(this).attr('type') === 'file') { element = this.each(function() {
var $this = $(this), data = $this.data('filestyle'), options = $.extend({}, $.fn.filestyle.defaults, option, typeof option === 'object' && option); if ($(this).attr("type") === "file") {
var $this = $(this),
data = $this.data("filestyle"),
options = $.extend(
{},
$.fn.filestyle.defaults,
option,
typeof option === "object" && option
);
if (!data) { if (!data) {
$this.data('filestyle', ( data = new Filestyle(this, options))); $this.data("filestyle", (data = new Filestyle(this, options)));
data.constructor(); data.constructor();
} }
if ( typeof option === 'string') { if (typeof option === "string") {
get = data[option](value); get = data[option](value);
} }
} }
}); });
if ( typeof get !== undefined) { if (typeof get !== undefined) {
return get; return get;
} else { } else {
return element; return element;
} }
}; };
$.fn.filestyle.defaults = { $.fn.filestyle.defaults = {
'buttonText' : 'Choose file', buttonText: "Choose file",
'iconName' : 'glyphicon glyphicon-folder-open', iconName: "glyphicon glyphicon-folder-open",
'buttonName' : 'btn-default', buttonName: "btn-default",
'size' : 'nr', size: "nr",
'input' : true, input: true,
'badge' : true, badge: true,
'icon' : true, icon: true,
'buttonBefore' : false, buttonBefore: false,
'disabled' : false, disabled: false,
'placeholder': '' placeholder: ""
}; };
$.fn.filestyle.noConflict = function() { $.fn.filestyle.noConflict = function() {
$.fn.filestyle = old; $.fn.filestyle = old;
return this; return this;
}; };
$(function() { $(function() {
$('.filestyle').each(function() { $(".filestyle").each(function() {
var $this = $(this), options = { var $this = $(this),
options = {
input: $this.attr("data-input") !== "false",
icon: $this.attr("data-icon") !== "false",
buttonBefore: $this.attr("data-buttonBefore") === "true",
disabled: $this.attr("data-disabled") === "true",
size: $this.attr("data-size"),
buttonText: $this.attr("data-buttonText"),
buttonName: $this.attr("data-buttonName"),
iconName: $this.attr("data-iconName"),
badge: $this.attr("data-badge") !== "false",
placeholder: $this.attr("data-placeholder")
};
'input' : $this.attr('data-input') !== 'false', $this.filestyle(options);
'icon' : $this.attr('data-icon') !== 'false', });
'buttonBefore' : $this.attr('data-buttonBefore') === 'true', });
'disabled' : $this.attr('data-disabled') === 'true',
'size' : $this.attr('data-size'),
'buttonText' : $this.attr('data-buttonText'),
'buttonName' : $this.attr('data-buttonName'),
'iconName' : $this.attr('data-iconName'),
'badge' : $this.attr('data-badge') !== 'false',
'placeholder': $this.attr('data-placeholder')
};
$this.filestyle(options);
});
});
})(window.jQuery); })(window.jQuery);

View File

@ -1,21 +1,23 @@
angular.module('webui.services.alerts', ['webui.services.deps']) angular.module("webui.services.alerts", ["webui.services.deps"]).factory("$alerts", [
.factory('$alerts', ['$_', function(_) { "$_",
var alerters = []; function(_) {
return { var alerters = [];
addAlert: function() { return {
var args = Array.prototype.slice.call(arguments, 0); addAlert: function() {
setTimeout(function() { var args = Array.prototype.slice.call(arguments, 0);
_.each(alerters, function(alt) { setTimeout(function() {
alt.apply({}, args); _.each(alerters, function(alt) {
}); alt.apply({}, args);
}, 0); });
}, }, 0);
addAlerter: function(cb) { },
alerters.push(cb); addAlerter: function(cb) {
}, alerters.push(cb);
// a simple function for debugging },
log: function(msg) { // a simple function for debugging
this.addAlert(msg, 'info'); log: function(msg) {
} this.addAlert(msg, "info");
}; }
}]); };
}
]);

View File

@ -1,58 +1,65 @@
angular angular.module("webui.services.base64", []).factory("$base64", [
.module('webui.services.base64', []) function() {
.factory('$base64', [function() { var obj = {};
var obj = {}; var a64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
var a64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', a256 = {
a256 = { indexOf: function(c) {
indexOf: function (c) { return c.charCodeAt(0);
return c.charCodeAt(0); },
}, charAt: String.fromCharCode
charAt: String.fromCharCode };
function code(s, discard, alpha, beta, w1, w2) {
s = String(s);
var b = 0,
x = "",
i,
c,
bs = 1,
sb = 1,
length = s.length,
tmp;
for (i = 0; i < length || (!discard && sb > 1); i += 1) {
b *= w1;
bs *= w1;
if (i < length) {
c = alpha.indexOf(s.charAt(i));
if (c <= -1 || c >= w1) {
throw new RangeError();
}
sb *= w1;
b += c;
}
while (bs >= w2) {
bs /= w2;
if (sb > 1) {
tmp = b;
b %= bs;
x += beta.charAt((tmp - b) / bs);
sb /= w2;
}
}
}
return x;
}
obj.btoa = function(s) {
s = code(s, false, a256, a64, 256, 64);
return s + "====".slice(s.length % 4 || 4);
}; };
function code(s, discard, alpha, beta, w1, w2) { obj.atob = function(s) {
s = String(s); var i;
var b = 0, x = '', i, c, bs = 1, sb = 1, length = s.length, tmp; s = String(s).split("=");
for (i = 0; i < length || (!discard && sb > 1); i += 1) { for (i = s.length - 1; i >= 0; i -= 1) {
b *= w1; if (s[i].length % 4 === 1) {
bs *= w1;
if (i < length) {
c = alpha.indexOf(s.charAt(i));
if (c <= -1 || c >= w1) {
throw new RangeError(); throw new RangeError();
} }
sb *= w1; s[i] = code(s[i], true, a64, a256, 64, 256);
b += c;
} }
while (bs >= w2) { return s.join("");
bs /= w2; };
if (sb > 1) {
tmp = b; return obj;
b %= bs;
x += beta.charAt((tmp - b) / bs);
sb /= w2;
}
}
}
return x;
} }
]);
obj.btoa = function (s) {
s = code(s, false, a256, a64, 256, 64);
return s + '===='.slice((s.length % 4) || 4);
};
obj.atob = function (s) {
var i;
s = String(s).split('=');
for (i = s.length - 1; i >= 0; i -= 1) {
if (s[i].length % 4 === 1) {
throw new RangeError();
}
s[i] = code(s[i], true, a64, a256, 64, 256);
}
return s.join('');
};
return obj;
}]);

View File

@ -1,5 +1,5 @@
angular angular
.module('webui.services.deps', []) .module("webui.services.deps", [])
.value('$', $) .value("$", $)
.value('$_', _) .value("$_", _)
.value('$json', JSON); .value("$json", JSON);

View File

@ -1,68 +1,66 @@
angular angular.module("webui.services.errors", []).value("$getErrorStatus", function(errorCode) {
.module('webui.services.errors', []) // normalize it to 0
.value('$getErrorStatus', function(errorCode) { errorCode = errorCode - 1;
// normalize it to 0 switch (errorCode) {
errorCode = errorCode - 1; case 0:
switch(errorCode) { return "download was unsuccessful";
case 0: case 1:
return "download was unsuccessful"; return "unknown error occurred";
case 1: case 2:
return "unknown error occurred"; return "time out occurred";
case 2: case 3:
return "time out occurred"; return "resource was not found";
case 3: case 4:
return "resource was not found"; return 'aria2 saw the specified number of "resource not found" error. See --max-file-not-found option';
case 4: case 5:
return 'aria2 saw the specified number of "resource not found" error. See --max-file-not-found option'; return "download aborted because download speed was too slow. See --lowest-speed-limit option";
case 5: case 6:
return "download aborted because download speed was too slow. See --lowest-speed-limit option"; return "there were unfinished downloads";
case 6: case 7:
return "there were unfinished downloads"; return "remote server did not support resume when resume was required to complete download";
case 7: case 8:
return "remote server did not support resume when resume was required to complete download"; return "not enough disk space available";
case 8: case 9:
return "not enough disk space available"; return "piece length was different from one in .aria2 control";
case 9: case 10:
return "piece length was different from one in .aria2 control"; return "downloading same file at that moment";
case 10: case 11:
return "downloading same file at that moment"; return "downloading same info hash torrent at that moment";
case 11: case 12:
return "downloading same info hash torrent at that moment"; return "file already existed";
case 12: case 13:
return "file already existed"; return "renaming file failed";
case 13: case 14:
return "renaming file failed"; return "could not open existing file";
case 14: case 15:
return "could not open existing file"; return "could not create new file or truncate existing file";
case 15: case 16:
return "could not create new file or truncate existing file"; return "file I/O error occurred";
case 16: case 17:
return "file I/O error occurred"; return "could not create directory";
case 17: case 18:
return "could not create directory"; return "name resolution failed";
case 18: case 19:
return "name resolution failed"; return "could not parse Metalink document";
case 19: case 20:
return "could not parse Metalink document"; return "FTP command failed";
case 20: case 21:
return "FTP command failed"; return "HTTP response header was bad or unexpected";
case 21: case 22:
return "HTTP response header was bad or unexpected"; return "too many redirects occurred";
case 22: case 23:
return "too many redirects occurred"; return "HTTP authorization failed";
case 23: case 24:
return "HTTP authorization failed"; return "could not parse bencoded file";
case 24: case 25:
return "could not parse bencoded file"; return ' ".torrent" file was corrupted or missing information ';
case 25: case 26:
return ' ".torrent" file was corrupted or missing information '; return "Magnet URI was bad";
case 26: case 27:
return "Magnet URI was bad"; return "bad/unrecognized option was given or unexpected option argument was given";
case 27: case 28:
return "bad/unrecognized option was given or unexpected option argument was given"; return "remote server was unable to handle the request due to a temporary overloading or maintenance";
case 28: case 29:
return "remote server was unable to handle the request due to a temporary overloading or maintenance"; return "could not parse JSON-RPC request";
case 29: }
return "could not parse JSON-RPC request";
}
}); });

View File

@ -1,5 +1,4 @@
angular.module('webui.services.modals', []) angular.module("webui.services.modals", []).factory("$modals", function() {
.factory('$modals', function() {
var modals = {}; var modals = {};
return { return {
// register a new modal, cb is the function which // register a new modal, cb is the function which

View File

@ -1,56 +1,65 @@
angular.module('webui.services.rpc.helpers', [ angular
'webui.services.deps', 'webui.services.rpc', 'webui.services.alerts' .module("webui.services.rpc.helpers", [
]) "webui.services.deps",
.factory('$rpchelpers', ['$_', '$rpc', '$alerts', function(_, rpc, alerts) { "webui.services.rpc",
var miscellaneous = {version: '', enabledFeatures: []}; "webui.services.alerts"
rpc.once('getVersion', [], function(data) { miscellaneous = data[0]}); ])
return { .factory("$rpchelpers", [
isFeatureEnabled: function(feature) { "$_",
return miscellaneous.enabledFeatures.indexOf(feature) != -1; "$rpc",
}, "$alerts",
getAria2Version: function() { function(_, rpc, alerts) {
return miscellaneous.version; var miscellaneous = { version: "", enabledFeatures: [] };
}, rpc.once("getVersion", [], function(data) {
addUris: function(uris, settings, cb) { miscellaneous = data[0];
_.each(uris, function(uri) {
var uri_parsed = [];
// parse options passed in the URIs. E.g. http://ex1.com/f1.jpg --out=image.jpg --check-integrity
var uriSettings = _.cloneDeep(settings);
_.each(uri, function(uri_element) {
if (uri_element.startsWith('--')) {
uri_options = uri_element.split(/--|=(.*)/);
if (uri_options.length > 2) {
uriSettings[uri_options[2]] = uri_options[3] || 'true';
}
}
else {
uri_parsed.push(uri_element);
}
});
// passing true to batch all the addUri calls
rpc.once('addUri', [uri_parsed, uriSettings], cb, true);
}); });
return {
isFeatureEnabled: function(feature) {
return miscellaneous.enabledFeatures.indexOf(feature) != -1;
},
getAria2Version: function() {
return miscellaneous.version;
},
addUris: function(uris, settings, cb) {
_.each(uris, function(uri) {
var uri_parsed = [];
// parse options passed in the URIs. E.g. http://ex1.com/f1.jpg --out=image.jpg --check-integrity
var uriSettings = _.cloneDeep(settings);
_.each(uri, function(uri_element) {
if (uri_element.startsWith("--")) {
uri_options = uri_element.split(/--|=(.*)/);
if (uri_options.length > 2) {
uriSettings[uri_options[2]] = uri_options[3] || "true";
}
} else {
uri_parsed.push(uri_element);
}
});
// passing true to batch all the addUri calls
rpc.once("addUri", [uri_parsed, uriSettings], cb, true);
});
// now dispatch all addUri syscalls // now dispatch all addUri syscalls
rpc.forceUpdate(); rpc.forceUpdate();
}, },
addTorrents: function(txts, settings, cb) { addTorrents: function(txts, settings, cb) {
_.each(txts, function(txt) { _.each(txts, function(txt) {
// passing true to batch all the addUri calls // passing true to batch all the addUri calls
rpc.once('addTorrent', [txt, [], settings], cb, true); rpc.once("addTorrent", [txt, [], settings], cb, true);
}); });
// now dispatch all addUri syscalls // now dispatch all addUri syscalls
rpc.forceUpdate(); rpc.forceUpdate();
}, },
addMetalinks: function(txts, settings, cb) { addMetalinks: function(txts, settings, cb) {
_.each(txts, function(txt) { _.each(txts, function(txt) {
// passing true to batch all the addUri calls // passing true to batch all the addUri calls
rpc.once('addMetalink', [txt, settings], cb, true); rpc.once("addMetalink", [txt, settings], cb, true);
}); });
// now dispatch all addUri syscalls // now dispatch all addUri syscalls
rpc.forceUpdate(); rpc.forceUpdate();
}
};
} }
}; ]);
}]);

View File

@ -1,76 +1,85 @@
angular angular
.module('webui.services.rpc.jsoncall', [ .module("webui.services.rpc.jsoncall", ["webui.services.deps", "webui.services.base64"])
'webui.services.deps', 'webui.services.base64']) .factory("$jsoncall", [
.factory('$jsoncall', ['$', '$json', '$base64', function($, JSON, base64) { "$",
return { "$json",
init: function(conf) { "$base64",
this.avgTimeout = 2000; function($, JSON, base64) {
this.serverConf = conf; return {
}, init: function(conf) {
ariaRequest: function(url, funcName, params, success, error) { this.avgTimeout = 2000;
var startTime = new Date(); this.serverConf = conf;
var conn = this;
$.post({
url: url,
timeout: this.avgTimeout,
contentType: 'application/json',
data: JSON.stringify({
jsonrpc: 2.0,
id: 'webui',
method: funcName,
params: params
}),
success: function(data) {
conn.avgTimeout = 2000 + 3 * (new Date() - startTime);
return success(data);
}, },
error: error ariaRequest: function(url, funcName, params, success, error) {
}); var startTime = new Date();
}, var conn = this;
invoke: function(opts) { $.post({
var rpc = this; url: url,
var scheme = rpc.serverConf.encrypt ? 'https' : 'http'; timeout: this.avgTimeout,
rpc.ariaRequest( contentType: "application/json",
scheme + '://' + rpc.serverConf.host + ':' + rpc.serverConf.port + (rpc.serverConf.path || '/jsonrpc'), data: JSON.stringify({
opts.name, jsonrpc: 2.0,
opts.params, id: "webui",
opts.success, method: funcName,
function() { params: params
// check if authentication details are given, if yes then use a hack to support }),
// http authentication otherwise emit error success: function(data) {
if (!rpc.serverConf.auth || !rpc.serverConf.auth.user) { conn.avgTimeout = 2000 + 3 * (new Date() - startTime);
console.log("jsonrpc disconnect!!!"); return success(data);
return opts.error(); },
} error: error
});
var authUrl = scheme + '://' + },
rpc.serverConf.auth.user + ":" + invoke: function(opts) {
rpc.serverConf.auth.pass + "@" + var rpc = this;
rpc.serverConf.host + ':' + var scheme = rpc.serverConf.encrypt ? "https" : "http";
rpc.serverConf.port + (rpc.serverConf.path || '/jsonrpc'); rpc.ariaRequest(
scheme +
// hack is to basically inject an image with same uri as the aria2 rpc url, "://" +
// most browsers will then cache the authentication details and we dont have rpc.serverConf.host +
// to give them next time we make a request ":" +
var img = $('<img/>').attr("src", authUrl); rpc.serverConf.port +
$('body').append(img); (rpc.serverConf.path || "/jsonrpc"),
img.remove(); opts.name,
opts.params,
// timeout to let the image load and then make a request, opts.success,
setTimeout(function() { function() {
rpc.ariaRequest( // check if authentication details are given, if yes then use a hack to support
authUrl, // http authentication otherwise emit error
opts.name, if (!rpc.serverConf.auth || !rpc.serverConf.auth.user) {
opts.params,
opts.success,
function() {
console.log("jsonrpc disconnect!!!"); console.log("jsonrpc disconnect!!!");
return opts.error(); return opts.error();
} }
);
}, rpc.avgTimeout); var authUrl =
scheme +
"://" +
rpc.serverConf.auth.user +
":" +
rpc.serverConf.auth.pass +
"@" +
rpc.serverConf.host +
":" +
rpc.serverConf.port +
(rpc.serverConf.path || "/jsonrpc");
// hack is to basically inject an image with same uri as the aria2 rpc url,
// most browsers will then cache the authentication details and we dont have
// to give them next time we make a request
var img = $("<img/>").attr("src", authUrl);
$("body").append(img);
img.remove();
// timeout to let the image load and then make a request,
setTimeout(function() {
rpc.ariaRequest(authUrl, opts.name, opts.params, opts.success, function() {
console.log("jsonrpc disconnect!!!");
return opts.error();
});
}, rpc.avgTimeout);
}
);
} }
); };
} }
}; ]);
}]);

View File

@ -1,272 +1,306 @@
angular angular
.module('webui.services.rpc', [ .module("webui.services.rpc", [
'webui.services.rpc.syscall', 'webui.services.configuration', 'webui.services.alerts', "webui.services.rpc.syscall",
'webui.services.utils' "webui.services.configuration",
]) "webui.services.alerts",
.factory('$rpc', [ "webui.services.utils"
'$syscall', '$globalTimeout', '$alerts', '$utils', ])
'$rootScope', '$location', '$authconf', '$filter', .factory("$rpc", [
function(syscall, globalTimeout, alerts, utils, rootScope, uri, authconf, filter) { "$syscall",
"$globalTimeout",
"$alerts",
"$utils",
"$rootScope",
"$location",
"$authconf",
"$filter",
function(syscall, globalTimeout, alerts, utils, rootScope, uri, authconf, filter) {
var subscriptions = [],
configurations = [authconf],
currentConf = {},
currentToken,
timeout = null,
forceNextUpdate = false;
var subscriptions = [] var cookieConf = utils.getCookie("aria2conf");
, configurations = [authconf] // try at the start, so that it is presistant even when default authconf works
, currentConf = {} if (cookieConf) configurations.unshift(cookieConf);
, currentToken
, timeout = null
, forceNextUpdate = false;
var cookieConf = utils.getCookie('aria2conf'); if (uri.search().host) {
// try at the start, so that it is presistant even when default authconf works configurations.unshift(uri.search());
if(cookieConf) configurations.unshift(cookieConf); configurations[0].auth = {
token: configurations[0].token,
if (uri.search().host) { user: configurations[0].username,
configurations.unshift(uri.search()); pass: configurations[0].password
configurations[0].auth = { };
token: configurations[0].token,
user: configurations[0].username,
pass: configurations[0].password
};
}
if (['http', 'https'].indexOf(uri.protocol()) != -1 && uri.host() != 'localhost') {
configurations.push({
host: uri.host(),
path: '/jsonrpc',
port: 6800,
encrypt: false
},
{
host: uri.host(),
port: uri.port(),
path: '/jsonrpc',
encrypt: ( uri.protocol() == 'https' )
},
{
host: uri.host(),
port: uri.port(),
path: authconf.path,
encrypt: ( uri.protocol() == 'https' )
});
}
// set if we got error on connection. This will cause another connection attempt.
var needNewConnection = true;
// update is implemented such that
// only one syscall at max is ongoing
// (i.e. serially) so should be private
// to maintain that invariant
var update = function() {
clearTimeout(timeout);
timeout = null;
subscriptions = _.filter(subscriptions, function(e) {
return !!e && e.once !== 2;
});
var subs = subscriptions.slice();
if (!subs.length) {
timeout = setTimeout(update, globalTimeout);
return;
}
if (syscall.state == 'initializing') {
console.log("Syscall is initializing, waiting");
timeout = setTimeout(update, globalTimeout);
return;
}
if (needNewConnection && configurations.length) {
needNewConnection = false;
currentConf = configurations[0];
if (currentConf && currentConf.auth && currentConf.auth.token) {
currentToken = currentConf.auth.token;
} }
else {
currentToken = null;
}
syscall.init(currentConf);
timeout = setTimeout(update, globalTimeout);
return;
}
var params = _.map(subs, function(s) { if (["http", "https"].indexOf(uri.protocol()) != -1 && uri.host() != "localhost") {
var p = s.params; configurations.push(
if (currentToken) { {
p = ["token:" + currentToken].concat(p || []); host: uri.host(),
path: "/jsonrpc",
port: 6800,
encrypt: false
},
{
host: uri.host(),
port: uri.port(),
path: "/jsonrpc",
encrypt: uri.protocol() == "https"
},
{
host: uri.host(),
port: uri.port(),
path: authconf.path,
encrypt: uri.protocol() == "https"
}
);
} }
return {
methodName: s.name,
params: p && p.length ? p : undefined
};
});
var error = function() { // set if we got error on connection. This will cause another connection attempt.
needNewConnection = true; var needNewConnection = true;
var ind = configurations.indexOf(currentConf);
if (ind != -1) configurations.splice(ind, 1);
// If some proposed configurations are still in the pipeline then retry // update is implemented such that
if (configurations.length) { // only one syscall at max is ongoing
alerts.log(filter('translate')("The last connection attempt was unsuccessful. Trying another configuration")); // (i.e. serially) so should be private
timeout = setTimeout(update, 0); // to maintain that invariant
} var update = function() {
else { clearTimeout(timeout);
alerts.addAlert('<strong>' + filter('translate')('Oh Snap!') + '</strong> ' + timeout = null;
filter('translate')('Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings')
, 'error');
timeout = setTimeout(update, globalTimeout);
}
};
syscall.invoke({ subscriptions = _.filter(subscriptions, function(e) {
name: 'system.multicall', return !!e && e.once !== 2;
params: [params],
success: function(data) {
var failed = _.some(data.result, function(d) {
return d.code && d.message === "Unauthorized";
}); });
var subs = subscriptions.slice();
if (failed) { if (!subs.length) {
needNewConnection = true;
alerts.addAlert('<strong>' + filter('translate')('Oh Snap!') + '</strong> ' +
filter('translate')('Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings', 'error'));
timeout = setTimeout(update, globalTimeout); timeout = setTimeout(update, globalTimeout);
return; return;
} }
if (configurations.length) { if (syscall.state == "initializing") {
// configuration worked, save it in cookie for next time and console.log("Syscall is initializing, waiting");
// delete the pipelined configurations!!
if (currentToken)
alerts.addAlert(filter('translate')('Successfully connected to Aria2 through its remote RPC …'), 'success');
else
alerts.addAlert(filter('translate')('Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)'));
configurations = [];
}
utils.setCookie('aria2conf', currentConf);
var cbs = [];
_.each(data.result, function(d, i) {
var handle = subs[i];
if (handle) {
if (d.code) {
console.error(handle, d);
alerts.addAlert(d.message, 'error');
}
// run them later as the cb itself can mutate the subscriptions
cbs.push({cb: handle.cb, data: d});
if (handle.once) {
handle.once = 2;
}
}
});
_.each(cbs, function(hnd) {
hnd.cb(hnd.data);
});
rootScope.$digest();
if (forceNextUpdate) {
forceNextUpdate = false;
timeout = setTimeout(update, 0);
}
else {
timeout = setTimeout(update, globalTimeout); timeout = setTimeout(update, globalTimeout);
return;
} }
},
error: error
});
};
// initiate the update loop if (needNewConnection && configurations.length) {
timeout = setTimeout(update, globalTimeout); needNewConnection = false;
currentConf = configurations[0];
if (currentConf && currentConf.auth && currentConf.auth.token) {
currentToken = currentConf.auth.token;
} else {
currentToken = null;
}
syscall.init(currentConf);
timeout = setTimeout(update, globalTimeout);
return;
}
return { var params = _.map(subs, function(s) {
// conf can be configuration or array of configurations, var p = s.params;
// each one will be tried one after the other till success, if (currentToken) {
// for all options for one conf read rpc/syscall.js p = ["token:" + currentToken].concat(p || []);
configure: function(conf) { }
alerts.addAlert(filter('translate')('Trying to connect to aria2 using the new connection configuration'), 'info'); return {
methodName: s.name,
params: p && p.length ? p : undefined
};
});
if (conf instanceof Array) var error = function() {
configurations = conf; needNewConnection = true;
else var ind = configurations.indexOf(currentConf);
configurations = [conf]; if (ind != -1) configurations.splice(ind, 1);
if (timeout) { // If some proposed configurations are still in the pipeline then retry
clearTimeout(timeout); if (configurations.length) {
timeout = setTimeout(update, 0); alerts.log(
} filter("translate")(
}, "The last connection attempt was unsuccessful. Trying another configuration"
)
);
timeout = setTimeout(update, 0);
} else {
alerts.addAlert(
"<strong>" +
filter("translate")("Oh Snap!") +
"</strong> " +
filter("translate")(
"Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings"
),
"error"
);
timeout = setTimeout(update, globalTimeout);
}
};
// get current configuration being used syscall.invoke({
getConfiguration: function() { return currentConf }, name: "system.multicall",
params: [params],
success: function(data) {
var failed = _.some(data.result, function(d) {
return d.code && d.message === "Unauthorized";
});
// get currently configured directURL if (failed) {
getDirectURL : function() { return currentConf.directURL }, needNewConnection = true;
alerts.addAlert(
"<strong>" +
filter("translate")("Oh Snap!") +
"</strong> " +
filter("translate")(
"Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings",
"error"
)
);
timeout = setTimeout(update, globalTimeout);
return;
}
// syscall is done only once, delay is optional if (configurations.length) {
// and pass true to only dispatch it in the global timeout // configuration worked, save it in cookie for next time and
// which can be used to batch up once calls // delete the pipelined configurations!!
once: function(name, params, cb, delay) { if (currentToken)
cb = cb || angular.noop; alerts.addAlert(
params = params || []; filter("translate")("Successfully connected to Aria2 through its remote RPC …"),
"success"
);
else
alerts.addAlert(
filter("translate")(
"Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)"
)
);
configurations = [];
}
subscriptions.push({ utils.setCookie("aria2conf", currentConf);
once: true,
name: 'aria2.' + name,
params: params,
cb: cb
});
if (!delay) { var cbs = [];
this.forceUpdate(); _.each(data.result, function(d, i) {
} var handle = subs[i];
}, if (handle) {
if (d.code) {
console.error(handle, d);
alerts.addAlert(d.message, "error");
}
// run them later as the cb itself can mutate the subscriptions
cbs.push({ cb: handle.cb, data: d });
if (handle.once) {
handle.once = 2;
}
}
});
// callback is called each time with updated syscall data _.each(cbs, function(hnd) {
// after the global timeout, delay is optional and pass it hnd.cb(hnd.data);
// true to dispatch the first syscall also on global timeout });
// which can be used to batch the subscribe calls
subscribe: function(name, params, cb, delay) {
cb = cb || angular.noop;
params = params || [];
var handle = { rootScope.$digest();
once: false,
name: 'aria2.' + name, if (forceNextUpdate) {
params: params, forceNextUpdate = false;
cb: cb timeout = setTimeout(update, 0);
} else {
timeout = setTimeout(update, globalTimeout);
}
},
error: error
});
}; };
subscriptions.push(handle);
if (!delay) this.forceUpdate(); // initiate the update loop
return handle; timeout = setTimeout(update, globalTimeout);
},
// remove the subscribed callback by passing return {
// the returned handle bysubscribe // conf can be configuration or array of configurations,
unsubscribe: function(handle) { // each one will be tried one after the other till success,
var ind = subscriptions.indexOf(handle); // for all options for one conf read rpc/syscall.js
subscriptions[ind] = null; configure: function(conf) {
}, alerts.addAlert(
filter("translate")(
"Trying to connect to aria2 using the new connection configuration"
),
"info"
);
// force the global syscall update if (conf instanceof Array) configurations = conf;
forceUpdate: function() { else configurations = [conf];
if (timeout) {
clearTimeout(timeout); if (timeout) {
timeout = setTimeout(update, 0); clearTimeout(timeout);
} timeout = setTimeout(update, 0);
else { }
// a batch call is already in progress, },
// wait till it returns and force the next one
forceNextUpdate = true; // get current configuration being used
} getConfiguration: function() {
return currentConf;
},
// get currently configured directURL
getDirectURL: function() {
return currentConf.directURL;
},
// syscall is done only once, delay is optional
// and pass true to only dispatch it in the global timeout
// which can be used to batch up once calls
once: function(name, params, cb, delay) {
cb = cb || angular.noop;
params = params || [];
subscriptions.push({
once: true,
name: "aria2." + name,
params: params,
cb: cb
});
if (!delay) {
this.forceUpdate();
}
},
// callback is called each time with updated syscall data
// after the global timeout, delay is optional and pass it
// true to dispatch the first syscall also on global timeout
// which can be used to batch the subscribe calls
subscribe: function(name, params, cb, delay) {
cb = cb || angular.noop;
params = params || [];
var handle = {
once: false,
name: "aria2." + name,
params: params,
cb: cb
};
subscriptions.push(handle);
if (!delay) this.forceUpdate();
return handle;
},
// remove the subscribed callback by passing
// the returned handle bysubscribe
unsubscribe: function(handle) {
var ind = subscriptions.indexOf(handle);
subscriptions[ind] = null;
},
// force the global syscall update
forceUpdate: function() {
if (timeout) {
clearTimeout(timeout);
timeout = setTimeout(update, 0);
} else {
// a batch call is already in progress,
// wait till it returns and force the next one
forceNextUpdate = true;
}
}
};
} }
}; ]);
}]);

View File

@ -1,143 +1,157 @@
angular angular
.module('webui.services.rpc.sockcall', [ .module("webui.services.rpc.sockcall", [
'webui.services.deps', 'webui.services.utils', 'webui.services.base64', "webui.services.deps",
'webui.services.alerts' "webui.services.utils",
]) "webui.services.base64",
.factory('$sockcall', ['$_', '$json', '$name', '$utils', '$alerts', "webui.services.alerts"
function(_, JSON, name, utils, alerts) { ])
var sockRPC = { .factory("$sockcall", [
// true when sockrpc is ready to be used, "$_",
// false when either initializing "$json",
// or no support for web sockets "$name",
initialized: false, "$utils",
"$alerts",
function(_, JSON, name, utils, alerts) {
var sockRPC = {
// true when sockrpc is ready to be used,
// false when either initializing
// or no support for web sockets
initialized: false,
// ongoing connection handles containing connection id and callbacks // ongoing connection handles containing connection id and callbacks
handles: [], handles: [],
// websocket connection socket used for all connections // websocket connection socket used for all connections
sock: null, sock: null,
// connection configuration // connection configuration
conf: null, conf: null,
// socket connection scheme, default to unencrypted connection // socket connection scheme, default to unencrypted connection
scheme: 'ws', scheme: "ws",
// called when a connection error occurs // called when a connection error occurs
onerror: function(ev) { onerror: function(ev) {
_.each(sockRPC.handles, function(h) { h.error() }); _.each(sockRPC.handles, function(h) {
sockRPC.handles = []; h.error();
sockRPC.initialized = false; });
if (sockRPC.onready) { sockRPC.handles = [];
sockRPC.onready(); sockRPC.initialized = false;
sockRPC.onready = null; if (sockRPC.onready) {
} sockRPC.onready();
}, sockRPC.onready = null;
onclose: function(ev) { }
if (sockRPC.handles && sockRPC.handles.length) },
sockRPC.onerror('Connection reset while calling aria2'); onclose: function(ev) {
sockRPC.initialized = false; if (sockRPC.handles && sockRPC.handles.length)
if (sockRPC.onready) { sockRPC.onerror("Connection reset while calling aria2");
sockRPC.onready(); sockRPC.initialized = false;
sockRPC.onready = null; if (sockRPC.onready) {
} sockRPC.onready();
}, sockRPC.onready = null;
}
},
// when connection opens // when connection opens
onopen: function() { onopen: function() {
console.log('websocket initialized!!!'); console.log("websocket initialized!!!");
sockRPC.initialized = true; sockRPC.initialized = true;
if (sockRPC.onready) { if (sockRPC.onready) {
sockRPC.onready(); sockRPC.onready();
sockRPC.onready = null; sockRPC.onready = null;
} }
}, },
// when message is recieved
onmessage: function(message) {
var data = JSON.parse(message.data);
// when message is recieved // reverse loop because we are deleting elements
onmessage: function(message) { // while looping over the old items
var data = JSON.parse(message.data); for (var i = sockRPC.handles.length - 1; i >= 0; i--) {
if (sockRPC.handles[i].id === data.id) {
sockRPC.handles[i].success(data);
sockRPC.handles.splice(i, 1);
return;
}
}
},
// reverse loop because we are deleting elements // call to use the rpc
// while looping over the old items invoke: function(opts) {
for (var i = sockRPC.handles.length - 1; i >= 0; i--) { var data = {
if (sockRPC.handles[i].id === data.id) { jsonrpc: 2.0,
sockRPC.handles[i].success(data); id: utils.uuid(),
sockRPC.handles.splice(i, 1); method: opts.name,
return; params: opts.params && opts.params.length ? opts.params : undefined
};
if (data.params && !data.params.length) data.params = undefined;
sockRPC.handles.push({
success: opts.success || angular.noop,
error: opts.error || angular.noop,
id: data.id
});
sockRPC.sock.send(JSON.stringify(data));
},
// should be called initially to start using the sock rpc
// onready is called when initial connection is resolved
init: function(conf, onready) {
sockRPC.initialized = false;
if (sockRPC.onready) {
// make previous call is resolved
sockRPC.onready();
sockRPC.onready = null;
}
if (typeof WebSocket == "undefined") {
alerts.addAlert("Web sockets are not supported! Falling back to JSONP.", "info");
onready();
return;
}
sockRPC.conf = conf || sockRPC.conf;
sockRPC.scheme = sockRPC.conf.encrypt ? "wss" : "ws";
if (sockRPC.sock) {
sockRPC.sock.onopen = sockRPC.sock.onmessage = sockRPC.sock.onerror = sockRPC.sock.onclose = null;
sockRPC.onerror({ message: "Changing the websocket aria2 server details" });
}
try {
var authUrl =
sockRPC.scheme + "://" + conf.host + ":" + conf.port + (conf.path || "/jsonrpc");
if (sockRPC.conf.auth && sockRPC.conf.auth.user && sockRPC.conf.auth.pass) {
authUrl =
sockRPC.scheme +
"://" +
sockRPC.conf.auth.user +
":" +
sockRPC.conf.auth.pass +
"@" +
sockRPC.conf.host +
":" +
sockRPC.conf.port +
(conf.path || "/jsonrpc");
}
sockRPC.sock = new WebSocket(authUrl);
sockRPC.sock.onopen = sockRPC.onopen;
sockRPC.sock.onclose = sockRPC.onclose;
sockRPC.sock.onerror = sockRPC.onerror;
sockRPC.sock.onmessage = sockRPC.onmessage;
sockRPC.onready = onready;
} catch (ex) {
// ignoring IE security exception on local ip addresses
console.log("not using websocket for aria2 rpc due to: ", ex);
alerts.addAlert("Web sockets not working due to " + ex.message, "info");
onready();
}
} }
}
},
// call to use the rpc
invoke: function(opts) {
var data = {
jsonrpc: 2.0,
id: utils.uuid(),
method: opts.name,
params: opts.params && opts.params.length ? opts.params : undefined
}; };
if (data.params && !data.params.length) data.params = undefined; return sockRPC;
}
sockRPC.handles.push({ ]);
success: opts.success || angular.noop,
error: opts.error || angular.noop,
id: data.id
});
sockRPC.sock.send( JSON.stringify(data) );
},
// should be called initially to start using the sock rpc
// onready is called when initial connection is resolved
init: function(conf, onready) {
sockRPC.initialized = false;
if (sockRPC.onready) {
// make previous call is resolved
sockRPC.onready();
sockRPC.onready = null;
}
if (typeof WebSocket == "undefined") {
alerts.addAlert('Web sockets are not supported! Falling back to JSONP.', 'info');
onready();
return;
}
sockRPC.conf = conf || sockRPC.conf;
sockRPC.scheme = sockRPC.conf.encrypt ? 'wss' : 'ws';
if (sockRPC.sock) {
sockRPC.sock.onopen = sockRPC.sock.onmessage = sockRPC.sock.onerror = sockRPC.sock.onclose = null;
sockRPC.onerror({message: 'Changing the websocket aria2 server details'});
}
try {
var authUrl = sockRPC.scheme + '://' + conf.host + ':' + conf.port + (conf.path || '/jsonrpc');
if (sockRPC.conf.auth && sockRPC.conf.auth.user && sockRPC.conf.auth.pass) {
authUrl = sockRPC.scheme + '://' +
sockRPC.conf.auth.user + ":" +
sockRPC.conf.auth.pass + "@" +
sockRPC.conf.host + ':' +
sockRPC.conf.port + (conf.path || '/jsonrpc');
}
sockRPC.sock = new WebSocket(authUrl);
sockRPC.sock.onopen = sockRPC.onopen;
sockRPC.sock.onclose = sockRPC.onclose;
sockRPC.sock.onerror = sockRPC.onerror;
sockRPC.sock.onmessage = sockRPC.onmessage;
sockRPC.onready = onready;
}
catch (ex) {
// ignoring IE security exception on local ip addresses
console.log('not using websocket for aria2 rpc due to: ', ex);
alerts.addAlert('Web sockets not working due to ' + ex.message, 'info');
onready();
}
},
};
return sockRPC;
}]);

View File

@ -1,51 +1,57 @@
angular angular
.module('webui.services.rpc.syscall', [ .module("webui.services.rpc.syscall", [
'webui.services.rpc.jsoncall', 'webui.services.rpc.sockcall', "webui.services.rpc.jsoncall",
'webui.services.utils', 'webui.services.alerts' "webui.services.rpc.sockcall",
]) "webui.services.utils",
.factory('$syscall', ['$log', '$jsoncall', '$sockcall', '$alerts', "webui.services.alerts"
function(log, jsonRPC, sockRPC, alerts) { ])
return { .factory("$syscall", [
state: 'none', "$log",
// called to initialize the rpc interface, call everytime configuration changes "$jsoncall",
// conf has the following structure: "$sockcall",
// { "$alerts",
// host (string): host for the aria2 server function(log, jsonRPC, sockRPC, alerts) {
// port (number): port number for the aria2 server return {
// encrypt (boolean, optional): true if encryption is enabled in the aria2 server state: "none",
// auth (optional): { // called to initialize the rpc interface, call everytime configuration changes
// token (string): secret token for authentication (--rpc-secret) // conf has the following structure:
// user (string): username for http authentication if enabled // {
// pass (string): password for the http authentication if enabled // host (string): host for the aria2 server
// } // port (number): port number for the aria2 server
init: function(conf) { // encrypt (boolean, optional): true if encryption is enabled in the aria2 server
console.log("Syscall is initializing to", conf); // auth (optional): {
this.state = 'initializing'; // token (string): secret token for authentication (--rpc-secret)
jsonRPC.init(conf); // user (string): username for http authentication if enabled
var syscall = this; // pass (string): password for the http authentication if enabled
sockRPC.init(conf, function() { // }
console.log("Syscall is ready"); init: function(conf) {
syscall.state = 'ready'; console.log("Syscall is initializing to", conf);
}); this.state = "initializing";
}, jsonRPC.init(conf);
var syscall = this;
sockRPC.init(conf, function() {
console.log("Syscall is ready");
syscall.state = "ready";
});
},
// call this to start an rpc call, opts has the following structure: // call this to start an rpc call, opts has the following structure:
// { // {
// name (string): name of the actual aria2 syscall // name (string): name of the actual aria2 syscall
// success (function): callback called with (parsed) data if rpc is successfull // success (function): callback called with (parsed) data if rpc is successfull
// error (function): callback called when an error occurs // error (function): callback called when an error occurs
// params (array, optional): the params for some syscall (like multicall) and is optional for others // params (array, optional): the params for some syscall (like multicall) and is optional for others
// } // }
invoke: function(opts) { invoke: function(opts) {
opts.success = opts.success || angular.noop; opts.success = opts.success || angular.noop;
opts.error = opts.error || angular.noop; opts.error = opts.error || angular.noop;
if (sockRPC.initialized) { if (sockRPC.initialized) {
return sockRPC.invoke(opts); return sockRPC.invoke(opts);
} } else {
else { return jsonRPC.invoke(opts);
return jsonRPC.invoke(opts); }
} }
};
} }
}; ]);
}]);

View File

@ -1,14 +1,17 @@
angular.module('webui.services.settings.filters', []) angular
.value('$globalsettingsexclude', [ .module("webui.services.settings.filters", [])
"checksum", "index-out", "out", "pause", "select-file" .value("$globalsettingsexclude", ["checksum", "index-out", "out", "pause", "select-file"])
]) .value("$waitingsettingsexclude", [
.value('$waitingsettingsexclude', [ "dry-run",
"dry-run", "metalink-base-uri", "parameterized-uri", "pause", "metalink-base-uri",
"piece-length" "parameterized-uri",
]) "pause",
.value('$activesettingsfilter', [ "piece-length"
"bt-max-peers", "bt-request-peer-speed-limit", "bt-remove-unselected-file", ])
"max-download-limit", "max-upload-limit", .value("$activesettingsfilter", [
]); "bt-max-peers",
"bt-request-peer-speed-limit",
"bt-remove-unselected-file",
"max-download-limit",
"max-upload-limit"
]);

File diff suppressed because it is too large Load Diff

View File

@ -1,168 +1,187 @@
angular.module('webui.services.utils', ['webui.services.configuration']) angular.module("webui.services.utils", ["webui.services.configuration"]).factory("$utils", [
.factory('$utils', ['$filter', '$name', '$titlePattern', function(filter, $name, $titlePattern) { "$filter",
var rnd16 = (function() { "$name",
"use strict"; "$titlePattern",
var rndBuffer = new Uint8Array(16); function(filter, $name, $titlePattern) {
var rnd16Weak = function() { var rnd16 = (function() {
for (var i = 0, r; i < 16; i++) { "use strict";
if (!(i % 0x3)) r = Math.random() * 0x100000000 | 0; var rndBuffer = new Uint8Array(16);
rndBuffer[i] = r >>> ((i & 0x3) << 0x3) & 0xff; var rnd16Weak = function() {
} for (var i = 0, r; i < 16; i++) {
return rndBuffer; if (!(i % 0x3)) r = (Math.random() * 0x100000000) | 0;
}; rndBuffer[i] = (r >>> ((i & 0x3) << 0x3)) & 0xff;
}
if (!window.crypto || !crypto.getRandomValues) {
return rnd16Weak;
}
return function() {
try {
crypto.getRandomValues(rndBuffer);
return rndBuffer; return rndBuffer;
}
catch (ex) {
// Entropy might be exhausted
return rnd16Weak();
}
};
})();
var utils = {
fmtsize: function(len) {
len = +len; // coerce to number
if (len <= 1024) {
return len.toFixed(0) + " B";
}
len /= 1024;
if (len <= 1024) {
return len.toFixed(1) + " KB"
}
len /= 1024;
if (len <= 1024) {
return len.toFixed(2) + " MB";
}
len /= 1024;
return len.toFixed(3) + " GB";
},
fmtspeed: function(speed) {
return utils.fmtsize(speed) + "/s";
},
// saves the key value pair in cookies
setCookie: function(key, value) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + 30 * 12);
var cvalue = escape(JSON.stringify(value)) + "; expires=" + exdate.toUTCString();
document.cookie = key + "=" + cvalue;
},
// gets a value for a key stored in cookies
getCookie: function(key) {
var chunks = document.cookie.split(";");
for (var i = 0; i < chunks.length; i++) {
var ckey = chunks[i].substr(0, chunks[i].indexOf("=")).replace(/^\s+|\s+$/g,"");
var cvalue = chunks[i].substr(chunks[i].indexOf("=") + 1);
if (key == ckey) {
return JSON.parse(unescape(cvalue));
}
}
return null;
},
getFileName: function(path) {
var seed = path.split(/[/\\]/);
return seed[seed.length - 1];
},
uuid: (function() {
var bt = [];
for (var i = 0; i < 0x100; ++i) {
bt.push((i + 0x100).toString(16).substr(1));
}
Object.freeze(bt);
return function() {
var r = rnd16();
r[6] = (r[6] & 0xf) | 0x40; // Version 4
r[8] = (r[8] & 0x3f) | 0x80; // Version 4y
return bt[r[0]] + bt[r[1]] + bt[r[2]] + bt[r[3]] + "-" +
bt[r[4]] + bt[r[5]] + "-" +
bt[r[6]] + bt[r[7]] + "-" +
bt[r[8]] + bt[r[9]] + "-" +
bt[r[10]] + bt[r[11]] + bt[r[12]] + bt[r[13]] + bt[r[14]] + bt[r[15]];
}; };
})(),
randStr: function() {
return utils.uuid();
},
// maps the array in place to the destination if (!window.crypto || !crypto.getRandomValues) {
// arr, dest (optional): array return rnd16Weak;
// func: a merge mapping func, see ctrls/download.js
mergeMap: function(arr, dest, func) {
if (!dest) {
dest = [];
} }
return function() {
for (var i = 0, e = Math.min(arr.length, dest.length); i < e; ++i) { try {
func(arr[i], dest[i]); crypto.getRandomValues(rndBuffer);
} return rndBuffer;
} catch (ex) {
// Insert newly created downloads // Entropy might be exhausted
while (i < arr.length) { return rnd16Weak();
dest.push(func(arr[i++]));
}
// Truncate if necessary.
dest.length = arr.length;
return dest;
},
// get info title from global statistics
getTitle: function(stats) {
if(!stats) {
stats = {};
} }
return $titlePattern };
.replace('{active}', stats.numActive || '⌛') })();
.replace('{waiting}', stats.numWaiting || '⌛')
.replace('{download_speed}', utils.fmtspeed(stats.downloadSpeed) || '⌛')
.replace('{upload_speed}', utils.fmtspeed(stats.uploadSpeed) || '⌛')
.replace('{stopped}', stats.numStopped || '⌛')
.replace('{name}', $name);
},
// get download chunks from aria2 bitfield var utils = {
getChunksFromHex: function(bitfield, numOfPieces) { fmtsize: function(len) {
var chunks = [], len = 0, numPieces = parseInt(numOfPieces); len = +len; // coerce to number
if (!bitfield) return []; if (len <= 1024) {
return len.toFixed(0) + " B";
}
len /= 1024;
if (len <= 1024) {
return len.toFixed(1) + " KB";
}
len /= 1024;
if (len <= 1024) {
return len.toFixed(2) + " MB";
}
len /= 1024;
return len.toFixed(3) + " GB";
},
var totalDownloaded = 0; fmtspeed: function(speed) {
if (numPieces > 1) { return utils.fmtsize(speed) + "/s";
var chunk_ratio = 1 / numPieces; },
var piecesProcessed = 0; // saves the key value pair in cookies
for (var i = 0; i < bitfield.length; i++) { setCookie: function(key, value) {
var hex = parseInt(bitfield[i], 16); var exdate = new Date();
for (var j = 1; j <= 4; j++) { exdate.setDate(exdate.getDate() + 30 * 12);
var bit = hex & (1 << (4 - j)); var cvalue = escape(JSON.stringify(value)) + "; expires=" + exdate.toUTCString();
if (bit) totalDownloaded++; document.cookie = key + "=" + cvalue;
var prog = !!bit; },
if (len >= 1 && chunks[len - 1].show == prog) { // gets a value for a key stored in cookies
chunks[len - 1].ratio += chunk_ratio; getCookie: function(key) {
} var chunks = document.cookie.split(";");
else { for (var i = 0; i < chunks.length; i++) {
chunks.push({ var ckey = chunks[i].substr(0, chunks[i].indexOf("=")).replace(/^\s+|\s+$/g, "");
ratio: chunk_ratio, var cvalue = chunks[i].substr(chunks[i].indexOf("=") + 1);
show: prog if (key == ckey) {
}); return JSON.parse(unescape(cvalue));
len++;
}
piecesProcessed++;
if (piecesProcessed == numPieces)
return chunks;
} }
} }
return null;
},
getFileName: function(path) {
var seed = path.split(/[/\\]/);
return seed[seed.length - 1];
},
uuid: (function() {
var bt = [];
for (var i = 0; i < 0x100; ++i) {
bt.push((i + 0x100).toString(16).substr(1));
}
Object.freeze(bt);
return function() {
var r = rnd16();
r[6] = (r[6] & 0xf) | 0x40; // Version 4
r[8] = (r[8] & 0x3f) | 0x80; // Version 4y
return (
bt[r[0]] +
bt[r[1]] +
bt[r[2]] +
bt[r[3]] +
"-" +
bt[r[4]] +
bt[r[5]] +
"-" +
bt[r[6]] +
bt[r[7]] +
"-" +
bt[r[8]] +
bt[r[9]] +
"-" +
bt[r[10]] +
bt[r[11]] +
bt[r[12]] +
bt[r[13]] +
bt[r[14]] +
bt[r[15]]
);
};
})(),
randStr: function() {
return utils.uuid();
},
// maps the array in place to the destination
// arr, dest (optional): array
// func: a merge mapping func, see ctrls/download.js
mergeMap: function(arr, dest, func) {
if (!dest) {
dest = [];
}
for (var i = 0, e = Math.min(arr.length, dest.length); i < e; ++i) {
func(arr[i], dest[i]);
}
// Insert newly created downloads
while (i < arr.length) {
dest.push(func(arr[i++]));
}
// Truncate if necessary.
dest.length = arr.length;
return dest;
},
// get info title from global statistics
getTitle: function(stats) {
if (!stats) {
stats = {};
}
return $titlePattern
.replace("{active}", stats.numActive || "⌛")
.replace("{waiting}", stats.numWaiting || "⌛")
.replace("{download_speed}", utils.fmtspeed(stats.downloadSpeed) || "⌛")
.replace("{upload_speed}", utils.fmtspeed(stats.uploadSpeed) || "⌛")
.replace("{stopped}", stats.numStopped || "⌛")
.replace("{name}", $name);
},
// get download chunks from aria2 bitfield
getChunksFromHex: function(bitfield, numOfPieces) {
var chunks = [],
len = 0,
numPieces = parseInt(numOfPieces);
if (!bitfield) return [];
var totalDownloaded = 0;
if (numPieces > 1) {
var chunk_ratio = 1 / numPieces;
var piecesProcessed = 0;
for (var i = 0; i < bitfield.length; i++) {
var hex = parseInt(bitfield[i], 16);
for (var j = 1; j <= 4; j++) {
var bit = hex & (1 << (4 - j));
if (bit) totalDownloaded++;
var prog = !!bit;
if (len >= 1 && chunks[len - 1].show == prog) {
chunks[len - 1].ratio += chunk_ratio;
} else {
chunks.push({
ratio: chunk_ratio,
show: prog
});
len++;
}
piecesProcessed++;
if (piecesProcessed == numPieces) return chunks;
}
}
}
return chunks;
} }
return chunks; };
} return utils;
}; }
return utils; ]);
}]);

View File

@ -1,154 +1,163 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.cs_CZ = { translations.cs_CZ = {
// header // header
'Search': 'Hledat', Search: "Hledat",
// Nav menu // Nav menu
'Add': 'Přidat', Add: "Přidat",
'By URIs': 'Z URI', "By URIs": "Z URI",
'By Torrents': 'Z torrentu', "By Torrents": "Z torrentu",
'By Metalinks': 'Z metalinku', "By Metalinks": "Z metalinku",
'Manage': 'Spravovat', Manage: "Spravovat",
'Pause All': 'Zastavit vše', "Pause All": "Zastavit vše",
'Resume Paused': 'Obnovit zastavené', "Resume Paused": "Obnovit zastavené",
'Purge Completed': 'Odstranit hotové', "Purge Completed": "Odstranit hotové",
'Shutdown Server': 'Vypnout server', "Shutdown Server": "Vypnout server",
'Settings': 'Nastavení', Settings: "Nastavení",
'Connection Settings': 'Nastavení připojení', "Connection Settings": "Nastavení připojení",
'Global Settings': 'Obecné nastavení', "Global Settings": "Obecné nastavení",
'Server info': 'Informace o serveru', "Server info": "Informace o serveru",
'About and contribute': 'Informace', "About and contribute": "Informace",
'Toggle navigation': 'Přepnout ovládání', "Toggle navigation": "Přepnout ovládání",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Různé', Miscellaneous: "Různé",
'Global Statistics': 'Globální statistika', "Global Statistics": "Globální statistika",
'About': 'Informace', About: "Informace",
'Displaying': 'Zobrazuji', Displaying: "Zobrazuji",
'of': 'z', of: "z",
'downloads': 'stahování', downloads: "stahování",
'Language': 'Jazyk', Language: "Jazyk",
// download filters // download filters
'Download Filters': 'Filtry stahování', "Download Filters": "Filtry stahování",
'Running': 'Stahují se', Running: "Stahují se",
'Active': 'Aktivní', Active: "Aktivní",
'Waiting': 'Čekající', Waiting: "Čekající",
'Complete': 'Hotové', Complete: "Hotové",
'Error': 'Chyba', Error: "Chyba",
'Paused': 'Zastavené', Paused: "Zastavené",
'Removed': 'Odstraněné', Removed: "Odstraněné",
'Hide linked meta-data': 'Skrýt připojená meta-data', "Hide linked meta-data": "Skrýt připojená meta-data",
'Toggle': 'Prohodit', Toggle: "Prohodit",
'Reset filters': 'Smazat filtry', "Reset filters": "Smazat filtry",
// download status // download status
'Verifing': 'Ověřování', Verifing: "Ověřování",
'Verify Pending': 'Čekání na ověření', "Verify Pending": "Čekání na ověření",
// starred properties // starred properties
'Quick Access Settings': 'Rychlé nastavení', "Quick Access Settings": "Rychlé nastavení",
'Save': 'Uložit', Save: "Uložit",
'Save settings': 'Uložit nastavení', "Save settings": "Uložit nastavení",
'Currently no download in line to display, use the': 'Není co zobrazit, použijte', "Currently no download in line to display, use the": "Není co zobrazit, použijte",
'download button to start downloading files!': 'tlačítko pro stáhnutí souborů!', "download button to start downloading files!": "tlačítko pro stáhnutí souborů!",
'Peers': 'Zdroje', Peers: "Zdroje",
'More Info': 'Víc informací', "More Info": "Víc informací",
'Remove': 'Odstranit', Remove: "Odstranit",
'# of': '# z', "# of": "# z",
'Length': 'Délka', Length: "Délka",
// modals // modals
'Add Downloads By URIs': 'Přidat stahování z URI', "Add Downloads By URIs": "Přidat stahování z URI",
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- Můžete začít stahovat více souborů v jeden okamžik, tak že na každý řádek dáte jinou URI', "- Můžete začít stahovat více souborů v jeden okamžik, tak že na každý řádek dáte jinou URI",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- Také můžete přidat více URI (Zrcadel) pro *stejný* soubor, tak že je dáte na jeden řádek oddělené mezerou ', "- Také můžete přidat více URI (Zrcadel) pro *stejný* soubor, tak že je dáte na jeden řádek oddělené mezerou ",
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- URI může být HTTP(S)/FTP/BitTorrent-Magnet.', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- URI může být HTTP(S)/FTP/BitTorrent-Magnet.",
'Download settings': 'Nastavení stahování', "Download settings": "Nastavení stahování",
'Advanced settings': 'Pokročilé nastavení', "Advanced settings": "Pokročilé nastavení",
'Cancel': 'Zrušit', Cancel: "Zrušit",
'Start': 'Spustit', Start: "Spustit",
'Choose': 'Zvolit', Choose: "Zvolit",
'Quick Access (shown on the main page)': 'Rychlý přístup (Zobrazení na hlavní stránce)', "Quick Access (shown on the main page)": "Rychlý přístup (Zobrazení na hlavní stránce)",
// add torrent modal // add torrent modal
'Add Downloads By Torrents': 'Přidat stahování z torrentu', "Add Downloads By Torrents": "Přidat stahování z torrentu",
'- Select the torrent from the local filesystem to start the download.': '- Pro stahování vyberte torrent soubor z disku', "- Select the torrent from the local filesystem to start the download.":
'- You can select multiple torrents to start multiple downloads.': ' - Můžete zvolit víc torrentů pro spuštění více stahování', "- Pro stahování vyberte torrent soubor z disku",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- Pro stahování pomocí BitTorrent-Magnet URL, použijte možnost \"Z URI\"', "- You can select multiple torrents to start multiple downloads.":
'Select Torrents': 'Vyberte torrenty', " - Můžete zvolit víc torrentů pro spuštění více stahování",
'Select a Torrent': 'Vyberte torrent', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
// add metalink modal '- Pro stahování pomocí BitTorrent-Magnet URL, použijte možnost "Z URI"',
'Add Downloads By Metalinks': 'Přidat stahovní pomocí metalinku', "Select Torrents": "Vyberte torrenty",
'Select Metalinks': 'Výběr metalinků', "Select a Torrent": "Vyberte torrent",
'- Select the Metalink from the local filesystem to start the download.': '- Pro stahování vyberte metalink soubor z disku', // add metalink modal
'- You can select multiple Metalinks to start multiple downloads.': '- Můžete zvolit víc mentalinků pro spuštění více stahování', "Add Downloads By Metalinks": "Přidat stahovní pomocí metalinku",
'Select a Metalink': 'Vyberte metalink', "Select Metalinks": "Výběr metalinků",
// select file modal "- Select the Metalink from the local filesystem to start the download.":
'Choose files to start download for': 'Vyberte soubory pro stažení', "- Pro stahování vyberte metalink soubor z disku",
'Select to download': 'Vyberte ke stažení', "- You can select multiple Metalinks to start multiple downloads.":
// settings modal "- Můžete zvolit víc mentalinků pro spuštění více stahování",
'Aria2 RPC host and port': 'Aria2 RPC host a port', "Select a Metalink": "Vyberte metalink",
'Enter the host': 'Zadejte hosta', // select file modal
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Choose files to start download for": "Vyberte soubory pro stažení",
'Zadejte IP nebo DNS jméno serveru na kterém běží Aria2 RPC (výchozí: localhost)', "Select to download": "Vyberte ke stažení",
'Enter the port': 'Zadejte port', // settings modal
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Aria2 RPC host and port": "Aria2 RPC host a port",
'Zadejte port serveru na kterém běží Aria2 RPC (výchozí: 6800)', "Enter the host": "Zadejte hosta",
'Enter the RPC path': 'Zadejte cestu k RPC', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Zadejte cestu k endpointu Aria2 RPC (výchozí: /jsonrpc)', "Zadejte IP nebo DNS jméno serveru na kterém běží Aria2 RPC (výchozí: localhost)",
'SSL/TLS encryption': 'SSL/TLS šifrování', "Enter the port": "Zadejte port",
'Enable SSL/TLS encryption': 'Zapnout SSL/TLS šifrování', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the secret token (optional)': 'Zadejte bezpečnostní token (volitelné)', "Zadejte port serveru na kterém běží Aria2 RPC (výchozí: 6800)",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the RPC path": "Zadejte cestu k RPC",
'Zadejte bezpečnostní token k Aria2 RPC (nechte prázné pokud autentifikace není nastavena)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the username (optional)': 'Zadejte uživatelské jméno (volitelné)', "Zadejte cestu k endpointu Aria2 RPC (výchozí: /jsonrpc)",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "SSL/TLS encryption": "SSL/TLS šifrování",
'Zadejte uživatelské jméno pro Aria2 RPC (nechte prázné pokud autentifikace není nastavena)', "Enable SSL/TLS encryption": "Zapnout SSL/TLS šifrování",
'Enter the password (optional)': 'Zadejte heslo (volitelné)', "Enter the secret token (optional)": "Zadejte bezpečnostní token (volitelné)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Zadej heslo k Aria2 RPC (nechte prázné pokud autentifikace není nastavena)', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Enter base URL (optional)': 'Zadejte kořenovou URL serveru (volitelné)', "Zadejte bezpečnostní token k Aria2 RPC (nechte prázné pokud autentifikace není nastavena)",
'Direct Download': 'Přímé stažení', "Enter the username (optional)": "Zadejte uživatelské jméno (volitelné)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Jestliže je nastaveno, je možné stáhnout soubor přímo z Aria2 serveru.', "Zadejte uživatelské jméno pro Aria2 RPC (nechte prázné pokud autentifikace není nastavena)",
'(Requires appropriate webserver to be configured.)': '(Je třeba udělat patřičnou konfiguraci webserveru)', "Enter the password (optional)": "Zadejte heslo (volitelné)",
'Save Connection configuration': 'Uložit nastavení', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Filter': 'Filtr', "Zadej heslo k Aria2 RPC (nechte prázné pokud autentifikace není nastavena)",
// server info modal "Enter base URL (optional)": "Zadejte kořenovou URL serveru (volitelné)",
'Aria2 server info': 'Informace o Aria2 serveru', "Direct Download": "Přímé stažení",
'Aria2 Version': 'Verze Aria2', "If supplied, links will be created to enable direct download from the Aria2 server.":
'Features Enabled': 'Zapnuté funkce', "Jestliže je nastaveno, je možné stáhnout soubor přímo z Aria2 serveru.",
// about modal "(Requires appropriate webserver to be configured.)":
'To download the latest version of the project, add issues or to contribute back, head on to': "(Je třeba udělat patřičnou konfiguraci webserveru)",
'Ke stažení aktuální verze, nahlášení problému či přispění, zamiřte na', "Save Connection configuration": "Uložit nastavení",
'Or you can open the latest version in the browser through': 'Nebo můžete spustit aktuální verzi pomocí:', Filter: "Filtr",
'Close': 'Zavřít', // server info modal
// labels "Aria2 server info": "Informace o Aria2 serveru",
'Download status':'Stav stahování', "Aria2 Version": "Verze Aria2",
'Download Speed':'Rychlost stahování', "Features Enabled": "Zapnuté funkce",
'Upload Speed':'Rychlost nahrávání', // about modal
'Estimated time':'Odhadovaný čas', "To download the latest version of the project, add issues or to contribute back, head on to":
'Download Size':'Velikost', "Ke stažení aktuální verze, nahlášení problému či přispění, zamiřte na",
'Downloaded':'Staženo', "Or you can open the latest version in the browser through":
'Progress':'Průběh', "Nebo můžete spustit aktuální verzi pomocí:",
'Download Path':'Cesta', Close: "Zavřít",
'Uploaded':'Nahráno', // labels
'Download GID':'GID', "Download status": "Stav stahování",
'Number of Pieces':'Počet fragmentů', "Download Speed": "Rychlost stahování",
'Piece Length':'Délka fragmentu', "Upload Speed": "Rychlost nahrávání",
"Estimated time": "Odhadovaný čas",
"Download Size": "Velikost",
Downloaded: "Staženo",
Progress: "Průběh",
"Download Path": "Cesta",
Uploaded: "Nahráno",
"Download GID": "GID",
"Number of Pieces": "Počet fragmentů",
"Piece Length": "Délka fragmentu",
//alerts //alerts
'The last connection attempt was unsuccessful. Trying another configuration': "The last connection attempt was unsuccessful. Trying another configuration":
'Poslední pokus o připojení se nezdařil. Zkuste jiné nastavení', "Poslední pokus o připojení se nezdařil. Zkuste jiné nastavení",
'Oh Snap!': 'A sakra!', "Oh Snap!": "A sakra!",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Nemohu se připojit k Aria2 RPC serveru. Zkusím to znovu za 10 sekund. Možná by se to chtělo podívat do Nastavení > Nastavení připojení', "Nemohu se připojit k Aria2 RPC serveru. Zkusím to znovu za 10 sekund. Možná by se to chtělo podívat do Nastavení > Nastavení připojení",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'Během připojování k Aria2 RPC serveru selhala autentifikace. Zkusím to znovu za 10 sekund. Možná by se to chtělo podívat do Nastavení > Nastavení připojení', "Během připojování k Aria2 RPC serveru selhala autentifikace. Zkusím to znovu za 10 sekund. Možná by se to chtělo podívat do Nastavení > Nastavení připojení",
'Successfully connected to Aria2 through its remote RPC …': "Successfully connected to Aria2 through its remote RPC …":
'Úspěšně připojeno k Aria2 pomocí RPC...', "Úspěšně připojeno k Aria2 pomocí RPC...",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
'Úspěšně připojeno k Aria2 pomocí RPC, ale připojení není zabezpečené. Pro úplné zabezpečení přidejte bezpečnostní token při spuštění Aria2 (pomocí možnosti --rpc-secret) ', "Úspěšně připojeno k Aria2 pomocí RPC, ale připojení není zabezpečené. Pro úplné zabezpečení přidejte bezpečnostní token při spuštění Aria2 (pomocí možnosti --rpc-secret) ",
'Trying to connect to aria2 using the new connection configuration': "Trying to connect to aria2 using the new connection configuration":
'Zkouším se připojit k Aria2 za pomocí nového nastavení', "Zkouším se připojit k Aria2 za pomocí nového nastavení",
'Remove {{name}} and associated meta-data?': // {{name}} refers to the download name, do not modify. // {{name}} refers to the download name, do not modify.
'Odstranit {{name}} a příslušná meta-data?' "Remove {{name}} and associated meta-data?": "Odstranit {{name}} a příslušná meta-data?"
}; };

View File

@ -1,132 +1,144 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.de_DE = { translations.de_DE = {
// header // header
'Search': 'Suche', Search: "Suche",
// Nav menu // Nav menu
'Add': 'Hinzufügen', Add: "Hinzufügen",
'By URIs': 'mit URIs', "By URIs": "mit URIs",
'By Torrents': 'mit Torrents', "By Torrents": "mit Torrents",
'By Metalinks': 'mit Metalinks', "By Metalinks": "mit Metalinks",
'Manage': 'Verwalten', Manage: "Verwalten",
'Pause All': 'Alle anhalten', "Pause All": "Alle anhalten",
'Resume Paused': 'Angehaltene fortsetzen', "Resume Paused": "Angehaltene fortsetzen",
'Purge Completed': 'Fertige entfernen', "Purge Completed": "Fertige entfernen",
'Settings': 'Einstellungen', Settings: "Einstellungen",
'Connection Settings': 'Verbindungseinstellungen', "Connection Settings": "Verbindungseinstellungen",
'Global Settings': 'Globale Einstellungen', "Global Settings": "Globale Einstellungen",
'Server info': 'Server Information', "Server info": "Server Information",
'About and contribute': 'Über webui-aria2', "About and contribute": "Über webui-aria2",
'Toggle navigation': 'Navigation an/ausschalten', "Toggle navigation": "Navigation an/ausschalten",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Verschiedenes', Miscellaneous: "Verschiedenes",
'Global Statistics': 'Globale Statistiken', "Global Statistics": "Globale Statistiken",
'About': 'Über', About: "Über",
'Displaying': 'Anzeige', Displaying: "Anzeige",
'of': 'von', of: "von",
'downloads': 'Downloads', downloads: "Downloads",
'Language': 'Sprache', Language: "Sprache",
// download filters // download filters
'Download Filters': 'Download Filter', "Download Filters": "Download Filter",
'Running': 'Laufende', Running: "Laufende",
'Active': 'Aktive', Active: "Aktive",
'Waiting': 'Wartende', Waiting: "Wartende",
'Complete': 'Fertige', Complete: "Fertige",
'Error': 'Fehler', Error: "Fehler",
'Paused': 'Angehaltene', Paused: "Angehaltene",
'Removed': 'Gelöschte', Removed: "Gelöschte",
'Hide linked meta-data': 'Blende verlinkte Meta-Daten aus', "Hide linked meta-data": "Blende verlinkte Meta-Daten aus",
'Toggle': 'Umschalten', Toggle: "Umschalten",
'Reset filters': 'Filter zurücksetzen', "Reset filters": "Filter zurücksetzen",
// starred properties // starred properties
'Quick Access Settings': 'Ausgewählte Einstellungen', "Quick Access Settings": "Ausgewählte Einstellungen",
'Save settings': 'Einstellungen speichern', "Save settings": "Einstellungen speichern",
'Currently no download in line to display, use the': 'Aktuell sind keine Downloads vorhanden, bitte benutz den', "Currently no download in line to display, use the":
'download button to start downloading files!': 'Download Link um den Download von Dateien zu beginnen!', "Aktuell sind keine Downloads vorhanden, bitte benutz den",
'Peers': 'Peers', "download button to start downloading files!":
'More Info': 'Mehr Infos', "Download Link um den Download von Dateien zu beginnen!",
'Remove': 'Entfernen', Peers: "Peers",
'# of': '# von', "More Info": "Mehr Infos",
'Length': 'Länge', Remove: "Entfernen",
// modals "# of": "# von",
'Add Downloads By URIs': 'Downloads anhand von URIs hinzufügen', Length: "Länge",
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': // modals
'- Es können mehrere Downloads (Dateien) gleichzeitig hinzugefügt werden, indem jede URI in eine separate Zeile eingegeben wird.', "Add Downloads By URIs": "Downloads anhand von URIs hinzufügen",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- Es können auch mehrere URIs (Spiegelserver) für *dieselbe* Datei durch Leerzeichen getrennt angegeben werden.', "- Es können mehrere Downloads (Dateien) gleichzeitig hinzugefügt werden, indem jede URI in eine separate Zeile eingegeben wird.",
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- Eine URI kann folgende Protokolle besitzen: HTTP(S)/FTP/BitTorrent-Magnet.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'Download settings': 'Download Einstellungen', "- Es können auch mehrere URIs (Spiegelserver) für *dieselbe* Datei durch Leerzeichen getrennt angegeben werden.",
'Advanced settings': 'Erweiterte Einstellungen', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Cancel': 'Abbrechen', "- Eine URI kann folgende Protokolle besitzen: HTTP(S)/FTP/BitTorrent-Magnet.",
'Start': 'Beginnen', "Download settings": "Download Einstellungen",
'Choose': 'Auswählen', "Advanced settings": "Erweiterte Einstellungen",
'Quick Access (shown on the main page)': 'Schnellzugriff (Anzeige auf der Hauptseite)', Cancel: "Abbrechen",
// add torrent modal Start: "Beginnen",
'Add Downloads By Torrents': 'Downloads mit Torrents hinzufügen', Choose: "Auswählen",
'- Select the torrent from the local filesystem to start the download.': '- Wähle ein Torrent vom lokalen Dateisystem um den Download zu starten', "Quick Access (shown on the main page)": "Schnellzugriff (Anzeige auf der Hauptseite)",
'- You can select multiple torrents to start multiple downloads.': '- Es können mehrere Torrents ausgewählt werden um mehrere Downloads zu starten', // add torrent modal
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- Für BitTorrent-Magnet URLs benutz die Option \'Mit URIs hinzufügen\'', "Add Downloads By Torrents": "Downloads mit Torrents hinzufügen",
'Select Torrents': 'Wähle Torrents', "- Select the torrent from the local filesystem to start the download.":
'Select a Torrent': 'Wähle ein Torrent', "- Wähle ein Torrent vom lokalen Dateisystem um den Download zu starten",
// add metalink modal "- You can select multiple torrents to start multiple downloads.":
'Add Downloads By Metalinks': 'Download mit Metalinks hinzufügen', "- Es können mehrere Torrents ausgewählt werden um mehrere Downloads zu starten",
'Select Metalinks': 'Wähle Metalinks', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'- Select the Metalink from the local filesystem to start the download.': '- Wähle ein Metalink vom lokalen Dateisystem um den Download zu starten', "- Für BitTorrent-Magnet URLs benutz die Option 'Mit URIs hinzufügen'",
'- You can select multiple Metalinks to start multiple downloads.': '- Es können mehrere Metalinks ausgewählt werden um mehrere Downloads zu starten', "Select Torrents": "Wähle Torrents",
'Select a Metalink': 'Wähle einen Metalink', "Select a Torrent": "Wähle ein Torrent",
// select file modal // add metalink modal
'Choose files to start download for': 'Wähle Dateien für den Download aus', "Add Downloads By Metalinks": "Download mit Metalinks hinzufügen",
'Select to download': 'Wähle zum Download', "Select Metalinks": "Wähle Metalinks",
// settings modal "- Select the Metalink from the local filesystem to start the download.":
'Aria2 RPC host and port': 'Aria2 RPC host und port', "- Wähle ein Metalink vom lokalen Dateisystem um den Download zu starten",
'Enter the host': 'Host', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "- Es können mehrere Metalinks ausgewählt werden um mehrere Downloads zu starten",
'Gib die IP oder den DNS Namen des Servers ein, auf dem Aria2 läuft und mit dem du eine RPC-Verbindung etablieren willst (Standard: localhost)', "Select a Metalink": "Wähle einen Metalink",
'Enter the port': 'Port', // select file modal
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Choose files to start download for": "Wähle Dateien für den Download aus",
'Gib den Port des Servers ein, auf dem der RPC-Dienst von Aria2 läuft (Standard: 6800)', "Select to download": "Wähle zum Download",
'Enter the RPC path': 'RPC Pfad', // settings modal
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Gib den Pfad zum Aria2 RPC Endpunkt an (Standard: /jsonrpc)', "Aria2 RPC host and port": "Aria2 RPC host und port",
'SSL/TLS encryption': 'SSL/TLS', "Enter the host": "Host",
'Enable SSL/TLS encryption': 'Aktiviere SSL/TLS Verschlüsselung', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the secret token (optional)': 'Secret Token (optional)', "Gib die IP oder den DNS Namen des Servers ein, auf dem Aria2 läuft und mit dem du eine RPC-Verbindung etablieren willst (Standard: localhost)",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port": "Port",
'Gib den Aria2 RPC secret Token ein (leer lassen falls keine Authentifizierung aktiv)', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the username (optional)': 'Benutzername (optional)', "Gib den Port des Servers ein, auf dem der RPC-Dienst von Aria2 läuft (Standard: 6800)",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the RPC path": "RPC Pfad",
'Gib den Aria2 RPC Benutzernamen ein (leer lassen falls keine Authentifizierung aktiv)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the password (optional)': 'Passwort (optional)', "Gib den Pfad zum Aria2 RPC Endpunkt an (Standard: /jsonrpc)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Gib das Aria2 RPC Passwort ein (leer lassen falls keine Authentifizierung aktiv)', "SSL/TLS encryption": "SSL/TLS",
'Enter base URL (optional)': 'Base URL (optional)', "Enable SSL/TLS encryption": "Aktiviere SSL/TLS Verschlüsselung",
'Direct Download': 'Direkter Download', "Enter the secret token (optional)": "Secret Token (optional)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Falls angegeben, werden Links erstellt um einen direkten Download vom Aria2 Server zu ermöglichen', "Gib den Aria2 RPC secret Token ein (leer lassen falls keine Authentifizierung aktiv)",
'(Requires appropriate webserver to be configured.)': '(Es wird ein entsprechend konfigurierter WebServer benötigt.)', "Enter the username (optional)": "Benutzername (optional)",
'Save Connection configuration': 'Speichern der Verbindungseinstellung', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Filter': 'Filter', "Gib den Aria2 RPC Benutzernamen ein (leer lassen falls keine Authentifizierung aktiv)",
// server info modal "Enter the password (optional)": "Passwort (optional)",
'Aria2 server info': 'Aria2 Server Info', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 Version': 'Aria2 Version', "Gib das Aria2 RPC Passwort ein (leer lassen falls keine Authentifizierung aktiv)",
'Features Enabled': 'Aktive Funktionen', "Enter base URL (optional)": "Base URL (optional)",
// about modal "Direct Download": "Direkter Download",
'To download the latest version of the project, add issues or to contribute back, head on to': "If supplied, links will be created to enable direct download from the Aria2 server.":
'Um die neuste Version des Projects zu laden, Fehler zu melden oder sich zu beteiligen, besuch', "Falls angegeben, werden Links erstellt um einen direkten Download vom Aria2 Server zu ermöglichen",
'Or you can open the latest version in the browser through': 'Oder du kannst die neueste Version direkt in deinem Browser verwenden', "(Requires appropriate webserver to be configured.)":
'Close': 'Schließen', "(Es wird ein entsprechend konfigurierter WebServer benötigt.)",
// lables "Save Connection configuration": "Speichern der Verbindungseinstellung",
'Download status':'Download Status', Filter: "Filter",
'Download Speed':'Download Geschwindigkeit', // server info modal
'Upload Speed':'Upload Geschwindigkeit', "Aria2 server info": "Aria2 Server Info",
'Estimated time':'Geschätzte Zeit', "Aria2 Version": "Aria2 Version",
'Download Size':'Download Größe', "Features Enabled": "Aktive Funktionen",
'Downloaded':'Heruntergeladen', // about modal
'Progress':'Fortschritt', "To download the latest version of the project, add issues or to contribute back, head on to":
'Download Path':'Download Pfad', "Um die neuste Version des Projects zu laden, Fehler zu melden oder sich zu beteiligen, besuch",
'Uploaded':'Hochgeladen', "Or you can open the latest version in the browser through":
'Download GID':'Download GID', "Oder du kannst die neueste Version direkt in deinem Browser verwenden",
'Number of Pieces':'Anzahl der Stücken', Close: "Schließen",
'Piece Length':'Größe der Stücken' // lables
"Download status": "Download Status",
"Download Speed": "Download Geschwindigkeit",
"Upload Speed": "Upload Geschwindigkeit",
"Estimated time": "Geschätzte Zeit",
"Download Size": "Download Größe",
Downloaded: "Heruntergeladen",
Progress: "Fortschritt",
"Download Path": "Download Pfad",
Uploaded: "Hochgeladen",
"Download GID": "Download GID",
"Number of Pieces": "Anzahl der Stücken",
"Piece Length": "Größe der Stücken"
}; };

View File

@ -1,146 +1,162 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.en_US = { translations.en_US = {
// header // header
'Search': 'Search', Search: "Search",
// Nav menu // Nav menu
'Add': 'Add', Add: "Add",
'By URIs': 'By URIs', "By URIs": "By URIs",
'By Torrents': 'By Torrents', "By Torrents": "By Torrents",
'By Metalinks': 'By Metalinks', "By Metalinks": "By Metalinks",
'Manage': 'Manage', Manage: "Manage",
'Pause All': 'Pause All', "Pause All": "Pause All",
'Resume Paused': 'Resume Paused', "Resume Paused": "Resume Paused",
'Purge Completed': 'Purge Completed', "Purge Completed": "Purge Completed",
'Settings': 'Settings', Settings: "Settings",
'Connection Settings': 'Connection Settings', "Connection Settings": "Connection Settings",
'Global Settings': 'Global Settings', "Global Settings": "Global Settings",
'Server info': 'Server info', "Server info": "Server info",
'About and contribute': 'About and contribute', "About and contribute": "About and contribute",
'Toggle navigation': 'Toggle navigation', "Toggle navigation": "Toggle navigation",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Miscellaneous', Miscellaneous: "Miscellaneous",
'Global Statistics': 'Global Statistics', "Global Statistics": "Global Statistics",
'About': 'About', About: "About",
'Displaying': 'Displaying', Displaying: "Displaying",
'of': 'of', of: "of",
'downloads': 'downloads', downloads: "downloads",
'Language': 'Language', Language: "Language",
// download filters // download filters
'Download Filters': 'Download Filters', "Download Filters": "Download Filters",
'Running': 'Running', Running: "Running",
'Active': 'Active', Active: "Active",
'Waiting': 'Waiting', Waiting: "Waiting",
'Complete': 'Complete', Complete: "Complete",
'Error': 'Error', Error: "Error",
'Paused': 'Paused', Paused: "Paused",
'Removed': 'Removed', Removed: "Removed",
'Hide linked meta-data': 'Hide linked meta-data', "Hide linked meta-data": "Hide linked meta-data",
'Toggle': 'Toggle', Toggle: "Toggle",
'Reset filters': 'Reset filters', "Reset filters": "Reset filters",
// download status // download status
'Verifing': 'Verifing', Verifing: "Verifing",
'Verify Pending': 'Verify Pending', "Verify Pending": "Verify Pending",
// starred properties // starred properties
'Quick Access Settings': 'Quick Access Settings', "Quick Access Settings": "Quick Access Settings",
'Save': 'Save', Save: "Save",
'Save settings': 'Save settings', "Save settings": "Save settings",
'Currently no download in line to display, use the': 'Currently no download in line to display, use the', "Currently no download in line to display, use the":
'download button to start downloading files!': 'download button to start downloading files!', "Currently no download in line to display, use the",
'Peers': 'Peers', "download button to start downloading files!": "download button to start downloading files!",
'More Info': 'More Info', Peers: "Peers",
'Remove': 'Remove', "More Info": "More Info",
'# of': '# of', Remove: "Remove",
'Length': 'Length', "# of": "# of",
// modals Length: "Length",
'Add Downloads By URIs': 'Add Downloads By URIs', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "Add Downloads By URIs",
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.",
'Download settings': 'Download settings', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.",
'Advanced settings': 'Advanced settings', "Download settings": "Download settings",
'Cancel': 'Cancel', "Advanced settings": "Advanced settings",
'Start': 'Start', Cancel: "Cancel",
'Choose': 'Choose', Start: "Start",
'Quick Access (shown on the main page)': 'Quick Access (shown on the main page)', Choose: "Choose",
// add torrent modal "Quick Access (shown on the main page)": "Quick Access (shown on the main page)",
'Add Downloads By Torrents': 'Add Downloads By Torrents', // add torrent modal
'- Select the torrent from the local filesystem to start the download.': '- Select the torrent from the local filesystem to start the download.', "Add Downloads By Torrents": "Add Downloads By Torrents",
'- You can select multiple torrents to start multiple downloads.': '- You can select multiple torrents to start multiple downloads.', "- Select the torrent from the local filesystem to start the download.":
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.', "- Select the torrent from the local filesystem to start the download.",
'Select Torrents': 'Select Torrents', "- You can select multiple torrents to start multiple downloads.":
'Select a Torrent': 'Select a Torrent', "- You can select multiple torrents to start multiple downloads.",
// add metalink modal "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'Add Downloads By Metalinks': 'Add Downloads By Metalinks', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.",
'Select Metalinks': 'Select Metalinks', "Select Torrents": "Select Torrents",
'- Select the Metalink from the local filesystem to start the download.': '- Select the Metalink from the local filesystem to start the download.', "Select a Torrent": "Select a Torrent",
'- You can select multiple Metalinks to start multiple downloads.': '- You can select multiple Metalinks to start multiple downloads.', // add metalink modal
'Select a Metalink': 'Select a Metalink', "Add Downloads By Metalinks": "Add Downloads By Metalinks",
// select file modal "Select Metalinks": "Select Metalinks",
'Choose files to start download for': 'Choose files to start download for', "- Select the Metalink from the local filesystem to start the download.":
'Select to download': 'Select to download', "- Select the Metalink from the local filesystem to start the download.",
// settings modal "- You can select multiple Metalinks to start multiple downloads.":
'Aria2 RPC host and port': 'Aria2 RPC host and port', "- You can select multiple Metalinks to start multiple downloads.",
'Enter the host': 'Enter the host', "Select a Metalink": "Select a Metalink",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': // select file modal
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)', "Choose files to start download for": "Choose files to start download for",
'Enter the port': 'Enter the port', "Select to download": "Select to download",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': // settings modal
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)', "Aria2 RPC host and port": "Aria2 RPC host and port",
'Enter the RPC path': 'Enter the RPC path', "Enter the host": "Enter the host",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'SSL/TLS encryption': 'SSL/TLS encryption', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)",
'Enable SSL/TLS encryption': 'Enable SSL/TLS encryption', "Enter the port": "Enter the port",
'Enter the secret token (optional)': 'Enter the secret token (optional)', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)', "Enter the RPC path": "Enter the RPC path",
'Enter the username (optional)': 'Enter the username (optional)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)",
'Enter the Aria2 RPC username (empty if authentication not enabled)', "SSL/TLS encryption": "SSL/TLS encryption",
'Enter the password (optional)': 'Enter the password (optional)', "Enable SSL/TLS encryption": "Enable SSL/TLS encryption",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Enter the Aria2 RPC password (empty if authentication not enabled)', "Enter the secret token (optional)": "Enter the secret token (optional)",
'Enter base URL (optional)': 'Enter base URL (optional)', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Direct Download': 'Direct Download', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the username (optional)": "Enter the username (optional)",
'If supplied, links will be created to enable direct download from the Aria2 server.', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'(Requires appropriate webserver to be configured.)': '(Requires appropriate webserver to be configured.)', "Enter the Aria2 RPC username (empty if authentication not enabled)",
'Save Connection configuration': 'Save Connection configuration', "Enter the password (optional)": "Enter the password (optional)",
'Filter': 'Filter', "Enter the Aria2 RPC password (empty if authentication not enabled)":
// server info modal "Enter the Aria2 RPC password (empty if authentication not enabled)",
'Aria2 server info': 'Aria2 server info', "Enter base URL (optional)": "Enter base URL (optional)",
'Aria2 Version': 'Aria2 Version', "Direct Download": "Direct Download",
'Features Enabled': 'Features Enabled', "If supplied, links will be created to enable direct download from the Aria2 server.":
// about modal "If supplied, links will be created to enable direct download from the Aria2 server.",
'To download the latest version of the project, add issues or to contribute back, head on to': "(Requires appropriate webserver to be configured.)":
'To download the latest version of the project, add issues or to contribute back, head on to', "(Requires appropriate webserver to be configured.)",
'Or you can open the latest version in the browser through': 'Or you can open the latest version in the browser through', "Save Connection configuration": "Save Connection configuration",
'Close': 'Close', Filter: "Filter",
// lables // server info modal
'Download status':'Download status', "Aria2 server info": "Aria2 server info",
'Download Speed':'Download Speed', "Aria2 Version": "Aria2 Version",
'Upload Speed':'Upload Speed', "Features Enabled": "Features Enabled",
'Estimated time':'Estimated time', // about modal
'Download Size':'Download Size', "To download the latest version of the project, add issues or to contribute back, head on to":
'Downloaded':'Downloaded', "To download the latest version of the project, add issues or to contribute back, head on to",
'Progress':'Progress', "Or you can open the latest version in the browser through":
'Download Path':'Download Path', "Or you can open the latest version in the browser through",
'Uploaded':'Uploaded', Close: "Close",
'Download GID':'Download GID', // lables
'Number of Pieces':'Number of Pieces', "Download status": "Download status",
'Piece Length': 'Piece Length', "Download Speed": "Download Speed",
'Shutdown Server': 'Shutdown Server', "Upload Speed": "Upload Speed",
"Estimated time": "Estimated time",
"Download Size": "Download Size",
Downloaded: "Downloaded",
Progress: "Progress",
"Download Path": "Download Path",
Uploaded: "Uploaded",
"Download GID": "Download GID",
"Number of Pieces": "Number of Pieces",
"Piece Length": "Piece Length",
"Shutdown Server": "Shutdown Server",
'The last connection attempt was unsuccessful. Trying another configuration': 'The last connection attempt was unsuccessful. Trying another configuration', "The last connection attempt was unsuccessful. Trying another configuration":
'Oh Snap!': 'Oh Snap!', "The last connection attempt was unsuccessful. Trying another configuration",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': 'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings', "Oh Snap!": "Oh Snap!",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': 'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings', "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Successfully connected to Aria2 through its remote RPC …': 'Successfully connected to Aria2 through its remote RPC …', "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': 'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)', "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'Trying to connect to aria2 using the new connection configuration': 'Trying to connect to aria2 using the new connection configuration', "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings",
'Remove {{name}} and associated meta-data?': 'Remove {{name}} and associated meta-data?' "Successfully connected to Aria2 through its remote RPC …":
"Successfully connected to Aria2 through its remote RPC …",
"Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
"Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)",
"Trying to connect to aria2 using the new connection configuration":
"Trying to connect to aria2 using the new connection configuration",
"Remove {{name}} and associated meta-data?": "Remove {{name}} and associated meta-data?"
}; };

View File

@ -12,154 +12,166 @@
// 5. Browser determining preferred language automatically. // 5. Browser determining preferred language automatically.
// http://angular-translate.github.io/docs/en/#/guide/07_multi-language // http://angular-translate.github.io/docs/en/#/guide/07_multi-language
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.es_ES = { // replace en_US to ll_CC, examples: zh_CN, de_AT. translations.es_ES = {
// header // replace en_US to ll_CC, examples: zh_CN, de_AT.
'Search': 'Buscar', // header
// Nav menu Search: "Buscar",
'Add': 'Añadir', // Nav menu
'By URIs': 'URIs', Add: "Añadir",
'By Torrents': 'Torrents', "By URIs": "URIs",
'By Metalinks': 'Metalinks', "By Torrents": "Torrents",
'Manage': 'Administrar', "By Metalinks": "Metalinks",
'Pause All': 'Pausar Todos', Manage: "Administrar",
'Resume Paused': 'Reanudar Pausados', "Pause All": "Pausar Todos",
'Purge Completed': 'Purgar Completados', "Resume Paused": "Reanudar Pausados",
'Shutdown Server': 'Desactivar servidor', "Purge Completed": "Purgar Completados",
'Settings': 'Ajustes', "Shutdown Server": "Desactivar servidor",
'Connection Settings': 'Ajustes de Conexión', Settings: "Ajustes",
'Global Settings': 'Ajustes Globales', "Connection Settings": "Ajustes de Conexión",
'Server info': 'Info de Servidor', "Global Settings": "Ajustes Globales",
'About and contribute': 'Acerca y Colaborar', "Server info": "Info de Servidor",
'Toggle navigation': 'Conmutar Navegación', "About and contribute": "Acerca y Colaborar",
// body "Toggle navigation": "Conmutar Navegación",
// nav side bar // body
'Miscellaneous': 'Otros', // nav side bar
'Global Statistics': 'Estadísticas Globales', Miscellaneous: "Otros",
'About': 'Acerca de', "Global Statistics": "Estadísticas Globales",
'Displaying': 'Mostrando', About: "Acerca de",
'of': 'de', Displaying: "Mostrando",
'downloads': 'descargas', of: "de",
'Language': 'Idioma', downloads: "descargas",
// download filters Language: "Idioma",
'Download Filters': 'Filtros de Descargas', // download filters
'Running': 'Procesando', "Download Filters": "Filtros de Descargas",
'Active': 'Activo', Running: "Procesando",
'Waiting': 'Esperando', Active: "Activo",
'Complete': 'Completo', Waiting: "Esperando",
'Error': 'Error', Complete: "Completo",
'Paused': 'En Pausa', Error: "Error",
'Removed': 'Eliminado', Paused: "En Pausa",
'Hide linked meta-data': 'Ocultar metadatos adjuntos', Removed: "Eliminado",
'Toggle': 'Conmutar', "Hide linked meta-data": "Ocultar metadatos adjuntos",
'Reset filters': 'Restablecer Filtros', Toggle: "Conmutar",
// download status "Reset filters": "Restablecer Filtros",
'Verifing': 'Verificando', // download status
'Verify Pending': 'Pendiente de verificación', Verifing: "Verificando",
// starred properties "Verify Pending": "Pendiente de verificación",
'Quick Access Settings': 'Ajustes Rápidos', // starred properties
'Save': 'Guardar', "Quick Access Settings": "Ajustes Rápidos",
'Save settings': 'Guardar Ajustes', Save: "Guardar",
'Currently no download in line to display, use the': 'En este momento no hay descargas para mostrar. ¡Use la opción', "Save settings": "Guardar Ajustes",
'download button to start downloading files!': 'para empezar a descargar sus archivos!', "Currently no download in line to display, use the":
'Peers': 'Pares', "En este momento no hay descargas para mostrar. ¡Use la opción",
'More Info': 'Mas Info', "download button to start downloading files!": "para empezar a descargar sus archivos!",
'Remove': 'Eliminar', Peers: "Pares",
'# of': '# de', "More Info": "Mas Info",
'Length': 'Longitud', Remove: "Eliminar",
// modals "# of": "# de",
'Add Downloads By URIs': 'Añadir descargas por URIs', Length: "Longitud",
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': // modals
'Añada varias descargas colocando la URI de cada descarga en una línea separada.', "Add Downloads By URIs": "Añadir descargas por URIs",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'Puede añadir URIs de espejo para *el mismo* archivo. Separe cada URI con un espacio.', "Añada varias descargas colocando la URI de cada descarga en una línea separada.",
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': 'Una URI puede ser HTTP(S), FTP, BitTorrent o Magnet.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'Download settings': 'Ajustes de Descargas', "Puede añadir URIs de espejo para *el mismo* archivo. Separe cada URI con un espacio.",
'Advanced settings': 'Ajustes Avanzados', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Cancel': 'Cancelar', "Una URI puede ser HTTP(S), FTP, BitTorrent o Magnet.",
'Start': 'Iniciar', "Download settings": "Ajustes de Descargas",
'Choose': 'Escoja', "Advanced settings": "Ajustes Avanzados",
'Quick Access (shown on the main page)': 'Acceso Rápido (Se muestra en la pág principal)', Cancel: "Cancelar",
// add torrent modal Start: "Iniciar",
'Add Downloads By Torrents': 'Añadir descargas Torrent', Choose: "Escoja",
'- Select the torrent from the local filesystem to start the download.': 'Seleccione el archivo Torrent de su equipo para iniciar la descarga', "Quick Access (shown on the main page)": "Acceso Rápido (Se muestra en la pág principal)",
'- You can select multiple torrents to start multiple downloads.': 'Puede seleccionar varios torrents', // add torrent modal
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': 'Para los enlaces Magnet, salga de este cuadro y use la opción Añadir \ URI', "Add Downloads By Torrents": "Añadir descargas Torrent",
'Select Torrents': 'Escoja los Torrents', "- Select the torrent from the local filesystem to start the download.":
'Select a Torrent': 'Escoja el Torrent', "Seleccione el archivo Torrent de su equipo para iniciar la descarga",
// add metalink modal "- You can select multiple torrents to start multiple downloads.":
'Add Downloads By Metalinks': 'Añadir descargas Metalink', "Puede seleccionar varios torrents",
'Select Metalinks': 'Seleccione el Metalink', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'- Select the Metalink from the local filesystem to start the download.': 'Escoja el archivo Metalink de su equipo para iniciar la descarga', "Para los enlaces Magnet, salga de este cuadro y use la opción Añadir URI",
'- You can select multiple Metalinks to start multiple downloads.': 'Puede escoger varios archivos Metalink', "Select Torrents": "Escoja los Torrents",
'Select a Metalink': 'Escoja el archivo Metalink', "Select a Torrent": "Escoja el Torrent",
// select file modal // add metalink modal
'Choose files to start download for': 'Escoja los archivos que desea descargar', "Add Downloads By Metalinks": "Añadir descargas Metalink",
'Select to download': 'Escoja que descargar', "Select Metalinks": "Seleccione el Metalink",
// settings modal "- Select the Metalink from the local filesystem to start the download.":
'Aria2 RPC host and port': 'Servidor Aria2 y puerto', "Escoja el archivo Metalink de su equipo para iniciar la descarga",
'Enter the host': 'Escriba la dirección', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Puede escoger varios archivos Metalink",
'Escriba la dirección o nombre DNS del servidor Aria2 (por defecto: localhost)', "Select a Metalink": "Escoja el archivo Metalink",
'Enter the port': 'Escriba el puerto', // select file modal
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Choose files to start download for": "Escoja los archivos que desea descargar",
'Escriba el número del puerto del servidor Aria2 (por defecto: 6800)', "Select to download": "Escoja que descargar",
'Enter the RPC path': 'Escriba la ruta RPC', // settings modal
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Escriba la ruta de acceso RPC de Aria2 (por defecto: /jsonrpc)', "Aria2 RPC host and port": "Servidor Aria2 y puerto",
'SSL/TLS encryption': 'Cifrado SSL/TLS', "Enter the host": "Escriba la dirección",
'Enable SSL/TLS encryption': 'Habilitar Cifrado SSL/TLS', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the secret token (optional)': 'Escriba la frase Token (opcional)', "Escriba la dirección o nombre DNS del servidor Aria2 (por defecto: localhost)",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port": "Escriba el puerto",
'Escriba la frase Token secreta (vacío si la autenticación está deshabilitada)', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the username (optional)': 'Usuario (opcional)', "Escriba el número del puerto del servidor Aria2 (por defecto: 6800)",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the RPC path": "Escriba la ruta RPC",
'Escriba el nombre de usuario (vacío si la autenticación está deshabilitada)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the password (optional)': 'Escriba la contraseña', "Escriba la ruta de acceso RPC de Aria2 (por defecto: /jsonrpc)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Escriba la contraseña RPC (vacío si la autenticación está deshabilitada)', "SSL/TLS encryption": "Cifrado SSL/TLS",
'Enter base URL (optional)': 'Escriba la URL base (opcional)', "Enable SSL/TLS encryption": "Habilitar Cifrado SSL/TLS",
'Direct Download': 'Descarga Directa', "Enter the secret token (optional)": "Escriba la frase Token (opcional)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Esto permite crear enlaces de descarga de los archivos desde el servidor Aria2', "Escriba la frase Token secreta (vacío si la autenticación está deshabilitada)",
'(Requires appropriate webserver to be configured.)': '(Requiere configuración apropiada del servidor web)', "Enter the username (optional)": "Usuario (opcional)",
'Save Connection configuration': 'Guardar Configuración', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Filter': 'Filrar', "Escriba el nombre de usuario (vacío si la autenticación está deshabilitada)",
// server info modal "Enter the password (optional)": "Escriba la contraseña",
'Aria2 server info': 'Información de servidor Aria2', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 Version': 'Aria2 versión', "Escriba la contraseña RPC (vacío si la autenticación está deshabilitada)",
'Features Enabled': 'Funcionalidad disponible', "Enter base URL (optional)": "Escriba la URL base (opcional)",
// about modal "Direct Download": "Descarga Directa",
'To download the latest version of the project, add issues or to contribute back, head on to': "If supplied, links will be created to enable direct download from the Aria2 server.":
'Para obtener la última versión del proyecto, reportar problemas o colaborar, vaya a', "Esto permite crear enlaces de descarga de los archivos desde el servidor Aria2",
'Or you can open the latest version in the browser through': 'Puede abrir la última versión en su navegador, directamente', "(Requires appropriate webserver to be configured.)":
'Close': 'Cerrar', "(Requiere configuración apropiada del servidor web)",
// labels "Save Connection configuration": "Guardar Configuración",
'Download status':'Estado de descarga', Filter: "Filrar",
'Download Speed':'Velocidad de descarga', // server info modal
'Upload Speed':'Vel. Subida', "Aria2 server info": "Información de servidor Aria2",
'Estimated time':'Tiempo estimado', "Aria2 Version": "Aria2 versión",
'Download Size':'Tamaño de descarga', "Features Enabled": "Funcionalidad disponible",
'Downloaded':'Descargado', // about modal
'Progress':'Progreso', "To download the latest version of the project, add issues or to contribute back, head on to":
'Download Path':'Carpeta de descarga', "Para obtener la última versión del proyecto, reportar problemas o colaborar, vaya a",
'Uploaded':'Subido', "Or you can open the latest version in the browser through":
'Download GID':'GID de Descarga', "Puede abrir la última versión en su navegador, directamente",
'Number of Pieces':'N° de Piezas', Close: "Cerrar",
'Piece Length':'Tamaño de pieza', // labels
//alerts "Download status": "Estado de descarga",
'The last connection attempt was unsuccessful. Trying another configuration': "Download Speed": "Velocidad de descarga",
'El último intento de conexión falló. Probando otra configuración', "Upload Speed": "Vel. Subida",
'Oh Snap!': 'Rayos…', "Estimated time": "Tiempo estimado",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "Download Size": "Tamaño de descarga",
'No se pudo establecer una conexión al servidor Aria2. Reintentando en 10 segundos. Pruebe revisando la configuración en Ajustes > Ajustes de Conexión', Downloaded: "Descargado",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': Progress: "Progreso",
'Autenticación fallida con el servior Aria2 RPC. Reintentando en 10 segundos. Puede que sea necesario revisar su info de autenticación en Ajustes > Ajustes de Conexión', "Download Path": "Carpeta de descarga",
'Successfully connected to Aria2 through its remote RPC …': Uploaded: "Subido",
'Conexión exitosa con el servidor Aria2 mediante la interfaz RPC', "Download GID": "GID de Descarga",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "Number of Pieces": "N° de Piezas",
'Conexión exitosa con el servidor Aria2 mediante la interfaz RPC, sin embargo la conexión no es segura. Para mejorar la seguridad, añada un token de autorización al iniciar Aria2 (con la opción --rpc-secret)', "Piece Length": "Tamaño de pieza",
'Trying to connect to aria2 using the new connection configuration': //alerts
'Intentando conectar con el servidor Aria2 usando los nuevos Ajustes de Conexión' "The last connection attempt was unsuccessful. Trying another configuration":
"El último intento de conexión falló. Probando otra configuración",
"Oh Snap!": "Rayos…",
"Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
"No se pudo establecer una conexión al servidor Aria2. Reintentando en 10 segundos. Pruebe revisando la configuración en Ajustes > Ajustes de Conexión",
"Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
"Autenticación fallida con el servior Aria2 RPC. Reintentando en 10 segundos. Puede que sea necesario revisar su info de autenticación en Ajustes > Ajustes de Conexión",
"Successfully connected to Aria2 through its remote RPC …":
"Conexión exitosa con el servidor Aria2 mediante la interfaz RPC",
"Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
"Conexión exitosa con el servidor Aria2 mediante la interfaz RPC, sin embargo la conexión no es segura. Para mejorar la seguridad, añada un token de autorización al iniciar Aria2 (con la opción --rpc-secret)",
"Trying to connect to aria2 using the new connection configuration":
"Intentando conectar con el servidor Aria2 usando los nuevos Ajustes de Conexión"
}; };

View File

@ -1,154 +1,163 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.fa_IR = { translations.fa_IR = {
// header // header
'Search': 'جستجو', Search: "جستجو",
// Nav menu // Nav menu
'Add': 'اضافه کردن', Add: "اضافه کردن",
'By URIs': 'بر اساس مسیر سایت', "By URIs": "بر اساس مسیر سایت",
'By Torrents': 'بر اساس تورنت', "By Torrents": "بر اساس تورنت",
'By Metalinks': 'بر اساس متا لینک', "By Metalinks": "بر اساس متا لینک",
'Manage': 'مدیریت', Manage: "مدیریت",
'Pause All': 'توقف همه', "Pause All": "توقف همه",
'Resume Paused': 'ادامه متوقف شده ها', "Resume Paused": "ادامه متوقف شده ها",
'Purge Completed': 'حذف تکمیل شده ها', "Purge Completed": "حذف تکمیل شده ها",
'Shutdown Server': 'خاموش کردن سرور', "Shutdown Server": "خاموش کردن سرور",
'Settings': 'تنظیمات', Settings: "تنظیمات",
'Connection Settings': 'تنظیمات ارتباط', "Connection Settings": "تنظیمات ارتباط",
'Global Settings': 'تنظیمات سراسری', "Global Settings": "تنظیمات سراسری",
'Server info': 'اطلاعات سرور', "Server info": "اطلاعات سرور",
'About and contribute': 'درباره و مشارکت', "About and contribute": "درباره و مشارکت",
'Toggle navigation': 'تغییر ناوبری', "Toggle navigation": "تغییر ناوبری",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'متفرقه', Miscellaneous: "متفرقه",
'Global Statistics': 'آمار سراسری', "Global Statistics": "آمار سراسری",
'About': 'درباره', About: "درباره",
'Displaying': 'نمایش', Displaying: "نمایش",
'of': 'از', of: "از",
'downloads': 'دانلودها', downloads: "دانلودها",
'Language': 'زبان', Language: "زبان",
// download filters // download filters
'Download Filters': 'دانلود فیلترها', "Download Filters": "دانلود فیلترها",
'Running': 'در حال اجرا', Running: "در حال اجرا",
'Active': 'فعال', Active: "فعال",
'Waiting': 'در انتظار', Waiting: "در انتظار",
'Complete': 'تمام شده', Complete: "تمام شده",
'Error': 'خطا', Error: "خطا",
'Paused': 'متوقف شده', Paused: "متوقف شده",
'Removed': 'حذف شده', Removed: "حذف شده",
'Hide linked meta-data': 'مخفی کردن متا داده مرتبط', "Hide linked meta-data": "مخفی کردن متا داده مرتبط",
'Toggle': 'تغییر وضعیت', Toggle: "تغییر وضعیت",
'Reset filters': 'حذف فیلترها', "Reset filters": "حذف فیلترها",
// download status // download status
'Verifing': 'تأیید کردن', Verifing: "تأیید کردن",
'Verify Pending': 'تأیید کردن در انتظارها', "Verify Pending": "تأیید کردن در انتظارها",
// starred properties // starred properties
'Quick Access Settings': 'تنظیمات دسترسی سریع', "Quick Access Settings": "تنظیمات دسترسی سریع",
'Save': 'ذخیره', Save: "ذخیره",
'Save settings': 'ذخیره تنظیمات', "Save settings": "ذخیره تنظیمات",
'Currently no download in line to display, use the': 'در حال حاضر هیچ دانلودی برای نمایش وجود ندارد، استفاده از', "Currently no download in line to display, use the":
'download button to start downloading files!': 'دکمه دانلود برای شروع دانلود فایل ها!', "در حال حاضر هیچ دانلودی برای نمایش وجود ندارد، استفاده از",
'Peers': 'همتایان', "download button to start downloading files!": "دکمه دانلود برای شروع دانلود فایل ها!",
'More Info': 'اطلاعات بیشتر', Peers: "همتایان",
'Remove': 'حذف', "More Info": "اطلاعات بیشتر",
'# of': 'از #', Remove: "حذف",
'Length': 'طول', "# of": "از #",
// modals Length: "طول",
'Add Downloads By URIs': 'اضافه کردن دانلود توسط لینک ها', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "اضافه کردن دانلود توسط لینک ها",
'- شما می توانید چند بار دانلود (فایل ها) را همزمان با قرار دادن URI ها برای هر فایل در یک خط جداگانه اضافه کنید.', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- شما می توانید چند بار دانلود (فایل ها) را همزمان با قرار دادن URI ها برای هر فایل در یک خط جداگانه اضافه کنید.",
'- شما همچنین می توانید URI های متعدد (آینه ها) را برای فایل *همان* اضافه کنید. برای انجام این کار، URI ها را با یک فضای جداگانه جدا کنید.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- یک URI می تواند HTTP (S) / FTP / BitTorrent-Magnet باشد.', "- شما همچنین می توانید URI های متعدد (آینه ها) را برای فایل *همان* اضافه کنید. برای انجام این کار، URI ها را با یک فضای جداگانه جدا کنید.",
'Download settings': 'تنظیمات دانلود', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Advanced settings': 'تنظیمات پیشرفته', "- یک URI می تواند HTTP (S) / FTP / BitTorrent-Magnet باشد.",
'Cancel': 'لغو', "Download settings": "تنظیمات دانلود",
'Start': 'شروع', "Advanced settings": "تنظیمات پیشرفته",
'Choose': 'انتخاب', Cancel: "لغو",
'Quick Access (shown on the main page)': 'دسترسی سریع (نشان داده شده در صفحه اصلی)', Start: "شروع",
// add torrent modal Choose: "انتخاب",
'Add Downloads By Torrents': 'اضافه کردن دانلود توسط تورنت', "Quick Access (shown on the main page)": "دسترسی سریع (نشان داده شده در صفحه اصلی)",
'- Select the torrent from the local filesystem to start the download.': '- تورنت را از سیستم فایل محلی انتخاب کنید تا دانلود را شروع کنید.', // add torrent modal
'- You can select multiple torrents to start multiple downloads.': '- شما می توانید چندین تورنت را برای شروع بارگیری چندگانه انتخاب کنید.', "Add Downloads By Torrents": "اضافه کردن دانلود توسط تورنت",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- برای اضافه کردن URL BitTorrent-Magnet، از گزینه بر اساس مسیر سایت استفاده کنید و آن را در آنجا اضافه کنید.', "- Select the torrent from the local filesystem to start the download.":
'Select Torrents': 'تورنت ها را انتخاب کنید', "- تورنت را از سیستم فایل محلی انتخاب کنید تا دانلود را شروع کنید.",
'Select a Torrent': 'تورنتی را انتخاب کنید', "- You can select multiple torrents to start multiple downloads.":
// add metalink modal "- شما می توانید چندین تورنت را برای شروع بارگیری چندگانه انتخاب کنید.",
'Add Downloads By Metalinks': 'متالینک ها را انتخاب کنید', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'Select Metalinks': 'Metalinks را انتخاب کنید', "- برای اضافه کردن URL BitTorrent-Magnet، از گزینه بر اساس مسیر سایت استفاده کنید و آن را در آنجا اضافه کنید.",
'- Select the Metalink from the local filesystem to start the download.': '- Metalink را از سیستم فایل محلی انتخاب کنید تا دانلود را شروع کنید.', "Select Torrents": "تورنت ها را انتخاب کنید",
'- You can select multiple Metalinks to start multiple downloads.': '- شما می توانید چندین Metalinks را برای شروع چندین بار انتخاب کنید.', "Select a Torrent": "تورنتی را انتخاب کنید",
'Select a Metalink': 'Metalink را انتخاب کنید', // add metalink modal
// select file modal "Add Downloads By Metalinks": "متالینک ها را انتخاب کنید",
'Choose files to start download for': 'فایل را برای شروع دانلود انتخاب کنید', "Select Metalinks": "Metalinks را انتخاب کنید",
'Select to download': 'برای دانلود انتخاب کنید', "- Select the Metalink from the local filesystem to start the download.":
// settings modal "- Metalink را از سیستم فایل محلی انتخاب کنید تا دانلود را شروع کنید.",
'Aria2 RPC host and port': 'میزبان و پورت Aria2 RPC', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the host': 'میزبان را وارد کنید', "- شما می توانید چندین Metalinks را برای شروع چندین بار انتخاب کنید.",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Select a Metalink": "Metalink را انتخاب کنید",
'نام IP یا DNS سرور که RPC برای Aria2 در حال اجرا است را وارد کنید (به طور پیش فرض: localhost)', // select file modal
'Enter the port': 'پورت را وارد کنید', "Choose files to start download for": "فایل را برای شروع دانلود انتخاب کنید",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Select to download": "برای دانلود انتخاب کنید",
'پورت سرور که RPC برای Aria2 اجرا می شود را وارد کنید (به طور پیش فرض: 6800)', // settings modal
'Enter the RPC path': 'مسیر RPC را وارد کنید', "Aria2 RPC host and port": "میزبان و پورت Aria2 RPC",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'مسیر نقطه پایانی Aria2 RPC را وارد کنید (default: / jsonrpc)', "Enter the host": "میزبان را وارد کنید",
'SSL/TLS encryption': 'SSL / TLS رمزگذاری', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enable SSL/TLS encryption': 'SSL / TLS رمزگذاری را فعال کنید', "نام IP یا DNS سرور که RPC برای Aria2 در حال اجرا است را وارد کنید (به طور پیش فرض: localhost)",
'Enter the secret token (optional)': 'رمز نشانه (اختیاری) را وارد کنید', "Enter the port": "پورت را وارد کنید",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'کد مخفی Aria2 RPC را وارد کنید (اگر احراز هویت فعال نمی شود خالی بگذارید)', "پورت سرور که RPC برای Aria2 اجرا می شود را وارد کنید (به طور پیش فرض: 6800)",
'Enter the username (optional)': 'نام کاربری (اختیاری) را وارد کنید', "Enter the RPC path": "مسیر RPC را وارد کنید",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'نام کاربری Aria2 RPC را وارد کنید (خالی اگر احراز هویت غیر فعال شود)', "مسیر نقطه پایانی Aria2 RPC را وارد کنید (default: / jsonrpc)",
'Enter the password (optional)': 'رمز عبور را وارد کنید (اختیاری)', "SSL/TLS encryption": "SSL / TLS رمزگذاری",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'گذرواژه Aria2 RPC را وارد کنید (اگر احراز هویت فعال نمی شود خالی بگذارید)', "Enable SSL/TLS encryption": "SSL / TLS رمزگذاری را فعال کنید",
'Enter base URL (optional)': 'URL پایه را وارد کنید (اختیاری)', "Enter the secret token (optional)": "رمز نشانه (اختیاری) را وارد کنید",
'Direct Download': 'دانلود مستقیم', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'If supplied, links will be created to enable direct download from the Aria2 server.': "کد مخفی Aria2 RPC را وارد کنید (اگر احراز هویت فعال نمی شود خالی بگذارید)",
'در صورت عرضه، لینک برای ایجاد مستقیم دانلود از سرور Aria2 ایجاد خواهد شد.', "Enter the username (optional)": "نام کاربری (اختیاری) را وارد کنید",
'(Requires appropriate webserver to be configured.)': '(نیاز به وب سرور مناسب برای پیکربندی.)', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Save Connection configuration': 'ذخیره پیکربندی اتصال', "نام کاربری Aria2 RPC را وارد کنید (خالی اگر احراز هویت غیر فعال شود)",
'Filter': 'فیلتر', "Enter the password (optional)": "رمز عبور را وارد کنید (اختیاری)",
// server info modal "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 server info': 'مشخصات سرور Aria2', "گذرواژه Aria2 RPC را وارد کنید (اگر احراز هویت فعال نمی شود خالی بگذارید)",
'Aria2 Version': 'نسخه Aria2', "Enter base URL (optional)": "URL پایه را وارد کنید (اختیاری)",
'Features Enabled': 'ویژگی های فعال', "Direct Download": "دانلود مستقیم",
// about modal "If supplied, links will be created to enable direct download from the Aria2 server.":
'To download the latest version of the project, add issues or to contribute back, head on to': "در صورت عرضه، لینک برای ایجاد مستقیم دانلود از سرور Aria2 ایجاد خواهد شد.",
'برای دانلود آخرين نسخه پروژه، مسائل را اضافه کنيد يا به پشتيبانی بپردازيد بروید به', "(Requires appropriate webserver to be configured.)": "(نیاز به وب سرور مناسب برای پیکربندی.)",
'Or you can open the latest version in the browser through': 'یا شما می توانید آخرین نسخه را از طریق مرورگر باز کنید', "Save Connection configuration": "ذخیره پیکربندی اتصال",
'Close': 'بستن', Filter: "فیلتر",
// labels // server info modal
'Download status':'وضعیت دانلود', "Aria2 server info": "مشخصات سرور Aria2",
'Download Speed':'سرعت دانلود', "Aria2 Version": "نسخه Aria2",
'Upload Speed':'سرعت آپلود', "Features Enabled": "ویژگی های فعال",
'Estimated time':'زمان تخمین زده شده', // about modal
'Download Size':'اندازه دانلود', "To download the latest version of the project, add issues or to contribute back, head on to":
'Downloaded':'دانلود شده', "برای دانلود آخرين نسخه پروژه، مسائل را اضافه کنيد يا به پشتيبانی بپردازيد بروید به",
'Progress':'پیشرفت', "Or you can open the latest version in the browser through":
'Download Path':'مسیر دانلود', "یا شما می توانید آخرین نسخه را از طریق مرورگر باز کنید",
'Uploaded':'آپلود شده', Close: "بستن",
'Download GID':'دانلود GID', // labels
'Number of Pieces':'تعداد قطعات', "Download status": "وضعیت دانلود",
'Piece Length':'طول قطعه', "Download Speed": "سرعت دانلود",
"Upload Speed": "سرعت آپلود",
"Estimated time": "زمان تخمین زده شده",
"Download Size": "اندازه دانلود",
Downloaded: "دانلود شده",
Progress: "پیشرفت",
"Download Path": "مسیر دانلود",
Uploaded: "آپلود شده",
"Download GID": "دانلود GID",
"Number of Pieces": "تعداد قطعات",
"Piece Length": "طول قطعه",
//alerts //alerts
'The last connection attempt was unsuccessful. Trying another configuration': "The last connection attempt was unsuccessful. Trying another configuration":
'آخرین تلاش اتصال ناموفق بود. تلاش برای تنظیم دیگر', "آخرین تلاش اتصال ناموفق بود. تلاش برای تنظیم دیگر",
'Oh Snap!': 'اوه نه!', "Oh Snap!": "اوه نه!",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'نمی توان به سرور aria2 RPC متصل شد. در 10 ثانیه دوباره تلاش خواهیم کرد ممکن است بخواهید تنظیمات اتصال را با رفتن به تنظیمات > تنظیمات اتصال بررسی کنید', "نمی توان به سرور aria2 RPC متصل شد. در 10 ثانیه دوباره تلاش خواهیم کرد ممکن است بخواهید تنظیمات اتصال را با رفتن به تنظیمات > تنظیمات اتصال بررسی کنید",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'در هنگام اتصال به سرور Aria2 RPC تأییدیه شکست خورد. در 10 ثانیه دوباره تلاش خواهیم کرد ممکن است بخواهید جزئیات احراز هویت خود را با رفتن به تنظیمات > تنظیمات اتصال تایید کنید', "در هنگام اتصال به سرور Aria2 RPC تأییدیه شکست خورد. در 10 ثانیه دوباره تلاش خواهیم کرد ممکن است بخواهید جزئیات احراز هویت خود را با رفتن به تنظیمات > تنظیمات اتصال تایید کنید",
'Successfully connected to Aria2 through its remote RPC …': "Successfully connected to Aria2 through its remote RPC …":
'با موفقیت از طریق RPC از راه دور به Aria2 متصل شد ...', "با موفقیت از طریق RPC از راه دور به Aria2 متصل شد ...",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
'با موفقیت به Aria2 از طریق RPC راه دور متصل شد، اما اتصال هنوز ناامن است. برای امنیت کامل سعی کنید مجوز نشانه مجوز را در هنگام شروع Aria2 (از طریق پرچم --rpc-secret)', "با موفقیت به Aria2 از طریق RPC راه دور متصل شد، اما اتصال هنوز ناامن است. برای امنیت کامل سعی کنید مجوز نشانه مجوز را در هنگام شروع Aria2 (از طریق پرچم --rpc-secret)",
'Trying to connect to aria2 using the new connection configuration': "Trying to connect to aria2 using the new connection configuration":
'تلاش برای اتصال به aria2 با استفاده از پیکربندی اتصال جدید', "تلاش برای اتصال به aria2 با استفاده از پیکربندی اتصال جدید",
'Remove {{name}} and associated meta-data?': "Remove {{name}} and associated meta-data?": "حذف {{name}} و متا داده های مرتبط"
'حذف {{name}} و متا داده های مرتبط'
}; };

View File

@ -1,146 +1,164 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.fr_FR = { translations.fr_FR = {
// header // header
'Search': 'Rechercher', Search: "Rechercher",
// Nav menu // Nav menu
'Add': 'Ajouter', Add: "Ajouter",
'By URIs': 'Par URIs', "By URIs": "Par URIs",
'By Torrents': 'Par Torrents', "By Torrents": "Par Torrents",
'By Metalinks': 'Par Metaliens', "By Metalinks": "Par Metaliens",
'Manage': 'Gérer', Manage: "Gérer",
'Pause All': 'Tout suspendre', "Pause All": "Tout suspendre",
'Resume Paused': 'Reprendre', "Resume Paused": "Reprendre",
'Purge Completed': 'Nettoyer les fichiers complétés', "Purge Completed": "Nettoyer les fichiers complétés",
'Settings': 'Paramètres', Settings: "Paramètres",
'Connection Settings': 'Paramètres de connexion', "Connection Settings": "Paramètres de connexion",
'Global Settings': 'Paramètres globaux', "Global Settings": "Paramètres globaux",
'Server info': 'Informations serveur', "Server info": "Informations serveur",
'About and contribute': 'À propos et contribuer', "About and contribute": "À propos et contribuer",
'Toggle navigation': 'Basculer la navigation', "Toggle navigation": "Basculer la navigation",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Autres', Miscellaneous: "Autres",
'Global Statistics': 'Statistiques globales', "Global Statistics": "Statistiques globales",
'About': 'À propos', About: "À propos",
'Displaying': 'Affichage de', Displaying: "Affichage de",
'of': 'parmi', of: "parmi",
'downloads': 'téléchargements', downloads: "téléchargements",
'Language': 'Langue', Language: "Langue",
// download filters // download filters
'Download Filters': 'Filtres de téléchargement', "Download Filters": "Filtres de téléchargement",
'Running': 'En cours', Running: "En cours",
'Active': 'Actifs', Active: "Actifs",
'Waiting': 'En attente', Waiting: "En attente",
'Complete': 'Complétés', Complete: "Complétés",
'Error': 'Erreurs', Error: "Erreurs",
'Paused': 'En pause', Paused: "En pause",
'Removed': 'Supprimés', Removed: "Supprimés",
'Hide linked meta-data': 'Cacher les métadonnées liées', "Hide linked meta-data": "Cacher les métadonnées liées",
'Toggle': 'Basculer', Toggle: "Basculer",
'Reset filters': 'Réinitialiser les filtres', "Reset filters": "Réinitialiser les filtres",
// download status // download status
'Verifing': 'Vérification', Verifing: "Vérification",
'Verify Pending': 'Vérification en attente', "Verify Pending": "Vérification en attente",
// starred properties // starred properties
'Quick Access Settings': 'Paramètres d\'accès rapide', "Quick Access Settings": "Paramètres d'accès rapide",
'Save': 'Sauvegarder', Save: "Sauvegarder",
'Save settings': 'Sauvegarder les paramètres', "Save settings": "Sauvegarder les paramètres",
'Currently no download in line to display, use the': 'Aucun téléchargement dans la file d\'attente, utilisez le bouton de téléchargement', "Currently no download in line to display, use the":
'download button to start downloading files!': 'pour commencer à télécharger des fichiers !', "Aucun téléchargement dans la file d'attente, utilisez le bouton de téléchargement",
'Peers': 'Pairs', "download button to start downloading files!": "pour commencer à télécharger des fichiers !",
'More Info': 'Plus d\'infos', Peers: "Pairs",
'Remove': 'Supprimer', "More Info": "Plus d'infos",
'# of': '# parmi', Remove: "Supprimer",
'Length': 'Longueur', "# of": "# parmi",
// modals Length: "Longueur",
'Add Downloads By URIs': 'Ajouter des téléchargements depuis des URIs', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "Ajouter des téléchargements depuis des URIs",
'Vous pouvez ajouter plusieurs téléchargements (fichiers) en même temps, en mettant une URI pour chaque fichier sur une nouvelle ligne', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "Vous pouvez ajouter plusieurs téléchargements (fichiers) en même temps, en mettant une URI pour chaque fichier sur une nouvelle ligne",
'Vous pouvez aussi ajouter plusieurs URIs (mirroirs) pour le *même* fichier. Pour ce faire, séparez les URIs par un espace.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': 'Une URI peut être HTTP(S)/FTP/BitTorrent-Magnet.', "Vous pouvez aussi ajouter plusieurs URIs (mirroirs) pour le *même* fichier. Pour ce faire, séparez les URIs par un espace.",
'Download settings': 'Paramètres de téléchargement', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Advanced settings': 'Paramètres avancés', "Une URI peut être HTTP(S)/FTP/BitTorrent-Magnet.",
'Cancel': 'Annuler', "Download settings": "Paramètres de téléchargement",
'Start': 'Démarrer', "Advanced settings": "Paramètres avancés",
'Choose': 'Choisir', Cancel: "Annuler",
'Quick Access (shown on the main page)': 'Accès rapide (affiché sur la page principale', Start: "Démarrer",
// add torrent modal Choose: "Choisir",
'Add Downloads By Torrents': 'Ajouter des téléchargements à partir de fichiers Torrent', "Quick Access (shown on the main page)": "Accès rapide (affiché sur la page principale",
'- Select the torrent from the local filesystem to start the download.': '- Sélectionnez le torrent depuis votre système de fichier local pour commencer le téléchargement.', // add torrent modal
'- You can select multiple torrents to start multiple downloads.': 'Vous pouvez sélectionner plusieurs torrents pour commencer plusieurs téléchargements.', "Add Downloads By Torrents": "Ajouter des téléchargements à partir de fichiers Torrent",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': 'Pour ajouter une URL BitTorrent-Magnet, utilisez l\'option Ajouter par URIs et ajoutez-la à ce niveau.', "- Select the torrent from the local filesystem to start the download.":
'Select Torrents': 'Sélectionner des Torrents', "- Sélectionnez le torrent depuis votre système de fichier local pour commencer le téléchargement.",
'Select a Torrent': 'Sélectionner un Torrent', "- You can select multiple torrents to start multiple downloads.":
// add metalink modal "Vous pouvez sélectionner plusieurs torrents pour commencer plusieurs téléchargements.",
'Add Downloads By Metalinks': 'Ajouter des téléchargements par Metaliens', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'Select Metalinks': 'Sélectionner des Métaliens', "Pour ajouter une URL BitTorrent-Magnet, utilisez l'option Ajouter par URIs et ajoutez-la à ce niveau.",
'- Select the Metalink from the local filesystem to start the download.': 'Sélectionner le Métalien depuis votre système de fichier local pour commencer le téléchargement.', "Select Torrents": "Sélectionner des Torrents",
'- You can select multiple Metalinks to start multiple downloads.': 'Vous pouvez sélectionner plusieurs Métaliens pour commencer plusieurs téléchargements.', "Select a Torrent": "Sélectionner un Torrent",
'Select a Metalink': 'Sélectionner un Métalien', // add metalink modal
// select file modal "Add Downloads By Metalinks": "Ajouter des téléchargements par Metaliens",
'Choose files to start download for': 'Sélectionner les fichiers pour lesquels commencer le téléchargement.', "Select Metalinks": "Sélectionner des Métaliens",
'Select to download': 'Sélectionner pour télécharger', "- Select the Metalink from the local filesystem to start the download.":
// settings modal "Sélectionner le Métalien depuis votre système de fichier local pour commencer le téléchargement.",
'Aria2 RPC host and port': 'Hôte et ports Aria2 RPC', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the host': 'Entrer l\'hôte', "Vous pouvez sélectionner plusieurs Métaliens pour commencer plusieurs téléchargements.",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Select a Metalink": "Sélectionner un Métalien",
'Entrer l\'IP ou le nom DNS du serveur sur lequel est lancé le RPC pour Aria2 (défaut : localhost)', // select file modal
'Enter the port': 'Entrer le port', "Choose files to start download for":
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Sélectionner les fichiers pour lesquels commencer le téléchargement.",
'Entrer le port du serveur sur lequel tourne le RPC pour Aria2 (défaut : 6800)', "Select to download": "Sélectionner pour télécharger",
'Enter the RPC path': 'Entrer le chemin vers le RPC', // settings modal
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Entrer le chemin final pour le RPC Aria2 (défaut : /jsonrpc)', "Aria2 RPC host and port": "Hôte et ports Aria2 RPC",
'SSL/TLS encryption': 'Chiffrage SSL/TLS', "Enter the host": "Entrer l'hôte",
'Enable SSL/TLS encryption': 'Activer le chiffrage SSL/TLS', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the secret token (optional)': 'Entrer le token secret (optionnel)', "Entrer l'IP ou le nom DNS du serveur sur lequel est lancé le RPC pour Aria2 (défaut : localhost)",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port": "Entrer le port",
'Entrer le token secret pour le RPC Aria2 (laisser vide si l\'authentification n\'est pas activée)', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the username (optional)': 'Entrer le nom d\'utilisateur (optionnel)', "Entrer le port du serveur sur lequel tourne le RPC pour Aria2 (défaut : 6800)",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the RPC path": "Entrer le chemin vers le RPC",
'Entrer le nom d\'utilisateur RPC Aria2 (laisser vide si l\'authentification n\'est pas activée)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the password (optional)': 'Entrer le mot de passe (optionnel)', "Entrer le chemin final pour le RPC Aria2 (défaut : /jsonrpc)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Entrer le mot de passe RPC Aria2 (laisser vide si l\'authentification n\'est pas activée)', "SSL/TLS encryption": "Chiffrage SSL/TLS",
'Enter base URL (optional)': 'Entrez l\'URL de base', "Enable SSL/TLS encryption": "Activer le chiffrage SSL/TLS",
'Direct Download': 'Téléchargement direct', "Enter the secret token (optional)": "Entrer le token secret (optionnel)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'S\'ils sont fournis, les liens seront créés pour activer le téléchargement direct depuis le serveur Aria2', "Entrer le token secret pour le RPC Aria2 (laisser vide si l'authentification n'est pas activée)",
'(Requires appropriate webserver to be configured.)': '(Nécessite un serveur web approprié pour être configuré)', "Enter the username (optional)": "Entrer le nom d'utilisateur (optionnel)",
'Save Connection configuration': 'Sauvegarder la configuration de connexion', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Filter': 'Filtre', "Entrer le nom d'utilisateur RPC Aria2 (laisser vide si l'authentification n'est pas activée)",
// server info modal "Enter the password (optional)": "Entrer le mot de passe (optionnel)",
'Aria2 server info': 'Infos serveur Aria2', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 Version': 'Version Aria2', "Entrer le mot de passe RPC Aria2 (laisser vide si l'authentification n'est pas activée)",
'Features Enabled': 'Fonctionnalités activées', "Enter base URL (optional)": "Entrez l'URL de base",
// about modal "Direct Download": "Téléchargement direct",
'To download the latest version of the project, add issues or to contribute back, head on to': "If supplied, links will be created to enable direct download from the Aria2 server.":
'Pour télécharger la dernière version du projet, signaler des problèmes ou pour contribuer, aller à l\'adresse', "S'ils sont fournis, les liens seront créés pour activer le téléchargement direct depuis le serveur Aria2",
'Or you can open the latest version in the browser through': 'Ou vous pouvez ouvrir la dernière version dans le navigateur depuis', "(Requires appropriate webserver to be configured.)":
'Close': 'Fermer', "(Nécessite un serveur web approprié pour être configuré)",
// lables "Save Connection configuration": "Sauvegarder la configuration de connexion",
'Download status':'Statut de téléchargement', Filter: "Filtre",
'Download Speed':'Vitesse de téléchargement', // server info modal
'Upload Speed':'Vitesse d\'envoi', "Aria2 server info": "Infos serveur Aria2",
'Estimated time':'Temps estimé', "Aria2 Version": "Version Aria2",
'Download Size':'Taille du téléchargement', "Features Enabled": "Fonctionnalités activées",
'Downloaded':'Téléchargé', // about modal
'Progress':'Avancement', "To download the latest version of the project, add issues or to contribute back, head on to":
'Download Path':'Chemin de téléchargement', "Pour télécharger la dernière version du projet, signaler des problèmes ou pour contribuer, aller à l'adresse",
'Uploaded':'Envoyé', "Or you can open the latest version in the browser through":
'Download GID':'GID du téléchargement', "Ou vous pouvez ouvrir la dernière version dans le navigateur depuis",
'Number of Pieces':'Nombre de pièces', Close: "Fermer",
'Piece Length':'Taille de la pièce', // lables
'Shutdown Server': 'Arrêter le serveur', "Download status": "Statut de téléchargement",
"Download Speed": "Vitesse de téléchargement",
"Upload Speed": "Vitesse d'envoi",
"Estimated time": "Temps estimé",
"Download Size": "Taille du téléchargement",
Downloaded: "Téléchargé",
Progress: "Avancement",
"Download Path": "Chemin de téléchargement",
Uploaded: "Envoyé",
"Download GID": "GID du téléchargement",
"Number of Pieces": "Nombre de pièces",
"Piece Length": "Taille de la pièce",
"Shutdown Server": "Arrêter le serveur",
'The last connection attempt was unsuccessful. Trying another configuration': 'La dernière tentative de connexion a échoué. Essai d\'une autre configuration', "The last connection attempt was unsuccessful. Trying another configuration":
'Oh Snap!': 'Oh non !', "La dernière tentative de connexion a échoué. Essai d'une autre configuration",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': 'Impossible de se connecter au serveur RPC d\'aria2. Nouvel essai dans 10 secondes. Vous voudrez peut-être vérifier les paramètres de connexion en allant dans Paramètres > Paramètres de connexion', "Oh Snap!": "Oh non !",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': 'Erreur d\'authentification lors de la connexion au serveur RPC d\'aria2. Nouvel essai dans 10 secondes. Vous voudrez peut-être confirmer les renseignements d\'authentification en allant dans Paramètres > Paramètres de connexion', "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Successfully connected to Aria2 through its remote RPC …': 'Connexion réussie à aria2 via son interface RPC …', "Impossible de se connecter au serveur RPC d'aria2. Nouvel essai dans 10 secondes. Vous voudrez peut-être vérifier les paramètres de connexion en allant dans Paramètres > Paramètres de connexion",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': 'Connexion réussie à aria2 via l\'interface RPC, cependant la connexion n\'est toujours pas sécurisée. Pour une sécurité complète, essayez d\'ajouter un token secret d\'autorisation en lançant aria2 (à l\'aide de l\'option --rpc-secret)', "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'Trying to connect to aria2 using the new connection configuration': 'Tentative de connexion à aria2 avec la nouvelle configuration', "Erreur d'authentification lors de la connexion au serveur RPC d'aria2. Nouvel essai dans 10 secondes. Vous voudrez peut-être confirmer les renseignements d'authentification en allant dans Paramètres > Paramètres de connexion",
'Remove {{name}} and associated meta-data?': 'Supprimer {{name}} et les métadonnées associées' "Successfully connected to Aria2 through its remote RPC …":
"Connexion réussie à aria2 via son interface RPC …",
"Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
"Connexion réussie à aria2 via l'interface RPC, cependant la connexion n'est toujours pas sécurisée. Pour une sécurité complète, essayez d'ajouter un token secret d'autorisation en lançant aria2 (à l'aide de l'option --rpc-secret)",
"Trying to connect to aria2 using the new connection configuration":
"Tentative de connexion à aria2 avec la nouvelle configuration",
"Remove {{name}} and associated meta-data?": "Supprimer {{name}} et les métadonnées associées"
}; };

View File

@ -1,154 +1,166 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.id_ID = { // replace en_US to ll_CC, examples: zh_CN, de_AT. translations.id_ID = {
// header // replace en_US to ll_CC, examples: zh_CN, de_AT.
'Search': 'Telusuri', // header
// Nav menu Search: "Telusuri",
'Add': 'Tambah', // Nav menu
'By URIs': 'Dari URI', Add: "Tambah",
'By Torrents': 'Dari Torrent', "By URIs": "Dari URI",
'By Metalinks': 'Dari Metalink', "By Torrents": "Dari Torrent",
'Manage': 'Kelola', "By Metalinks": "Dari Metalink",
'Pause All': 'Jeda Semua', Manage: "Kelola",
'Resume Paused': 'Lanjut yang Dijeda', "Pause All": "Jeda Semua",
'Purge Completed': 'Hapus yang Terunduh', "Resume Paused": "Lanjut yang Dijeda",
'Shutdown Server': 'Matikan Peladen', "Purge Completed": "Hapus yang Terunduh",
'Settings': 'Pengaturan', "Shutdown Server": "Matikan Peladen",
'Connection Settings': 'Pengaturan Koneksi', Settings: "Pengaturan",
'Global Settings': 'Pengaturan Global', "Connection Settings": "Pengaturan Koneksi",
'Server info': 'Info peladen', "Global Settings": "Pengaturan Global",
'About and contribute': 'Tentang dan kontribusi', "Server info": "Info peladen",
'Toggle navigation': 'Alihkan navigasi', "About and contribute": "Tentang dan kontribusi",
// body "Toggle navigation": "Alihkan navigasi",
// nav side bar // body
'Miscellaneous': 'Lain-lain', // nav side bar
'Global Statistics': 'Statistik Global', Miscellaneous: "Lain-lain",
'About': 'Tentang', "Global Statistics": "Statistik Global",
'Displaying': 'Tampilan', About: "Tentang",
'of': 'dari', Displaying: "Tampilan",
'downloads': 'unduhan', of: "dari",
'Language': 'Bahasa', downloads: "unduhan",
// download filters Language: "Bahasa",
'Download Filters': 'Saring Unduhan', // download filters
'Running': 'Berjalan', "Download Filters": "Saring Unduhan",
'Active': 'Aktif', Running: "Berjalan",
'Waiting': 'Menunggu', Active: "Aktif",
'Complete': 'Selesai', Waiting: "Menunggu",
'Error': 'Galat', Complete: "Selesai",
'Paused': 'Dijeda', Error: "Galat",
'Removed': 'Dihapus', Paused: "Dijeda",
'Hide linked meta-data': 'Sembunyikan tautan meta-data', Removed: "Dihapus",
'Toggle': 'Tombol alihan', "Hide linked meta-data": "Sembunyikan tautan meta-data",
'Reset filters': 'Reset penyaring', Toggle: "Tombol alihan",
// download status "Reset filters": "Reset penyaring",
'Verifing': 'Memverifikasi', // download status
'Verify Pending': 'Verifikasi Ditunda', Verifing: "Memverifikasi",
// starred properties "Verify Pending": "Verifikasi Ditunda",
'Quick Access Settings': 'Pengaturan Akses Cepat', // starred properties
'Save': 'Simpan', "Quick Access Settings": "Pengaturan Akses Cepat",
'Save settings': 'Simpan pengaturan', Save: "Simpan",
'Currently no download in line to display, use the': 'Sekarang tak ada unduhan yang ditampilkan, gunakan', "Save settings": "Simpan pengaturan",
'download button to start downloading files!': 'tombol unduh untuk mulai mengunduh berkas!', "Currently no download in line to display, use the":
'Peers': 'Peer', "Sekarang tak ada unduhan yang ditampilkan, gunakan",
'More Info': 'Info Lengkap', "download button to start downloading files!": "tombol unduh untuk mulai mengunduh berkas!",
'Remove': 'Hapus', Peers: "Peer",
'# of': '# dari', "More Info": "Info Lengkap",
'Length': 'Ukuran', Remove: "Hapus",
// modals "# of": "# dari",
'Add Downloads By URIs': 'Unduh dari URI', Length: "Ukuran",
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': // modals
'- Anda dapat menambah banyak unduhan (berkas) sekali waktu dg menaruh URI setiap berkas dlm baris terpisah.', "Add Downloads By URIs": "Unduh dari URI",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- Anda juga dapat menambah banyak URI (cermin) untuk berkas yang *sama*. Pisahkan URI dengan spasi.', "- Anda dapat menambah banyak unduhan (berkas) sekali waktu dg menaruh URI setiap berkas dlm baris terpisah.",
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- URI dapat berbentuk HTTP(S)/FTP/BitTorrent-Magnet.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'Download settings': 'Pengaturan unduhan', "- Anda juga dapat menambah banyak URI (cermin) untuk berkas yang *sama*. Pisahkan URI dengan spasi.",
'Advanced settings': 'Pengaturan mahir', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Cancel': 'Batal', "- URI dapat berbentuk HTTP(S)/FTP/BitTorrent-Magnet.",
'Start': 'Mulai', "Download settings": "Pengaturan unduhan",
'Choose': 'Pilih', "Advanced settings": "Pengaturan mahir",
'Quick Access (shown on the main page)': 'Akses Cepat (terlihat di laman utama)', Cancel: "Batal",
// add torrent modal Start: "Mulai",
'Add Downloads By Torrents': 'Unduh dari Torrent', Choose: "Pilih",
'- Select the torrent from the local filesystem to start the download.': '- Pilih torrent dari sistem berkas lokal untuk mulai mengunduh.', "Quick Access (shown on the main page)": "Akses Cepat (terlihat di laman utama)",
'- You can select multiple torrents to start multiple downloads.': 'Anda dapat memilih banyak torrent untuk memulai multi unduh.', // add torrent modal
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': 'Untuk menambah BitTorrent-Magnet URL, pakai opsi Tambah dari URI dan tambahkan di situ.', "Add Downloads By Torrents": "Unduh dari Torrent",
'Select Torrents': 'Pilih Torrent', "- Select the torrent from the local filesystem to start the download.":
'Select a Torrent': 'Pilih Torrent', "- Pilih torrent dari sistem berkas lokal untuk mulai mengunduh.",
// add metalink modal "- You can select multiple torrents to start multiple downloads.":
'Add Downloads By Metalinks': 'Unduh dari Metalink', "Anda dapat memilih banyak torrent untuk memulai multi unduh.",
'Select Metalinks': 'Pilih Metalink', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'- Select the Metalink from the local filesystem to start the download.': '- Pilih Metalink dari sistem berkas lokal untuk mulai mengunduh.', "Untuk menambah BitTorrent-Magnet URL, pakai opsi Tambah dari URI dan tambahkan di situ.",
'- You can select multiple Metalinks to start multiple downloads.': '- Anda dapat memilih banyak Metalink untuk mulai multi unduh.', "Select Torrents": "Pilih Torrent",
'Select a Metalink': 'Pilih Metalink', "Select a Torrent": "Pilih Torrent",
// select file modal // add metalink modal
'Choose files to start download for': 'Pilih berkas untuk mulai mengunduh', "Add Downloads By Metalinks": "Unduh dari Metalink",
'Select to download': 'Pilih untuk mengunduh', "Select Metalinks": "Pilih Metalink",
// settings modal "- Select the Metalink from the local filesystem to start the download.":
'Aria2 RPC host and port': 'Port dan host RPC Aria2', "- Pilih Metalink dari sistem berkas lokal untuk mulai mengunduh.",
'Enter the host': 'Masukkan host', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "- Anda dapat memilih banyak Metalink untuk mulai multi unduh.",
'Masukkan IP atau nama DNS peladen tempat RPC Aria2 berjalan (asali: localhost)', "Select a Metalink": "Pilih Metalink",
'Enter the port': 'Masukkan porta', // select file modal
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Choose files to start download for": "Pilih berkas untuk mulai mengunduh",
'Masukkan porta peladen tempat RPC Aria2 berjalan (asali: 6800)', "Select to download": "Pilih untuk mengunduh",
'Enter the RPC path': 'Masukkan path RPC', // settings modal
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Masukkan path untuk endpoint RPC Aria2 (asali: /jsonrpc)', "Aria2 RPC host and port": "Port dan host RPC Aria2",
'SSL/TLS encryption': 'Enkripsi SSL/TLS', "Enter the host": "Masukkan host",
'Enable SSL/TLS encryption': 'Aktifkan enkripsi SSL/TLS', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the secret token (optional)': 'Masukkan token rahasia (opsional)', "Masukkan IP atau nama DNS peladen tempat RPC Aria2 berjalan (asali: localhost)",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port": "Masukkan porta",
'Masukkan token rahasia RPC Aria2 (kosongkan jika otentifikasi tidak aktif)', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the username (optional)': 'Masukkan username (opsional)', "Masukkan porta peladen tempat RPC Aria2 berjalan (asali: 6800)",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the RPC path": "Masukkan path RPC",
'Masukkan username RPC Aria2 (kosongkan jika otentifikasi tidak aktif)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the password (optional)': 'Masukkan kata sandi (opsional)', "Masukkan path untuk endpoint RPC Aria2 (asali: /jsonrpc)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Masukkan kata sandi RPC Aria2 (kosongkan jika otentifikasi tidak aktif)', "SSL/TLS encryption": "Enkripsi SSL/TLS",
'Enter base URL (optional)': 'Masukkan URL dasar (opsional)', "Enable SSL/TLS encryption": "Aktifkan enkripsi SSL/TLS",
'Direct Download': 'Unduh Langsung', "Enter the secret token (optional)": "Masukkan token rahasia (opsional)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Jika tersedia, tautan akan dibuat untuk mengaktifkan unduhan langsung dari peladen Aria2.', "Masukkan token rahasia RPC Aria2 (kosongkan jika otentifikasi tidak aktif)",
'(Requires appropriate webserver to be configured.)': '(Mewajibkan webserver yang perlu dikonfigurasi)', "Enter the username (optional)": "Masukkan username (opsional)",
'Save Connection configuration': 'Simpan konfigurasi Koneksi', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Filter': 'Saring', "Masukkan username RPC Aria2 (kosongkan jika otentifikasi tidak aktif)",
// server info modal "Enter the password (optional)": "Masukkan kata sandi (opsional)",
'Aria2 server info': 'Info peladen Aria2', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 Version': 'Versi Aria2', "Masukkan kata sandi RPC Aria2 (kosongkan jika otentifikasi tidak aktif)",
'Features Enabled': 'Fitur yang Aktif', "Enter base URL (optional)": "Masukkan URL dasar (opsional)",
// about modal "Direct Download": "Unduh Langsung",
'To download the latest version of the project, add issues or to contribute back, head on to': "If supplied, links will be created to enable direct download from the Aria2 server.":
'Untuk mengunduh versi terkini proyek, tambahkan isu atau kontribusi balik ke', "Jika tersedia, tautan akan dibuat untuk mengaktifkan unduhan langsung dari peladen Aria2.",
'Or you can open the latest version in the browser through': 'Atau Anda dapat membuka versi terkini via peramban lewat', "(Requires appropriate webserver to be configured.)":
'Close': 'Tutup', "(Mewajibkan webserver yang perlu dikonfigurasi)",
// labels "Save Connection configuration": "Simpan konfigurasi Koneksi",
'Download status':'Status unduh', Filter: "Saring",
'Download Speed':'Kecepatan unduh', // server info modal
'Upload Speed':'Kecepatan unggah', "Aria2 server info": "Info peladen Aria2",
'Estimated time':'Waktu estimasi', "Aria2 Version": "Versi Aria2",
'Download Size':'Ukuran unduh', "Features Enabled": "Fitur yang Aktif",
'Downloaded':'Terunduh', // about modal
'Progress':'Proses', "To download the latest version of the project, add issues or to contribute back, head on to":
'Download Path':'Path unduh', "Untuk mengunduh versi terkini proyek, tambahkan isu atau kontribusi balik ke",
'Uploaded':'Terunggah', "Or you can open the latest version in the browser through":
'Download GID':'GID unduh', "Atau Anda dapat membuka versi terkini via peramban lewat",
'Number of Pieces':'Jumlah Bagian', Close: "Tutup",
'Piece Length':'Ukuran Bagian', // labels
"Download status": "Status unduh",
"Download Speed": "Kecepatan unduh",
"Upload Speed": "Kecepatan unggah",
"Estimated time": "Waktu estimasi",
"Download Size": "Ukuran unduh",
Downloaded: "Terunduh",
Progress: "Proses",
"Download Path": "Path unduh",
Uploaded: "Terunggah",
"Download GID": "GID unduh",
"Number of Pieces": "Jumlah Bagian",
"Piece Length": "Ukuran Bagian",
//alerts //alerts
'The last connection attempt was unsuccessful. Trying another configuration': "The last connection attempt was unsuccessful. Trying another configuration":
'Usaha koneksi terakhir gagal. Coba konfigurasi lain', "Usaha koneksi terakhir gagal. Coba konfigurasi lain",
'Oh Snap!': 'Oh Sial!', "Oh Snap!": "Oh Sial!",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Tak dapat terkoneksi ke peladen RPC aria2. Akan diulang dalam 10 detik. Anda mungkin ingin menguji pengaturan koneksi melalui Pengaturan > Pengaturan Koneksi', "Tak dapat terkoneksi ke peladen RPC aria2. Akan diulang dalam 10 detik. Anda mungkin ingin menguji pengaturan koneksi melalui Pengaturan > Pengaturan Koneksi",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'Otentifikasi gagal saat membuka koneksi ke peladen RPC Aria2. Akan diulang dalam 10 detik. Anda mungkin ingin mengonfirmasi detail otentifikasi di Pengaturan > Pengaturan Koneksi', "Otentifikasi gagal saat membuka koneksi ke peladen RPC Aria2. Akan diulang dalam 10 detik. Anda mungkin ingin mengonfirmasi detail otentifikasi di Pengaturan > Pengaturan Koneksi",
'Successfully connected to Aria2 through its remote RPC …': "Successfully connected to Aria2 through its remote RPC …":
'Sukses terkoneksi ke Aria2 melalui remot RPC …', "Sukses terkoneksi ke Aria2 melalui remot RPC …",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
'Sukses terkoneksi ke Aria2 melalui remot RPC, bagaimanapun koneksi masih tidak aman. Untuk melengkapi keamanan coba tambahkan token rahasia otorisasi saat memulai Aria2 (lewat flag --rpc-secret)', "Sukses terkoneksi ke Aria2 melalui remot RPC, bagaimanapun koneksi masih tidak aman. Untuk melengkapi keamanan coba tambahkan token rahasia otorisasi saat memulai Aria2 (lewat flag --rpc-secret)",
'Trying to connect to aria2 using the new connection configuration': "Trying to connect to aria2 using the new connection configuration":
'Mencoba koneksi ke aria2 menggunakan konfigurasi koneksi baru', "Mencoba koneksi ke aria2 menggunakan konfigurasi koneksi baru",
'Remove {{name}} and associated meta-data?': // {{name}} refers to the download name, do not modify. // {{name}} refers to the download name, do not modify.
'Hapus {{name}} dan meta-data yang berhubungan?' "Remove {{name}} and associated meta-data?": "Hapus {{name}} dan meta-data yang berhubungan?"
}; };

View File

@ -1,140 +1,156 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.it_IT = { translations.it_IT = {
// header // header
'Search': 'Cerca', Search: "Cerca",
// Nav menu // Nav menu
'Add': 'Aggiungi', Add: "Aggiungi",
'By URIs': 'Da URIs', "By URIs": "Da URIs",
'By Torrents': 'Da Torrent', "By Torrents": "Da Torrent",
'By Metalinks': 'Da Metalink', "By Metalinks": "Da Metalink",
'Manage': 'Gestione', Manage: "Gestione",
'Pause All': 'Ferma tutto', "Pause All": "Ferma tutto",
'Resume Paused': 'Riprendi fermati', "Resume Paused": "Riprendi fermati",
'Purge Completed': 'Togli i completi', "Purge Completed": "Togli i completi",
'Settings': 'Impostazioni', Settings: "Impostazioni",
'Connection Settings': 'Impostazioni di connessione', "Connection Settings": "Impostazioni di connessione",
'Global Settings': 'Impostazioni globali', "Global Settings": "Impostazioni globali",
'Server info': 'Informazioni sul server', "Server info": "Informazioni sul server",
'About and contribute': 'Crediti e informazioni', "About and contribute": "Crediti e informazioni",
'Toggle navigation': 'Cambia navigazione', "Toggle navigation": "Cambia navigazione",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Varie', Miscellaneous: "Varie",
'Global Statistics': 'Statistiche globali', "Global Statistics": "Statistiche globali",
'About': 'Info', About: "Info",
'Displaying': 'Mostra', Displaying: "Mostra",
'of': 'di', of: "di",
'downloads': 'downloads', downloads: "downloads",
'Language': 'Lingua', Language: "Lingua",
// download filters // download filters
'Download Filters': 'Filtri download', "Download Filters": "Filtri download",
'Running': 'In corso', Running: "In corso",
'Active': 'Attivi', Active: "Attivi",
'Waiting': 'In attesa', Waiting: "In attesa",
'Complete': 'Completi', Complete: "Completi",
'Error': 'Errore', Error: "Errore",
'Paused': 'In pausa', Paused: "In pausa",
'Removed': 'Rimossi', Removed: "Rimossi",
'Hide linked meta-data': 'Nascondi i meta-data collegati', "Hide linked meta-data": "Nascondi i meta-data collegati",
'Toggle': 'Cambia', Toggle: "Cambia",
'Reset filters': 'Reimposta filtri', "Reset filters": "Reimposta filtri",
// starred properties // starred properties
'Quick Access Settings': 'Accesso rapido', "Quick Access Settings": "Accesso rapido",
'Save settings': 'Salva impostazioni', "Save settings": "Salva impostazioni",
'Currently no download in line to display, use the': 'Attualmente non c\'è nessun download da mostrare, usa il pulsante ', "Currently no download in line to display, use the":
'download button to start downloading files!': 'dowload per cominciare a scaricare!', "Attualmente non c'è nessun download da mostrare, usa il pulsante ",
'Peers': 'Peers', "download button to start downloading files!": "dowload per cominciare a scaricare!",
'More Info': 'Altre informazioni', Peers: "Peers",
'Remove': 'Rimuovi', "More Info": "Altre informazioni",
'# of': '# di', Remove: "Rimuovi",
'Length': 'Lunghezza', "# of": "# di",
// modals Length: "Lunghezza",
'Add Downloads By URIs': 'Aggiungi Downloads da URIs', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "Aggiungi Downloads da URIs",
'- Puoi aggungere più download(files) allo stesso tempo mettendo un\'URI per riga.', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- Puoi aggungere più download(files) allo stesso tempo mettendo un'URI per riga.",
'- Puoi anche aggiungere più URI di download(mirror) per uno *stesso* file separando i vari mirror da uno spazio.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- Un URI può essere un indirizzo HTTP(S)/FTP o un BitTorrent Magnet link.', "- Puoi anche aggiungere più URI di download(mirror) per uno *stesso* file separando i vari mirror da uno spazio.",
'Download settings': 'Impostazioni download', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Advanced settings': 'Impostazioni avanzate', "- Un URI può essere un indirizzo HTTP(S)/FTP o un BitTorrent Magnet link.",
'Cancel': 'Cancella', "Download settings": "Impostazioni download",
'Start': 'Aggiungi', "Advanced settings": "Impostazioni avanzate",
'Choose': 'Scegli', Cancel: "Cancella",
'Quick Access (shown on the main page)': 'Accesso rapido (mostrato nella pagina principale)', Start: "Aggiungi",
// add torrent modal Choose: "Scegli",
'Add Downloads By Torrents': 'Aggiungi Torrent', "Quick Access (shown on the main page)": "Accesso rapido (mostrato nella pagina principale)",
'- Select the torrent from the local filesystem to start the download.': '- Seleziona il file torrent dal tuo computer per iniziare a scaricare.', // add torrent modal
'- You can select multiple torrents to start multiple downloads.': '- Puoi aggiungere anche più file contemporaneamente per iniziare più dowload insieme.', "Add Downloads By Torrents": "Aggiungi Torrent",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- Per aggiungere un Magnet Link BitTorrent utilizza l\'opzione Aggiungi da URI.', "- Select the torrent from the local filesystem to start the download.":
'Select Torrents': 'Seleziona Torrents', "- Seleziona il file torrent dal tuo computer per iniziare a scaricare.",
'Select a Torrent': 'Seleziona un Torrent', "- You can select multiple torrents to start multiple downloads.":
// add metalink modal "- Puoi aggiungere anche più file contemporaneamente per iniziare più dowload insieme.",
'Add Downloads By Metalinks': 'Aggiungi Torrent da Metalink', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'Select Metalinks': 'Seleziona Metalink', "- Per aggiungere un Magnet Link BitTorrent utilizza l'opzione Aggiungi da URI.",
'- Select the Metalink from the local filesystem to start the download.': '- Seleziona un Metalink dal tuo computer per iniziare il download.', "Select Torrents": "Seleziona Torrents",
'- You can select multiple Metalinks to start multiple downloads.': '- Puoi iniziare anche più download selezionando più Metalink.', "Select a Torrent": "Seleziona un Torrent",
'Select a Metalink': 'Seleziona un Metalink', // add metalink modal
// select file modal "Add Downloads By Metalinks": "Aggiungi Torrent da Metalink",
'Choose files to start download for': 'Scegli i file da scaricare', "Select Metalinks": "Seleziona Metalink",
'Select to download': 'Seleziona per scaricare', "- Select the Metalink from the local filesystem to start the download.":
// settings modal "- Seleziona un Metalink dal tuo computer per iniziare il download.",
'Aria2 RPC host and port': 'Host e porta del server RPC di Aria2', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the host': 'Inserisci l\'host', "- Puoi iniziare anche più download selezionando più Metalink.",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Select a Metalink": "Seleziona un Metalink",
'Inserisci l\'IP o il nome DNS del server dov\'è in esecuzione l\'RPC per Aria2 (default: localhost)', // select file modal
'Enter the port': 'Inserisci la porta', "Choose files to start download for": "Scegli i file da scaricare",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Select to download": "Seleziona per scaricare",
'Inserisci la porta del server dov\'è in esecuzione l\'RPC per Aria2 (default: 6800)', // settings modal
'Enter the RPC path': 'Inserisci la path RPC', "Aria2 RPC host and port": "Host e porta del server RPC di Aria2",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Inserisci la path per l\'endpoint RPC di Aria2 (default: /jsonrpc)', "Enter the host": "Inserisci l'host",
'SSL/TLS encryption': 'Cifratura SSL/TLS', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enable SSL/TLS encryption': 'Abilita la cifratura SSL/TLS', "Inserisci l'IP o il nome DNS del server dov'è in esecuzione l'RPC per Aria2 (default: localhost)",
'Enter the secret token (optional)': 'Inserisci il token segreto (opzionale)', "Enter the port": "Inserisci la porta",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Inserisci il token segreto per Aria2 (lascia vuoto se non è abilitato)', "Inserisci la porta del server dov'è in esecuzione l'RPC per Aria2 (default: 6800)",
'Enter the username (optional)': 'Inserisci l\'username (opzionale)', "Enter the RPC path": "Inserisci la path RPC",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Inserisci l\'username per l\'RPC di Aria2 (lascia vuoto se non è abilitato)', "Inserisci la path per l'endpoint RPC di Aria2 (default: /jsonrpc)",
'Enter the password (optional)': 'Inserisci la password (opzionale)', "SSL/TLS encryption": "Cifratura SSL/TLS",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Inserisci la password per l\'RPC di Aria2 (vuota se l\'autenticazione non è abilitata)', "Enable SSL/TLS encryption": "Abilita la cifratura SSL/TLS",
'Enter base URL (optional)': 'Inserisci l\'URL di base(opzionale)', "Enter the secret token (optional)": "Inserisci il token segreto (opzionale)",
'Direct Download': 'Downaload diretto', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'If supplied, links will be created to enable direct download from the Aria2 server.': "Inserisci il token segreto per Aria2 (lascia vuoto se non è abilitato)",
'Se inserito, verrano creati dei link per scaricare direttamente i file dal server Aria2.', "Enter the username (optional)": "Inserisci l'username (opzionale)",
'(Requires appropriate webserver to be configured.)': '(Richiede un webserver correttamente configurato)', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Save Connection configuration': 'Salva la configurazione di connessione', "Inserisci l'username per l'RPC di Aria2 (lascia vuoto se non è abilitato)",
'Filter': 'Filtro', "Enter the password (optional)": "Inserisci la password (opzionale)",
// server info modal "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 server info': 'Informazioni sul server Aria2', "Inserisci la password per l'RPC di Aria2 (vuota se l'autenticazione non è abilitata)",
'Aria2 Version': 'Versione di Aria2', "Enter base URL (optional)": "Inserisci l'URL di base(opzionale)",
'Features Enabled': 'Funzionalità abilitate', "Direct Download": "Downaload diretto",
// about modal "If supplied, links will be created to enable direct download from the Aria2 server.":
'To download the latest version of the project, add issues or to contribute back, head on to': "Se inserito, verrano creati dei link per scaricare direttamente i file dal server Aria2.",
'Per scaricare l\'ultima versione del progetto, aggiungere problemi o contribuire, visita ', "(Requires appropriate webserver to be configured.)":
'Or you can open the latest version in the browser through': 'Oppure puoi aprire l\'ultima versione direttamente nel browser', "(Richiede un webserver correttamente configurato)",
'Close': 'Chiudi', "Save Connection configuration": "Salva la configurazione di connessione",
// lables Filter: "Filtro",
'Download status':'Stato download', // server info modal
'Download Speed':'Velocità download', "Aria2 server info": "Informazioni sul server Aria2",
'Upload Speed':'Velocità upload', "Aria2 Version": "Versione di Aria2",
'Estimated time':'Tempo stimato', "Features Enabled": "Funzionalità abilitate",
'Download Size':'Dimensione del download', // about modal
'Downloaded':'Scaricato', "To download the latest version of the project, add issues or to contribute back, head on to":
'Progress':'Progresso', "Per scaricare l'ultima versione del progetto, aggiungere problemi o contribuire, visita ",
'Download Path':'Percorso di download', "Or you can open the latest version in the browser through":
'Uploaded':'Caricato', "Oppure puoi aprire l'ultima versione direttamente nel browser",
'Download GID':'GID Download', Close: "Chiudi",
'Number of Pieces':'Numero di segmenti', // lables
'Piece Length': 'Lunghezza segmenti', "Download status": "Stato download",
'Shutdown Server': 'Spegni Server', "Download Speed": "Velocità download",
"Upload Speed": "Velocità upload",
"Estimated time": "Tempo stimato",
"Download Size": "Dimensione del download",
Downloaded: "Scaricato",
Progress: "Progresso",
"Download Path": "Percorso di download",
Uploaded: "Caricato",
"Download GID": "GID Download",
"Number of Pieces": "Numero di segmenti",
"Piece Length": "Lunghezza segmenti",
"Shutdown Server": "Spegni Server",
'The last connection attempt was unsuccessful. Trying another configuration': 'L\'ultimo tentativo di connessione non è riuscito. Provo un\'altra connessione', "The last connection attempt was unsuccessful. Trying another configuration":
'Oh Snap!': 'Mannaggia!', "L'ultimo tentativo di connessione non è riuscito. Provo un'altra connessione",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': 'Non riesco a connettermi al server RPC di Aria2. Riprovo tra 10 secondi. Forse vuoi controllare le impostazioni di connessione in Impostazioni > Impostazioni di connessione', "Oh Snap!": "Mannaggia!",
'Successfully connected to Aria2 through its remote RPC …': 'Connesso con successo a Aria2 mediante RPC remoto …', "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': 'Correttamente connesso al server Aria2 mediante RPC, ma in modo non sicuro. Per una completa sicurezza prova ad aggiungere un token di autorizzazione segreto all\'avvio di Aria2 (mediante il flag --rpc-secret)', "Non riesco a connettermi al server RPC di Aria2. Riprovo tra 10 secondi. Forse vuoi controllare le impostazioni di connessione in Impostazioni > Impostazioni di connessione",
'Trying to connect to aria2 using the new connection configuration': 'Provo a connettermi a Aria2 attraverso le nuove impostazioni', "Successfully connected to Aria2 through its remote RPC …":
"Connesso con successo a Aria2 mediante RPC remoto …",
"Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
"Correttamente connesso al server Aria2 mediante RPC, ma in modo non sicuro. Per una completa sicurezza prova ad aggiungere un token di autorizzazione segreto all'avvio di Aria2 (mediante il flag --rpc-secret)",
"Trying to connect to aria2 using the new connection configuration":
"Provo a connettermi a Aria2 attraverso le nuove impostazioni"
}; };

View File

@ -1,119 +1,130 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.nl_NL = { translations.nl_NL = {
// header // header
'Search': 'Zoeken', Search: "Zoeken",
// Nav menu // Nav menu
'Add': 'Toevoegen', Add: "Toevoegen",
'By URIs': 'met URI', "By URIs": "met URI",
'By Torrents': 'met Torrents', "By Torrents": "met Torrents",
'By Metalinks': 'met Metalinks', "By Metalinks": "met Metalinks",
'Manage': 'Beheren', Manage: "Beheren",
'Pause All': 'Alles pauzeren', "Pause All": "Alles pauzeren",
'Resume Paused': 'Hervatten', "Resume Paused": "Hervatten",
'Purge Completed': 'Verwijder de voleindigden', "Purge Completed": "Verwijder de voleindigden",
'Settings': 'Instellingen', Settings: "Instellingen",
'Connection Settings': 'Verbindingsinstellingen', "Connection Settings": "Verbindingsinstellingen",
'Global Settings': 'Globale instellingen', "Global Settings": "Globale instellingen",
'Server info': 'Informatie over de server', "Server info": "Informatie over de server",
'About and contribute': 'Over het project en bijdragen', "About and contribute": "Over het project en bijdragen",
'Toggle navigation': 'Navigatie omschakelen', "Toggle navigation": "Navigatie omschakelen",
'Language': 'Taal', Language: "Taal",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Overig', Miscellaneous: "Overig",
'Global Statistics': 'Globale statistieken', "Global Statistics": "Globale statistieken",
'About': 'Over het project', About: "Over het project",
'Displaying': ' ', // empty because of grammar in the following 2 elements Displaying: " ", // empty because of grammar in the following 2 elements
'of': 'van', of: "van",
'downloads': 'downloads weergegeven', downloads: "downloads weergegeven",
// download filters // download filters
'Download Filters': 'Download filters', "Download Filters": "Download filters",
'Running': 'Bezig', Running: "Bezig",
'Active': 'Actief', Active: "Actief",
'Waiting': 'Wachtend', Waiting: "Wachtend",
'Complete': 'Voleindigd', Complete: "Voleindigd",
'Error': 'Foutief', Error: "Foutief",
'Paused': 'Gepauzeerd', Paused: "Gepauzeerd",
'Removed': 'Verwijderd', Removed: "Verwijderd",
'Hide linked meta-data': 'Gekoppelde metadata verbergen', "Hide linked meta-data": "Gekoppelde metadata verbergen",
'Toggle': 'Omschakelen', Toggle: "Omschakelen",
'Reset filters': 'Filters terugzetten', "Reset filters": "Filters terugzetten",
// starred properties // starred properties
'Quick Access Settings': 'Snelle-toegang instellingen', "Quick Access Settings": "Snelle-toegang instellingen",
'Save settings': 'Instellingen opslaan', "Save settings": "Instellingen opslaan",
'Currently no download in line to display, use the': 'Momenteel geen downloads weer te geven, gebruik de ', "Currently no download in line to display, use the":
'download button to start downloading files!': 'knop om bestanden te gaan downloaden!', "Momenteel geen downloads weer te geven, gebruik de ",
'Peers': 'Peers', "download button to start downloading files!": "knop om bestanden te gaan downloaden!",
'More Info': 'Meer informatie', Peers: "Peers",
'Remove': 'Verwijderen', "More Info": "Meer informatie",
'# of': 'Aantal', Remove: "Verwijderen",
'Length': 'Lengte', "# of": "Aantal",
// modals Length: "Lengte",
'Add Downloads By URIs': 'Downloads toevoegen met URI', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "Downloads toevoegen met URI",
'- Je kunt meerdere downloads (bestanden) tezelfdertijd toevoegen door de URIs voor elk bestand op een aparte regel te zetten.', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- Je kunt meerdere downloads (bestanden) tezelfdertijd toevoegen door de URIs voor elk bestand op een aparte regel te zetten.",
'- Je kunt ook meerdere URIs (mirrors) voor *hetzelfde* bestand toevoegen. Scheidt hiervoor de URIs met een spatie.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- Een URI kan HTTP(S)/FTP/BitTorrent-Magnet zijn.', "- Je kunt ook meerdere URIs (mirrors) voor *hetzelfde* bestand toevoegen. Scheidt hiervoor de URIs met een spatie.",
'Download settings': 'Download instellingen', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Advanced settings': 'Geavanceerde instellingen', "- Een URI kan HTTP(S)/FTP/BitTorrent-Magnet zijn.",
'Cancel': 'Annuleren', "Download settings": "Download instellingen",
'Start': 'Starten', "Advanced settings": "Geavanceerde instellingen",
'Choose': 'Kiezen', Cancel: "Annuleren",
'Quick Access (shown on the main page)': 'Snelle toegang (op de hoofdpagina)', Start: "Starten",
// add torrent modal Choose: "Kiezen",
'Add Downloads By Torrents': 'Downloads toevoegen met torrents', "Quick Access (shown on the main page)": "Snelle toegang (op de hoofdpagina)",
'- Select the torrent from the local filesystem to start the download.': '- Selecteer de torrent van het locale bestandssysteem om de download te starten.', // add torrent modal
'- You can select multiple torrents to start multiple downloads.': '- Je kunt meerdere torrents selecteren voor meerdere downloads.', "Add Downloads By Torrents": "Downloads toevoegen met torrents",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- Om een BitTorrent-Magnet URL toe te voegen, gebruik de Toevoegen met URI optie, en voeg het daar toe.', "- Select the torrent from the local filesystem to start the download.":
'Select Torrents': 'Selecteer torrents', "- Selecteer de torrent van het locale bestandssysteem om de download te starten.",
'Select a Torrent': 'Selecteer een torrent', "- You can select multiple torrents to start multiple downloads.":
// add metalink modal "- Je kunt meerdere torrents selecteren voor meerdere downloads.",
'Add Downloads By Metalinks': 'Download toevoegen met Metalinks', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'Select Metalinks': 'Selecteer Metalinks', "- Om een BitTorrent-Magnet URL toe te voegen, gebruik de Toevoegen met URI optie, en voeg het daar toe.",
'- Select the Metalink from the local filesystem to start the download.': '- Selecteer de Metalink van het locale bestandssysteem om de download te starten.', "Select Torrents": "Selecteer torrents",
'- You can select multiple Metalinks to start multiple downloads.': '- Selecter meerdere Metalinks om meerdere downloads te starten.', "Select a Torrent": "Selecteer een torrent",
'Select a Metalink': 'Selecteer een Metalink', // add metalink modal
// select file modal "Add Downloads By Metalinks": "Download toevoegen met Metalinks",
'Choose files to start download for': 'Bestanden kiezen waarvoor het downloaden beginnen moet', "Select Metalinks": "Selecteer Metalinks",
'Select to download': 'Selecteer om te downloaden', "- Select the Metalink from the local filesystem to start the download.":
// settings modal "- Selecteer de Metalink van het locale bestandssysteem om de download te starten.",
'Aria2 RPC host and port': 'Aria2 RPC server en poort', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the host': 'Server invoeren', "- Selecter meerdere Metalinks om meerdere downloads te starten.",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Select a Metalink": "Selecteer een Metalink",
'Voer de IP of DNS naam van de server waarop de RPC van Aria2 loopt (standaard: localhost)', // select file modal
'Enter the port': 'Poort invoeren', "Choose files to start download for": "Bestanden kiezen waarvoor het downloaden beginnen moet",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Select to download": "Selecteer om te downloaden",
'Invoeren van de serverpoort waarop de RPC van Aria2 loopt (standaard: 6800)', // settings modal
'Enter the RPC path': 'Invoeren van het RPC pad', "Aria2 RPC host and port": "Aria2 RPC server en poort",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Invoeren van het eindpunt van het Aria2 RPC pad (standaard: /jsonrpc)', "Enter the host": "Server invoeren",
'SSL/TLS encryption': 'SSL/TLS versleuteling', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enable SSL/TLS encryption': 'SSL/TLS versleuteling inschakelen', "Voer de IP of DNS naam van de server waarop de RPC van Aria2 loopt (standaard: localhost)",
'Enter the secret token (optional)': 'Invoeren van het wachtwoord (facultatief)', "Enter the port": "Poort invoeren",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Invoeren van het Aria2 RPC wachtwoord (niet invullen als authenticatie niet is ingeschakeld)', "Invoeren van de serverpoort waarop de RPC van Aria2 loopt (standaard: 6800)",
'Enter the username (optional)': 'Invoeren van de gebruikersnaam (facultatief)', "Enter the RPC path": "Invoeren van het RPC pad",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Invoeren van de Aria2 RPC gebruikersnaam (niet invullen als authenticatie niet is ingeschakeld)', "Invoeren van het eindpunt van het Aria2 RPC pad (standaard: /jsonrpc)",
'Enter the password (optional)': 'Invoeren van het wachtwoord (facultatief)', "SSL/TLS encryption": "SSL/TLS versleuteling",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Invoeren van het Aria2 RPC wachtwoord (niet invullen als authenticatie niet is ingeschakeld)', "Enable SSL/TLS encryption": "SSL/TLS versleuteling inschakelen",
'Enter base URL (optional)': 'Invoeren van de basis URL (facultatief)', "Enter the secret token (optional)": "Invoeren van het wachtwoord (facultatief)",
'Direct Download': 'Direct downloaden', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'If supplied, links will be created to enable direct download from the Aria2 server.': "Invoeren van het Aria2 RPC wachtwoord (niet invullen als authenticatie niet is ingeschakeld)",
'Als ingevoerd dan worden links aangemaakt die het direct downloaden van de Aria2 server toestaan.', "Enter the username (optional)": "Invoeren van de gebruikersnaam (facultatief)",
'(Requires appropriate webserver to be configurured.)': 'Hiervoor moet een geschikte webserver worden ingericht.)', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Save Connection configuration': 'Verbindingsconfiguratie opslaan', "Invoeren van de Aria2 RPC gebruikersnaam (niet invullen als authenticatie niet is ingeschakeld)",
'Filter': 'Filter', "Enter the password (optional)": "Invoeren van het wachtwoord (facultatief)",
// server info modal "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 server info': 'Aria2 server informatie', "Invoeren van het Aria2 RPC wachtwoord (niet invullen als authenticatie niet is ingeschakeld)",
'Aria2 Version': 'Aria2 versie', "Enter base URL (optional)": "Invoeren van de basis URL (facultatief)",
'Features Enabled': 'Geactiveerde kenmerken', "Direct Download": "Direct downloaden",
// about modal "If supplied, links will be created to enable direct download from the Aria2 server.":
'To download the latest version of the project, add issues or to contribute back, head on to': "Als ingevoerd dan worden links aangemaakt die het direct downloaden van de Aria2 server toestaan.",
'Om de nieuwste versie van het project te downloaden, problemen te rapporteren of bij te dragen, ga naar', "(Requires appropriate webserver to be configurured.)":
'Or you can open the latest version in the browser through': 'Of je kunt hier de nieuwste versie in je browser openen', "Hiervoor moet een geschikte webserver worden ingericht.)",
'Close': 'Afsluiten', "Save Connection configuration": "Verbindingsconfiguratie opslaan",
Filter: "Filter",
// server info modal
"Aria2 server info": "Aria2 server informatie",
"Aria2 Version": "Aria2 versie",
"Features Enabled": "Geactiveerde kenmerken",
// about modal
"To download the latest version of the project, add issues or to contribute back, head on to":
"Om de nieuwste versie van het project te downloaden, problemen te rapporteren of bij te dragen, ga naar",
"Or you can open the latest version in the browser through":
"Of je kunt hier de nieuwste versie in je browser openen",
Close: "Afsluiten"
}; };

View File

@ -1,131 +1,154 @@
if (typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.pl_PL = { translations.pl_PL = {
// header // header
'Search': 'Szukaj', Search: "Szukaj",
// Nav menu // Nav menu
'Add': 'Dodaj', Add: "Dodaj",
'By URIs': 'Przez URL', "By URIs": "Przez URL",
'By Torrents': 'Przez Torrenty', "By Torrents": "Przez Torrenty",
'By Metalinks': 'Przez Metalinki', "By Metalinks": "Przez Metalinki",
'Manage': 'Zarządzaj', Manage: "Zarządzaj",
'Pause All': 'Zatrzymaj wszystkie', "Pause All": "Zatrzymaj wszystkie",
'Resume Paused': 'Wznów zatrzymane', "Resume Paused": "Wznów zatrzymane",
'Purge Completed': 'Czyść zakończone', "Purge Completed": "Czyść zakończone",
'Settings': 'Ustawienia', Settings: "Ustawienia",
'Connection Settings': 'Ustawienia połączenia', "Connection Settings": "Ustawienia połączenia",
'Global Settings': 'Ustawienia globalne', "Global Settings": "Ustawienia globalne",
'Server info': 'Informacje o serwerze', "Server info": "Informacje o serwerze",
'About and contribute': 'O projekcie', "About and contribute": "O projekcie",
'Toggle navigation': 'Przełącz nawigację', "Toggle navigation": "Przełącz nawigację",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Różne', Miscellaneous: "Różne",
'Global Statistics': 'Statystyki globalne', "Global Statistics": "Statystyki globalne",
'About': 'O', About: "O",
'Displaying': 'Wyświetlanie', Displaying: "Wyświetlanie",
'of': 'z', of: "z",
'downloads': 'pobranych plików', downloads: "pobranych plików",
'Language': 'Język', Language: "Język",
// download filters // download filters
'Download Filters': 'Filtry ściągania', "Download Filters": "Filtry ściągania",
'Running': 'Uruchomione', Running: "Uruchomione",
'Active': 'Aktywne', Active: "Aktywne",
'Waiting': 'Oczekujące', Waiting: "Oczekujące",
'Complete': 'Zakończone', Complete: "Zakończone",
'Error': 'Błąd', Error: "Błąd",
'Paused': 'Zatrzymane', Paused: "Zatrzymane",
'Removed': 'Usunięte', Removed: "Usunięte",
'Hide linked meta-data': 'Ukryj zalinkowane meta-dane', "Hide linked meta-data": "Ukryj zalinkowane meta-dane",
'Toggle': 'Przełącz', Toggle: "Przełącz",
'Reset filters': 'Reset filtrów', "Reset filters": "Reset filtrów",
// starred properties // starred properties
'Quick Access Settings': 'Ustawienia szybkiego dostępu', "Quick Access Settings": "Ustawienia szybkiego dostępu",
'Save settings': 'Zapisz ustawienia', "Save settings": "Zapisz ustawienia",
'Currently no download in line to display, use the': 'Obecnie nie można wyświetlić żadnych pobieranych plików. Użyj przycisku', "Currently no download in line to display, use the":
'download button to start downloading files!': 'aby rozpocząć ściąganie plików!', "Obecnie nie można wyświetlić żadnych pobieranych plików. Użyj przycisku",
'Peers': 'Peerów', "download button to start downloading files!": "aby rozpocząć ściąganie plików!",
'More Info': 'Więcej info', Peers: "Peerów",
'Remove': 'Usuń', "More Info": "Więcej info",
'# of': '# z', Remove: "Usuń",
'Length': 'Długość', "# of": "# z",
// modals Length: "Długość",
'Add Downloads By URIs': 'Dodaj pobieranie przez URI', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': '- Możesz dodać wiele pobrań (plików) w tym samym czasie przez wprowadzenie URI dla każdego w oddzielnej linii.', "Add Downloads By URIs": "Dodaj pobieranie przez URI",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': '- Możesz także dodać wiele URI (luster) dla tego *samego* pliku. Zrób to, poprzez oddzielenie URI od siebie spacją.', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- URI może być HTTP(S)/FTP/BitTorrent-Magnet.', "- Możesz dodać wiele pobrań (plików) w tym samym czasie przez wprowadzenie URI dla każdego w oddzielnej linii.",
'Download settings': 'Ustawienia pobierania', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'Advanced settings': 'Zaawansowane ustawienia', "- Możesz także dodać wiele URI (luster) dla tego *samego* pliku. Zrób to, poprzez oddzielenie URI od siebie spacją.",
'Cancel': 'Anuluj', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- URI może być HTTP(S)/FTP/BitTorrent-Magnet.",
'Start': 'Rozpocznij', "Download settings": "Ustawienia pobierania",
'Choose': 'Wybierz', "Advanced settings": "Zaawansowane ustawienia",
'Quick Access (shown on the main page)': 'Szybki dostęp (pokazywane na głównej stronie)', Cancel: "Anuluj",
// add torrent modal Start: "Rozpocznij",
'Add Downloads By Torrents': 'Dodaj pobierania przez Torrenty', Choose: "Wybierz",
'- Select the torrent from the local filesystem to start the download.': '- Wybierz torrent z lokalnego systemu plików, aby rozpocząć pobieranie.', "Quick Access (shown on the main page)": "Szybki dostęp (pokazywane na głównej stronie)",
'- You can select multiple torrents to start multiple downloads.': '- Możesz wybrać wiele torrentów do rozpoczęcia wiele pobrań.', // add torrent modal
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- Aby dodać BitTorrent-URL Magnetyczny, użyj opcji dodawania przez URI i dodaj to tutaj.', "Add Downloads By Torrents": "Dodaj pobierania przez Torrenty",
'Select Torrents': 'Wybierz Torrenty', "- Select the torrent from the local filesystem to start the download.":
'Select a Torrent': 'Wybierz Torrent', "- Wybierz torrent z lokalnego systemu plików, aby rozpocząć pobieranie.",
// add metalink modal "- You can select multiple torrents to start multiple downloads.":
'Add Downloads By Metalinks': 'Dodaj pobierania przez Metalinki', "- Możesz wybrać wiele torrentów do rozpoczęcia wiele pobrań.",
'Select Metalinks': 'Wybierz Metalinki', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'- Select the Metalink from the local filesystem to start the download.': '- Wybierz Metalinki z lokalnego systemu plików, aby rozpocząć pobieranie.', "- Aby dodać BitTorrent-URL Magnetyczny, użyj opcji dodawania przez URI i dodaj to tutaj.",
'- You can select multiple Metalinks to start multiple downloads.': '- Możesz wybrać wiele Metalinków, aby rozpocząć wiele pobrań.', "Select Torrents": "Wybierz Torrenty",
'Select a Metalink': 'Wybierz Metalink', "Select a Torrent": "Wybierz Torrent",
// select file modal // add metalink modal
'Choose files to start download for': 'Wybierz pliki, aby rozpocząć pobieranie dla', "Add Downloads By Metalinks": "Dodaj pobierania przez Metalinki",
'Select to download': 'Wybierz do pobierania', "Select Metalinks": "Wybierz Metalinki",
// settings modal "- Select the Metalink from the local filesystem to start the download.":
'Aria2 RPC host and port': 'Aria2 RPC host i port', "- Wybierz Metalinki z lokalnego systemu plików, aby rozpocząć pobieranie.",
'Enter the host': 'Wprowadź host', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': 'Wprowadź IP lub nazwę DNS serwera, na którym jest uruchomiona Aria2 z RPC (domyślnie: localhost)', "- Możesz wybrać wiele Metalinków, aby rozpocząć wiele pobrań.",
'Enter the port': 'Wprowadź port', "Select a Metalink": "Wybierz Metalink",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': 'Wprowadź port serwera, na którym Aria2 z RPC jest uruchomiona (domyślnie 6800)', // select file modal
'Enter the RPC path': 'Wprowadź ścieżkę RPC', "Choose files to start download for": "Wybierz pliki, aby rozpocząć pobieranie dla",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Wprowadź ścieżkę dla punktu końcowego Aria2 RPC (domyślnie: /jsonrpc)', "Select to download": "Wybierz do pobierania",
'SSL/TLS encryption': 'szyfrowanie SSL/TLS', // settings modal
'Enable SSL/TLS encryption': 'Włącz szyfrowanie SSL/TLS', "Aria2 RPC host and port": "Aria2 RPC host i port",
'Enter the secret token (optional)': 'Wprowadź sekretny token (opcja dodatkowa)', "Enter the host": "Wprowadź host",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': 'Wprowadź sekretny token Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the username (optional)': 'Wprowadź nazwę użytkownika (opcja dodatkowa)', "Wprowadź IP lub nazwę DNS serwera, na którym jest uruchomiona Aria2 z RPC (domyślnie: localhost)",
'Enter the Aria2 RPC username (empty if authentication not enabled)': 'Wprowadź nazwę użytkownika Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)', "Enter the port": "Wprowadź port",
'Enter the password (optional)': 'Wprowadź hasło (opcja dodatkowa)', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Wprowadź hasło Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)', "Wprowadź port serwera, na którym Aria2 z RPC jest uruchomiona (domyślnie 6800)",
'Enter base URL (optional)': 'Wprowadź podstawowy URL (opcja dodatkowa)', "Enter the RPC path": "Wprowadź ścieżkę RPC",
'Direct Download': 'Bezpośrednie pobieranie', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'If supplied, links will be created to enable direct download from the Aria2 server.': 'Jeżeli zaznaczone, linki mogą być utworzone do włączenia bezpośredniego pobierania z serwera Aria2', "Wprowadź ścieżkę dla punktu końcowego Aria2 RPC (domyślnie: /jsonrpc)",
'(Requires appropriate webserver to be configured.)': '(Wymaga właściwej konfiguracji serwera WWW)', "SSL/TLS encryption": "szyfrowanie SSL/TLS",
'Save Connection configuration': 'Zapisz konfigurację połączenia', "Enable SSL/TLS encryption": "Włącz szyfrowanie SSL/TLS",
'Filter': 'Filtr', "Enter the secret token (optional)": "Wprowadź sekretny token (opcja dodatkowa)",
// server info modal "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Aria2 server info': 'Info o serwerze Aria2', "Wprowadź sekretny token Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",
'Aria2 Version': 'Wersja Aria2', "Enter the username (optional)": "Wprowadź nazwę użytkownika (opcja dodatkowa)",
'Features Enabled': 'Włączone funkcje', "Enter the Aria2 RPC username (empty if authentication not enabled)":
// about modal "Wprowadź nazwę użytkownika Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",
'To download the latest version of the project, add issues or to contribute back, head on to': 'Aby ściągnąć najnowszą wersję projektu, dodać zgłodzenia lub wspomagać projekt, udaj się do', "Enter the password (optional)": "Wprowadź hasło (opcja dodatkowa)",
'Or you can open the latest version in the browser through': 'Lub otwórz najnowszą wersję przez przeglądarkę', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Close': 'Zamknij', "Wprowadź hasło Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",
// lables "Enter base URL (optional)": "Wprowadź podstawowy URL (opcja dodatkowa)",
'Download status':'Status pobierania', "Direct Download": "Bezpośrednie pobieranie",
'Download Speed':'Szybkość pobierania', "If supplied, links will be created to enable direct download from the Aria2 server.":
'Upload Speed':'Szybkość wysyłania', "Jeżeli zaznaczone, linki mogą być utworzone do włączenia bezpośredniego pobierania z serwera Aria2",
'Estimated time':'Pozostały czas', "(Requires appropriate webserver to be configured.)":
'Download Size':'Rozmiar pobierania', "(Wymaga właściwej konfiguracji serwera WWW)",
'Downloaded':'Pobrane', "Save Connection configuration": "Zapisz konfigurację połączenia",
'Progress':'Postęp', Filter: "Filtr",
'Download Path':'Ścieżka pobierania', // server info modal
'Uploaded':'Załadowany', "Aria2 server info": "Info o serwerze Aria2",
'Download GID':'GID pobierania', "Aria2 Version": "Wersja Aria2",
'Number of Pieces':'Liczba kawałków', "Features Enabled": "Włączone funkcje",
'Piece Length':'Rozmiar kawałka', // about modal
'Shutdown Server': 'Wyłącz serwer', "To download the latest version of the project, add issues or to contribute back, head on to":
'The last connection attempt was unsuccessful. Trying another configuration': 'Ostatnia próba połączenia nie powiodła się. Spróbuj innej konfiguracji', "Aby ściągnąć najnowszą wersję projektu, dodać zgłodzenia lub wspomagać projekt, udaj się do",
'Oh Snap!': 'O kurczę!', "Or you can open the latest version in the browser through":
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': 'Nie można połączyć się z serwerem aria2 przez RPC. Kolejna próba za 10 sekund. Być może potrzebujesz sprawdzić ustawienie połączenia poprzez Ustawienia > Ustawienia połączenia', "Lub otwórz najnowszą wersję przez przeglądarkę",
'Successfully connected to Aria2 through its remote RPC …': 'Pomyślnie połączono się z Aria2 przez RPC ...', Close: "Zamknij",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': 'Pomyślnie połączono się z Aria2 przez RPC, jednakże połączenie nie jest bezpieczne. Aby zabezpieczyć dodaj sekretny token autoryzacji podczas startu Aria2 (przez użycie flagi --rpc-secret)', // lables
'Trying to connect to aria2 using the new connection configuration': 'Próba połączenia się z Aria2 poprzez użycie nowej konfiguracji połączenia' "Download status": "Status pobierania",
"Download Speed": "Szybkość pobierania",
"Upload Speed": "Szybkość wysyłania",
"Estimated time": "Pozostały czas",
"Download Size": "Rozmiar pobierania",
Downloaded: "Pobrane",
Progress: "Postęp",
"Download Path": "Ścieżka pobierania",
Uploaded: "Załadowany",
"Download GID": "GID pobierania",
"Number of Pieces": "Liczba kawałków",
"Piece Length": "Rozmiar kawałka",
"Shutdown Server": "Wyłącz serwer",
"The last connection attempt was unsuccessful. Trying another configuration":
"Ostatnia próba połączenia nie powiodła się. Spróbuj innej konfiguracji",
"Oh Snap!": "O kurczę!",
"Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
"Nie można połączyć się z serwerem aria2 przez RPC. Kolejna próba za 10 sekund. Być może potrzebujesz sprawdzić ustawienie połączenia poprzez Ustawienia > Ustawienia połączenia",
"Successfully connected to Aria2 through its remote RPC …":
"Pomyślnie połączono się z Aria2 przez RPC ...",
"Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
"Pomyślnie połączono się z Aria2 przez RPC, jednakże połączenie nie jest bezpieczne. Aby zabezpieczyć dodaj sekretny token autoryzacji podczas startu Aria2 (przez użycie flagi --rpc-secret)",
"Trying to connect to aria2 using the new connection configuration":
"Próba połączenia się z Aria2 poprzez użycie nowej konfiguracji połączenia"
}; };

View File

@ -1,154 +1,166 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.pt_BR = { // replace en_US to ll_CC, examples: zh_CN, de_AT. translations.pt_BR = {
// header // replace en_US to ll_CC, examples: zh_CN, de_AT.
'Search': 'Buscar', // header
// Nav menu Search: "Buscar",
'Add': 'Adicionar', // Nav menu
'By URIs': 'Por URIs', Add: "Adicionar",
'By Torrents': 'Por Torrents', "By URIs": "Por URIs",
'By Metalinks': 'Por Metalinks', "By Torrents": "Por Torrents",
'Manage': 'Gerenciar', "By Metalinks": "Por Metalinks",
'Pause All': 'Pausar Todos', Manage: "Gerenciar",
'Resume Paused': 'Retomar Pausados', "Pause All": "Pausar Todos",
'Purge Completed': 'Remover Completados', "Resume Paused": "Retomar Pausados",
'Shutdown Server': 'Desligar Servidor', "Purge Completed": "Remover Completados",
'Settings': 'Configurações', "Shutdown Server": "Desligar Servidor",
'Connection Settings': 'Configurações de Conexão', Settings: "Configurações",
'Global Settings': 'Configurações Globais', "Connection Settings": "Configurações de Conexão",
'Server info': 'Informações do Servidor', "Global Settings": "Configurações Globais",
'About and contribute': 'Sobre e contribuições', "Server info": "Informações do Servidor",
'Toggle navigation': 'Alternar navegação', "About and contribute": "Sobre e contribuições",
// body "Toggle navigation": "Alternar navegação",
// nav side bar // body
'Miscellaneous': 'Miscelânia', // nav side bar
'Global Statistics': 'Estatísticas Globais', Miscellaneous: "Miscelânia",
'About': 'Sobre', "Global Statistics": "Estatísticas Globais",
'Displaying': 'Mostrando', About: "Sobre",
'of': 'de', Displaying: "Mostrando",
'downloads': 'downloads', of: "de",
'Language': 'Linguagem', downloads: "downloads",
// download filters Language: "Linguagem",
'Download Filters': 'Filtros de Download', // download filters
'Running': 'Rodando', "Download Filters": "Filtros de Download",
'Active': 'Ativo', Running: "Rodando",
'Waiting': 'Esperando', Active: "Ativo",
'Complete': 'Completo', Waiting: "Esperando",
'Error': 'Erro', Complete: "Completo",
'Paused': 'Pausado', Error: "Erro",
'Removed': 'Removido', Paused: "Pausado",
'Hide linked meta-data': 'Esconder metadados ligados', Removed: "Removido",
'Toggle': 'Alternar', "Hide linked meta-data": "Esconder metadados ligados",
'Reset filters': 'Limpar filtros', Toggle: "Alternar",
// download status "Reset filters": "Limpar filtros",
'Verifing': 'Verificando', // download status
'Verify Pending': 'Verificação Pendente', Verifing: "Verificando",
// starred properties "Verify Pending": "Verificação Pendente",
'Quick Access Settings': 'Acesso Rápido às Configurações', // starred properties
'Save': 'Salvar', "Quick Access Settings": "Acesso Rápido às Configurações",
'Save settings': 'Salvar configurações', Save: "Salvar",
'Currently no download in line to display, use the': 'No momento não existem downloads para mostrar, utilize botão', "Save settings": "Salvar configurações",
'download button to start downloading files!': 'pra iniciar a transferência de arquivos!', "Currently no download in line to display, use the":
'Peers': 'Peers', "No momento não existem downloads para mostrar, utilize botão",
'More Info': 'Mais informações', "download button to start downloading files!": "pra iniciar a transferência de arquivos!",
'Remove': 'Remover', Peers: "Peers",
'# of': ' de', "More Info": "Mais informações",
'Length': 'Tamanho', Remove: "Remover",
// modals "# of": " de",
'Add Downloads By URIs': 'Adicionar Downloads por URIs', Length: "Tamanho",
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': // modals
'- Você pode adicionar múltiplos downloads (arquivos) ao mesmo tempo inserindo a URI de cada arquivo em uma linha separada.', "Add Downloads By URIs": "Adicionar Downloads por URIs",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- Você também pode adicionar múltiplas URIs (mirrors) para o *mesmo* arquivo. Para fazer isto, separe as URIs por um espaço.', "- Você pode adicionar múltiplos downloads (arquivos) ao mesmo tempo inserindo a URI de cada arquivo em uma linha separada.",
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- Uma URI pode ser HTTP(S)/FTP/BitTorrent-Magnet.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'Download settings': 'Configurações de download', "- Você também pode adicionar múltiplas URIs (mirrors) para o *mesmo* arquivo. Para fazer isto, separe as URIs por um espaço.",
'Advanced settings': 'Configurações avançadas', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Cancel': 'Cancelar', "- Uma URI pode ser HTTP(S)/FTP/BitTorrent-Magnet.",
'Start': 'Iniciar', "Download settings": "Configurações de download",
'Choose': 'Escolher', "Advanced settings": "Configurações avançadas",
'Quick Access (shown on the main page)': 'Acesso Rápido (exibido na página principal)', Cancel: "Cancelar",
// add torrent modal Start: "Iniciar",
'Add Downloads By Torrents': 'Adicionar Downloads por Torrents', Choose: "Escolher",
'- Select the torrent from the local filesystem to start the download.': '- Selecione o torrent de seu sistema de arquivos local para iniciar o download.', "Quick Access (shown on the main page)": "Acesso Rápido (exibido na página principal)",
'- You can select multiple torrents to start multiple downloads.': '- Você pode selecionar múltiplos torrents para iniciar múltiplos downloads.', // add torrent modal
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- Para adicionar uma URL BitTorrent-Magnet, utilize a opção Adicionar por URI.', "Add Downloads By Torrents": "Adicionar Downloads por Torrents",
'Select Torrents': 'Selecione Torrents', "- Select the torrent from the local filesystem to start the download.":
'Select a Torrent': 'Selecione um Torrent', "- Selecione o torrent de seu sistema de arquivos local para iniciar o download.",
// add metalink modal "- You can select multiple torrents to start multiple downloads.":
'Add Downloads By Metalinks': 'Adicionar Downloads por Metalinks', "- Você pode selecionar múltiplos torrents para iniciar múltiplos downloads.",
'Select Metalinks': 'Selecione Metalinks', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'- Select the Metalink from the local filesystem to start the download.': '- Selecione o Metalink do seu sistema de arquivos local para iniciar o download.', "- Para adicionar uma URL BitTorrent-Magnet, utilize a opção Adicionar por URI.",
'- You can select multiple Metalinks to start multiple downloads.': '- Você pode selecionar múltiplos Metalinks para iniciar múltiplos downloads.', "Select Torrents": "Selecione Torrents",
'Select a Metalink': 'Selecione um Metalink', "Select a Torrent": "Selecione um Torrent",
// select file modal // add metalink modal
'Choose files to start download for': 'Selecione os arquvos para serem baixados', "Add Downloads By Metalinks": "Adicionar Downloads por Metalinks",
'Select to download': 'Selecione para baixar', "Select Metalinks": "Selecione Metalinks",
// settings modal "- Select the Metalink from the local filesystem to start the download.":
'Aria2 RPC host and port': 'Host e porta do RPC Aria2', "- Selecione o Metalink do seu sistema de arquivos local para iniciar o download.",
'Enter the host': 'Informe o host', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "- Você pode selecionar múltiplos Metalinks para iniciar múltiplos downloads.",
'Informe o IP ou nome DNS do servidor no qual o RPC do Aria2 está rodando (default: localhost)', "Select a Metalink": "Selecione um Metalink",
'Enter the port': 'Informe a porta', // select file modal
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Choose files to start download for": "Selecione os arquvos para serem baixados",
'Informe a porta do servidor no qual o RPC do Aria2 está rodando (default: 6800)', "Select to download": "Selecione para baixar",
'Enter the RPC path': 'Informe o caminho RPC', // settings modal
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Informe o caminho para o endpoint RPC do Aria2 (default: /jasonrpc)', "Aria2 RPC host and port": "Host e porta do RPC Aria2",
'SSL/TLS encryption': 'Criptografia SSL/TLS', "Enter the host": "Informe o host",
'Enable SSL/TLS encryption': 'Habilita criptografia SSL/TLS', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the secret token (optional)': 'Informe o token secreto (opcional)', "Informe o IP ou nome DNS do servidor no qual o RPC do Aria2 está rodando (default: localhost)",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port": "Informe a porta",
'Informe o token secreto do RPC Aria2 (deixe vazio se a autenticação não estiver habilitada)', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the username (optional)': 'Informe o usuário (opcional)', "Informe a porta do servidor no qual o RPC do Aria2 está rodando (default: 6800)",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the RPC path": "Informe o caminho RPC",
'Informe o usuário RPC do Aria2 (vazio se a autenticação não estiver habilitada)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the password (optional)': 'Informe a senha (opcional)', "Informe o caminho para o endpoint RPC do Aria2 (default: /jasonrpc)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Informe a senha RPC do Aria2 (vazio se a autenticação não estiver habilitada)', "SSL/TLS encryption": "Criptografia SSL/TLS",
'Enter base URL (optional)': 'Informe a URL base (opcional)', "Enable SSL/TLS encryption": "Habilita criptografia SSL/TLS",
'Direct Download': 'Download Direto', "Enter the secret token (optional)": "Informe o token secreto (opcional)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Se fornecido, links serão criados para permitir download direto do servidor Aria2.', "Informe o token secreto do RPC Aria2 (deixe vazio se a autenticação não estiver habilitada)",
'(Requires appropriate webserver to be configured.)': '(Requer servidor web apropriado a ser configurado.)', "Enter the username (optional)": "Informe o usuário (opcional)",
'Save Connection configuration': 'Salvar Configuração de conexão', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Filter': 'Filtrar', "Informe o usuário RPC do Aria2 (vazio se a autenticação não estiver habilitada)",
// server info modal "Enter the password (optional)": "Informe a senha (opcional)",
'Aria2 server info': 'Informações do servidor Aria2', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 Version': 'Verão do Aria2', "Informe a senha RPC do Aria2 (vazio se a autenticação não estiver habilitada)",
'Features Enabled': 'Opções Habilitadas', "Enter base URL (optional)": "Informe a URL base (opcional)",
// about modal "Direct Download": "Download Direto",
'To download the latest version of the project, add issues or to contribute back, head on to': "If supplied, links will be created to enable direct download from the Aria2 server.":
'Para baixar a última versão do projeto, reportar problemas ou contribuir, acesse', "Se fornecido, links serão criados para permitir download direto do servidor Aria2.",
'Or you can open the latest version in the browser through': 'Ou você pode acessar a última versão pelo navegador através', "(Requires appropriate webserver to be configured.)":
'Close': 'Fechar', "(Requer servidor web apropriado a ser configurado.)",
// labels "Save Connection configuration": "Salvar Configuração de conexão",
'Download status':'Status do download', Filter: "Filtrar",
'Download Speed':'Velocidade de download', // server info modal
'Upload Speed':'Velocidade de upload', "Aria2 server info": "Informações do servidor Aria2",
'Estimated time':'Tempo estimado', "Aria2 Version": "Verão do Aria2",
'Download Size':'Tamanho do download', "Features Enabled": "Opções Habilitadas",
'Downloaded':'Baixado', // about modal
'Progress':'Progresso', "To download the latest version of the project, add issues or to contribute back, head on to":
'Download Path':'Caminho do download', "Para baixar a última versão do projeto, reportar problemas ou contribuir, acesse",
'Uploaded':'Enviado', "Or you can open the latest version in the browser through":
'Download GID':'GID do download', "Ou você pode acessar a última versão pelo navegador através",
'Number of Pieces':'Número de partes', Close: "Fechar",
'Piece Length':'Tamanho das partes', // labels
"Download status": "Status do download",
"Download Speed": "Velocidade de download",
"Upload Speed": "Velocidade de upload",
"Estimated time": "Tempo estimado",
"Download Size": "Tamanho do download",
Downloaded: "Baixado",
Progress: "Progresso",
"Download Path": "Caminho do download",
Uploaded: "Enviado",
"Download GID": "GID do download",
"Number of Pieces": "Número de partes",
"Piece Length": "Tamanho das partes",
//alerts //alerts
'The last connection attempt was unsuccessful. Trying another configuration': "The last connection attempt was unsuccessful. Trying another configuration":
'A última tentativa de conexão não teve sucesso. Tentando outra configuração', "A última tentativa de conexão não teve sucesso. Tentando outra configuração",
'Oh Snap!': 'Ah Droga!', "Oh Snap!": "Ah Droga!",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Não foi possível conectar no servidor RPC aria2. Tententando em 10 seg. Você pode querer verificar as configurações da conexão em Configurações > Configurações de Conexão', "Não foi possível conectar no servidor RPC aria2. Tententando em 10 seg. Você pode querer verificar as configurações da conexão em Configurações > Configurações de Conexão",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'Autenticação falhou enquanto conectando ao servidor RPC Aria2. Tentando em 10 seg. Você pode querer confirmar os detalhes de autenticação acessando Configurações > Configurações de Conexão', "Autenticação falhou enquanto conectando ao servidor RPC Aria2. Tentando em 10 seg. Você pode querer confirmar os detalhes de autenticação acessando Configurações > Configurações de Conexão",
'Successfully connected to Aria2 through its remote RPC …': "Successfully connected to Aria2 through its remote RPC …":
'Conectado com sucesso ao Aria2 através de seu RPC remoto …', "Conectado com sucesso ao Aria2 através de seu RPC remoto …",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
'Conectado com sucesso ao Aria2 através de seu RPC remoto, contudo a conexão é insegura. Para uma completa segurança tente adicionar um token secreto de autorização quando iniciar o Aria2 (através da opção --rpc-secret)', "Conectado com sucesso ao Aria2 através de seu RPC remoto, contudo a conexão é insegura. Para uma completa segurança tente adicionar um token secreto de autorização quando iniciar o Aria2 (através da opção --rpc-secret)",
'Trying to connect to aria2 using the new connection configuration': "Trying to connect to aria2 using the new connection configuration":
'Tentando conectar-se ao aria2 utilizando a nova configuração de conexão', "Tentando conectar-se ao aria2 utilizando a nova configuração de conexão",
'Remove {{name}} and associated meta-data?': // {{name}} refers to the download name, do not modify. // {{name}} refers to the download name, do not modify.
'Remover {{name}} e os metadados associados?' "Remove {{name}} and associated meta-data?": "Remover {{name}} e os metadados associados?"
}; };

View File

@ -1,143 +1,156 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.ru_RU = { translations.ru_RU = {
// header // header
'Search': 'Поиск', Search: "Поиск",
// Nav menu // Nav menu
'Add': 'Добавить', Add: "Добавить",
'By URIs': 'URL-адреса', "By URIs": "URL-адреса",
'By Torrents': 'Torrent-файлы', "By Torrents": "Torrent-файлы",
'By Metalinks': 'Metalink-файлы', "By Metalinks": "Metalink-файлы",
'Manage': 'Управление', Manage: "Управление",
'Pause All': 'Приостановить всё', "Pause All": "Приостановить всё",
'Resume Paused': 'Возобновить всё', "Resume Paused": "Возобновить всё",
'Purge Completed': 'Удалить завершенные', "Purge Completed": "Удалить завершенные",
'Settings': 'Настройки', Settings: "Настройки",
'Connection Settings': 'Настройки соединения', "Connection Settings": "Настройки соединения",
'Global Settings': 'Глобальные настройки', "Global Settings": "Глобальные настройки",
'Server info': 'Информация о сервере', "Server info": "Информация о сервере",
'About and contribute': 'Информация и сотрудничество', "About and contribute": "Информация и сотрудничество",
'Toggle navigation': 'Переключение навигации', "Toggle navigation": "Переключение навигации",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Разное', Miscellaneous: "Разное",
'Global Statistics': 'Глобальная статистика', "Global Statistics": "Глобальная статистика",
'About': 'Об', About: "Об",
'Displaying': 'Показано', Displaying: "Показано",
'of': 'из', of: "из",
'downloads': 'загрузок', downloads: "загрузок",
'Language': 'Язык', Language: "Язык",
// download filters // download filters
'Download Filters': 'Фильтр загрузок', "Download Filters": "Фильтр загрузок",
'Running': 'Запущенные', Running: "Запущенные",
'Active': 'Активные', Active: "Активные",
'Waiting': 'Ожидающие', Waiting: "Ожидающие",
'Complete': 'Завершенные', Complete: "Завершенные",
'Error': 'С ошибками', Error: "С ошибками",
'Paused': 'Приостановленные', Paused: "Приостановленные",
'Removed': 'Удаленные', Removed: "Удаленные",
'Hide linked meta-data': 'Скрыть связанные метаданные', "Hide linked meta-data": "Скрыть связанные метаданные",
'Toggle': 'Переключить', Toggle: "Переключить",
'Reset filters': 'Сбросить фильтры', "Reset filters": "Сбросить фильтры",
// starred properties // starred properties
'Quick Access Settings': 'Настройки быстрого доступа', "Quick Access Settings": "Настройки быстрого доступа",
'Save settings': 'Сохранить настройки', "Save settings": "Сохранить настройки",
'Currently no download in line to display, use the': 'На данный момент ничего не загружается, используйте кнопку', "Currently no download in line to display, use the":
'download button to start downloading files!': 'чтобы начать загрузку файла!', "На данный момент ничего не загружается, используйте кнопку",
'Peers': 'Пиры', "download button to start downloading files!": "чтобы начать загрузку файла!",
'More Info': 'Информация', Peers: "Пиры",
'Remove': 'Удалить', "More Info": "Информация",
'# of': '# из', Remove: "Удалить",
'Length': 'Размер', "# of": "# из",
// modals Length: "Размер",
'Add Downloads By URIs': 'Добавить загрузки из URL-адресов', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "Добавить загрузки из URL-адресов",
'- Вы можете добавить несколько загрузок (файлов) одновременно, помещая URL-адреса для каждого файла на отдельной строке.', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- Вы можете добавить несколько загрузок (файлов) одновременно, помещая URL-адреса для каждого файла на отдельной строке.",
'- Можно также добавить несколько URL-адресов (зеркал) для *одного* файла. Для этого отделите URL-адреса пробелом.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- URL-адрес может быть HTTP(S)/FTP/BitTorrent-Magnet.', "- Можно также добавить несколько URL-адресов (зеркал) для *одного* файла. Для этого отделите URL-адреса пробелом.",
'Download settings': 'Настройки загрузки', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Advanced settings': 'Расширенные настройки', "- URL-адрес может быть HTTP(S)/FTP/BitTorrent-Magnet.",
'Cancel': 'Отмена', "Download settings": "Настройки загрузки",
'Start': 'Начать', "Advanced settings": "Расширенные настройки",
'Choose': 'Выбрать', Cancel: "Отмена",
'Quick Access (shown on the main page)': 'Простой доступ (смотреть на главной странице)', Start: "Начать",
// add torrent modal Choose: "Выбрать",
'Add Downloads By Torrents': 'Добавить загрузку из Torrent-файлов', "Quick Access (shown on the main page)": "Простой доступ (смотреть на главной странице)",
'- Select the torrent from the local filesystem to start the download.': '- Выберите Torrent-файлы из локальной файловой системы для начала загрузку.', // add torrent modal
'- You can select multiple torrents to start multiple downloads.': '- Вы можете выбрать несколько Torrent-файлы для запуска нескольких загрузок.', "Add Downloads By Torrents": "Добавить загрузку из Torrent-файлов",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- Для добавления BitTorrent-Magnet ссылки воспользуйтесь пунктом меню *Добавить из URL-адреса*', "- Select the torrent from the local filesystem to start the download.":
'Select Torrents': 'Выберите торренты', "- Выберите Torrent-файлы из локальной файловой системы для начала загрузку.",
'Select a Torrent': 'Выберите торрент', "- You can select multiple torrents to start multiple downloads.":
// add metalink modal "- Вы можете выбрать несколько Torrent-файлы для запуска нескольких загрузок.",
'Add Downloads By Metalinks': 'Добавить загрузку из Metalink-файлов', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'Select Metalinks': 'Выбрать Metalink-файлы', "- Для добавления BitTorrent-Magnet ссылки воспользуйтесь пунктом меню *Добавить из URL-адреса*",
'- Select the Metalink from the local filesystem to start the download.': '- Выберите Metalink-файлы из локальной файловой системы для начала загрузки', "Select Torrents": "Выберите торренты",
'- You can select multiple Metalinks to start multiple downloads.': '- Вы можете выбрать несколько Metalink-файлов для запуска нескольких загрузок.', "Select a Torrent": "Выберите торрент",
'Select a Metalink': 'Выберите Metalink', // add metalink modal
// select file modal "Add Downloads By Metalinks": "Добавить загрузку из Metalink-файлов",
'Choose files to start download for': 'Выберите файлы чтобы начать загрузку для', "Select Metalinks": "Выбрать Metalink-файлы",
'Select to download': 'Выберите для загрузки', "- Select the Metalink from the local filesystem to start the download.":
// settings modal "- Выберите Metalink-файлы из локальной файловой системы для начала загрузки",
'Aria2 RPC host and port': 'Aria2 RPC хост и порт', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the host': 'Укажите хост', "- Вы можете выбрать несколько Metalink-файлов для запуска нескольких загрузок.",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Select a Metalink": "Выберите Metalink",
'Укажите IP или DNS-имя сервера, на котором запущена Aria2 со включенным RPC (по умолчанию: localhost)', // select file modal
'Enter the port': 'Укажите порт', "Choose files to start download for": "Выберите файлы чтобы начать загрузку для",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Select to download": "Выберите для загрузки",
'Укажите порт сервера, на котором запущена Aria2 со включенным RPC (по умолчанию: 6800)', // settings modal
'Enter the RPC path': 'Укажите путь RPC', "Aria2 RPC host and port": "Aria2 RPC хост и порт",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Укажите конечный путь для Aria2 RPC (по умолчанию: /jsonrpc)', "Enter the host": "Укажите хост",
'SSL/TLS encryption': 'SSL/TLS шифрование', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enable SSL/TLS encryption': 'Разрешить SSL/TLS шифрование', "Укажите IP или DNS-имя сервера, на котором запущена Aria2 со включенным RPC (по умолчанию: localhost)",
'Enter the secret token (optional)': 'Укажите секретный токен (необязательно)', "Enter the port": "Укажите порт",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Укажите секретный токен Aria2 RPC (оставьте пустым, если авторизация не включена)', "Укажите порт сервера, на котором запущена Aria2 со включенным RPC (по умолчанию: 6800)",
'Enter the username (optional)': 'Укажите имя пользователя (необязательно)', "Enter the RPC path": "Укажите путь RPC",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Укажите имя пользователя Aria2 RPC (оставьте пустым, если авторизация не включена)', "Укажите конечный путь для Aria2 RPC (по умолчанию: /jsonrpc)",
'Enter the password (optional)': 'Укажите пароль (необязательно)', "SSL/TLS encryption": "SSL/TLS шифрование",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Укажите пароль для Aria2 RPC (оставьте пустым, если авторизация не включена)', "Enable SSL/TLS encryption": "Разрешить SSL/TLS шифрование",
'Enter base URL (optional)': 'Укажите базовый URL-адрес (необязательно)', "Enter the secret token (optional)": "Укажите секретный токен (необязательно)",
'Direct Download': 'Прямая загрузка', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'If supplied, links will be created to enable direct download from the Aria2 server.': "Укажите секретный токен Aria2 RPC (оставьте пустым, если авторизация не включена)",
'Ссылки (при наличии) будут созданы для загрузки непосредственно с сервера Aria2.', "Enter the username (optional)": "Укажите имя пользователя (необязательно)",
'(Requires appropriate webserver to be configured.)': '(Требуется соответствующий веб-сервер для настройки.)', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Save Connection configuration': 'Сохранить настройки соединения', "Укажите имя пользователя Aria2 RPC (оставьте пустым, если авторизация не включена)",
'Filter': 'Фильтр', "Enter the password (optional)": "Укажите пароль (необязательно)",
// server info modal "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 server info': 'Информация о сервере Aria2', "Укажите пароль для Aria2 RPC (оставьте пустым, если авторизация не включена)",
'Aria2 Version': 'Версия Aria2', "Enter base URL (optional)": "Укажите базовый URL-адрес (необязательно)",
'Features Enabled': 'Имеющийся функционал', "Direct Download": "Прямая загрузка",
// about modal "If supplied, links will be created to enable direct download from the Aria2 server.":
'To download the latest version of the project, add issues or to contribute back, head on to': "Ссылки (при наличии) будут созданы для загрузки непосредственно с сервера Aria2.",
'Чтобы загрузить последнюю версию проекта, добавить вопросы или внести свой вклад, передите на', "(Requires appropriate webserver to be configured.)":
'Or you can open the latest version in the browser through': 'Или вы можете открыть последнюю версию в браузере через', "(Требуется соответствующий веб-сервер для настройки.)",
'Close': 'Закрыть', "Save Connection configuration": "Сохранить настройки соединения",
// lables Filter: "Фильтр",
'Download status':'Статус загрузки', // server info modal
'Download Speed':'Скорость загрузки', "Aria2 server info": "Информация о сервере Aria2",
'Upload Speed':'Скорость отдачи', "Aria2 Version": "Версия Aria2",
'Estimated time':'Оставшееся время', "Features Enabled": "Имеющийся функционал",
'Download Size':'Размер загрузки', // about modal
'Downloaded':'Загружено', "To download the latest version of the project, add issues or to contribute back, head on to":
'Progress':'Прогресс', "Чтобы загрузить последнюю версию проекта, добавить вопросы или внести свой вклад, передите на",
'Download Path':'Путь к загружаемым файлам', "Or you can open the latest version in the browser through":
'Uploaded':'Отдано', "Или вы можете открыть последнюю версию в браузере через",
'Download GID':'Загруженый GID', Close: "Закрыть",
'Number of Pieces':'Количество частей', // lables
'Piece Length': 'Размер частей', "Download status": "Статус загрузки",
'Shutdown Server': 'Выключить сервер', "Download Speed": "Скорость загрузки",
"Upload Speed": "Скорость отдачи",
"Estimated time": "Оставшееся время",
"Download Size": "Размер загрузки",
Downloaded: "Загружено",
Progress: "Прогресс",
"Download Path": "Путь к загружаемым файлам",
Uploaded: "Отдано",
"Download GID": "Загруженый GID",
"Number of Pieces": "Количество частей",
"Piece Length": "Размер частей",
"Shutdown Server": "Выключить сервер",
'The last connection attempt was unsuccessful. Trying another configuration': 'Последняя попытка подключения была неудачной. Попробуйте другую конфигурацию', "The last connection attempt was unsuccessful. Trying another configuration":
'Oh Snap!': 'Опаньки!', "Последняя попытка подключения была неудачной. Попробуйте другую конфигурацию",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "Oh Snap!": "Опаньки!",
'Не удалось подключиться к серверу Aria2 RPC. Попытка будет повторена в течение 10 секунд. Вы можете проверить параметры подключения, перейдя в меню Настройки > Настройки соединения', "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Successfully connected to Aria2 through its remote RPC …': 'Успешное подключение к Aria2 через удаленный RPC …', "Не удалось подключиться к серверу Aria2 RPC. Попытка будет повторена в течение 10 секунд. Вы можете проверить параметры подключения, перейдя в меню Настройки > Настройки соединения",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "Successfully connected to Aria2 through its remote RPC …":
'Успешное подключение к Aria2 через удаленный RPC, однако соединение все еще небезопасно. Для обеспечения лучшей безопасности добавьте секретный токен авторизации при запуске aria2 (через флаг --rpc-secret)', "Успешное подключение к Aria2 через удаленный RPC …",
'Trying to connect to aria2 using the new connection configuration': "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
'Попытка подключиться к aria2 с использованием новой конфигурации', "Успешное подключение к Aria2 через удаленный RPC, однако соединение все еще небезопасно. Для обеспечения лучшей безопасности добавьте секретный токен авторизации при запуске aria2 (через флаг --rpc-secret)",
"Trying to connect to aria2 using the new connection configuration":
"Попытка подключиться к aria2 с использованием новой конфигурации"
}; };

View File

@ -12,157 +12,150 @@
// 5. Browser determining preferred language automatically. // 5. Browser determining preferred language automatically.
// http://angular-translate.github.io/docs/en/#/guide/07_multi-language // http://angular-translate.github.io/docs/en/#/guide/07_multi-language
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.en_US = { // replace en_US to ll_CC, examples: zh_CN, de_AT. translations.en_US = {
// header // replace en_US to ll_CC, examples: zh_CN, de_AT.
'Search': '', // header
// Nav menu Search: "",
'Add': '', // Nav menu
'By URIs': '', Add: "",
'By Torrents': '', "By URIs": "",
'By Metalinks': '', "By Torrents": "",
'Manage': '', "By Metalinks": "",
'Pause All': '', Manage: "",
'Resume Paused': '', "Pause All": "",
'Purge Completed': '', "Resume Paused": "",
'Shutdown Server': '', "Purge Completed": "",
'Settings': '', "Shutdown Server": "",
'Connection Settings': '', Settings: "",
'Global Settings': '', "Connection Settings": "",
'Server info': '', "Global Settings": "",
'About and contribute': '', "Server info": "",
'Toggle navigation': '', "About and contribute": "",
// body "Toggle navigation": "",
// nav side bar // body
'Miscellaneous': '', // nav side bar
'Global Statistics': '', Miscellaneous: "",
'About': '', "Global Statistics": "",
'Displaying': '', About: "",
'of': '', Displaying: "",
'downloads': '', of: "",
'Language': '', downloads: "",
// download filters Language: "",
'Download Filters': '', // download filters
'Running': '', "Download Filters": "",
'Active': '', Running: "",
'Waiting': '', Active: "",
'Complete': '', Waiting: "",
'Error': '', Complete: "",
'Paused': '', Error: "",
'Removed': '', Paused: "",
'Hide linked meta-data': '', Removed: "",
'Toggle': '', "Hide linked meta-data": "",
'Reset filters': '', Toggle: "",
// download status "Reset filters": "",
'Verifing': '', // download status
'Verify Pending': '', Verifing: "",
// starred properties "Verify Pending": "",
'Quick Access Settings': '', // starred properties
'Save': '', "Quick Access Settings": "",
'Save settings': '', Save: "",
'Currently no download in line to display, use the': '', "Save settings": "",
'download button to start downloading files!': '', "Currently no download in line to display, use the": "",
'Peers': '', "download button to start downloading files!": "",
'More Info': '', Peers: "",
'Remove': '', "More Info": "",
'# of': '', Remove: "",
'Length': '', "# of": "",
// modals Length: "",
'Add Downloads By URIs': '', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "",
'', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "",
'', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '', "",
'Download settings': '', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "",
'Advanced settings': '', "Download settings": "",
'Cancel': '', "Advanced settings": "",
'Start': '', Cancel: "",
'Choose': '', Start: "",
'Quick Access (shown on the main page)': '', Choose: "",
// add torrent modal "Quick Access (shown on the main page)": "",
'Add Downloads By Torrents': '', // add torrent modal
'- Select the torrent from the local filesystem to start the download.': '', "Add Downloads By Torrents": "",
'- You can select multiple torrents to start multiple downloads.': '', "- Select the torrent from the local filesystem to start the download.": "",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '', "- You can select multiple torrents to start multiple downloads.": "",
'Select Torrents': '', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.": "",
'Select a Torrent': '', "Select Torrents": "",
// add metalink modal "Select a Torrent": "",
'Add Downloads By Metalinks': '', // add metalink modal
'Select Metalinks': '', "Add Downloads By Metalinks": "",
'- Select the Metalink from the local filesystem to start the download.': '', "Select Metalinks": "",
'- You can select multiple Metalinks to start multiple downloads.': '', "- Select the Metalink from the local filesystem to start the download.": "",
'Select a Metalink': '', "- You can select multiple Metalinks to start multiple downloads.": "",
// select file modal "Select a Metalink": "",
'Choose files to start download for': '', // select file modal
'Select to download': '', "Choose files to start download for": "",
// settings modal "Select to download": "",
'Aria2 RPC host and port': '', // settings modal
'Enter the host': '', "Aria2 RPC host and port": "",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Enter the host": "",
'', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the port': '', "",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Enter the port": "",
'', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)": "",
'Enter the RPC path': '', "Enter the RPC path": "",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': '', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)": "",
'SSL/TLS encryption': '', "SSL/TLS encryption": "",
'Enable SSL/TLS encryption': '', "Enable SSL/TLS encryption": "",
'Enter the secret token (optional)': '', "Enter the secret token (optional)": "",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)": "",
'', "Enter the username (optional)": "",
'Enter the username (optional)': '', "Enter the Aria2 RPC username (empty if authentication not enabled)": "",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the password (optional)": "",
'', "Enter the Aria2 RPC password (empty if authentication not enabled)": "",
'Enter the password (optional)': '', "Enter base URL (optional)": "",
'Enter the Aria2 RPC password (empty if authentication not enabled)': '', "Direct Download": "",
'Enter base URL (optional)': '', "If supplied, links will be created to enable direct download from the Aria2 server.": "",
'Direct Download': '', "(Requires appropriate webserver to be configured.)": "",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Save Connection configuration": "",
'', Filter: "",
'(Requires appropriate webserver to be configured.)': '', // server info modal
'Save Connection configuration': '', "Aria2 server info": "",
'Filter': '', "Aria2 Version": "",
// server info modal "Features Enabled": "",
'Aria2 server info': '', // about modal
'Aria2 Version': '', "To download the latest version of the project, add issues or to contribute back, head on to": "",
'Features Enabled': '', "Or you can open the latest version in the browser through": "",
// about modal Close: "",
'To download the latest version of the project, add issues or to contribute back, head on to': // labels
'', "Download status": "",
'Or you can open the latest version in the browser through': '', "Download Speed": "",
'Close': '', "Upload Speed": "",
// labels "Estimated time": "",
'Download status':'', "Download Size": "",
'Download Speed':'', Downloaded: "",
'Upload Speed':'', Progress: "",
'Estimated time':'', "Download Path": "",
'Download Size':'', Uploaded: "",
'Downloaded':'', "Download GID": "",
'Progress':'', "Number of Pieces": "",
'Download Path':'', "Piece Length": "",
'Uploaded':'',
'Download GID':'',
'Number of Pieces':'',
'Piece Length':'',
//alerts //alerts
'The last connection attempt was unsuccessful. Trying another configuration': "The last connection attempt was unsuccessful. Trying another configuration": "",
'', "Oh Snap!": "",
'Oh Snap!': '', "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "",
'', "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': "",
'', "Successfully connected to Aria2 through its remote RPC …": "",
'Successfully connected to Aria2 through its remote RPC …': "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
'', "",
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "Trying to connect to aria2 using the new connection configuration": "",
'', // {{name}} refers to the download name, do not modify.
'Trying to connect to aria2 using the new connection configuration': "Remove {{name}} and associated meta-data?": ""
'',
'Remove {{name}} and associated meta-data?': // {{name}} refers to the download name, do not modify.
''
}; };

View File

@ -1,119 +1,117 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.th_TH = { translations.th_TH = {
// header // header
'Search': 'ค้นหา', Search: "ค้นหา",
// Nav menu // Nav menu
'Add': 'เพื่ม', Add: "เพื่ม",
'By URIs': 'ด้วยยูอาร์ไอ', "By URIs": "ด้วยยูอาร์ไอ",
'By Torrents': 'ด้วยทอร์เรนต์', "By Torrents": "ด้วยทอร์เรนต์",
'By Metalinks': 'ด้วยเมทาลิงค์', "By Metalinks": "ด้วยเมทาลิงค์",
'Manage': 'บริหาร', Manage: "บริหาร",
'Pause All': 'หยุดชั่วคราวหมด', "Pause All": "หยุดชั่วคราวหมด",
'Resume Paused': 'ไปต่อหมด', "Resume Paused": "ไปต่อหมด",
'Purge Completed': 'ลบอันเสร็จ', "Purge Completed": "ลบอันเสร็จ",
'Settings': 'ตั้งค่า', Settings: "ตั้งค่า",
'Connection Settings': 'ตั้งค่าเชื่อมต่อ', "Connection Settings": "ตั้งค่าเชื่อมต่อ",
'Global Settings': 'ตั้งค่าทั่วไป', "Global Settings": "ตั้งค่าทั่วไป",
'Server info': 'ข้อมูลเซอร์เวอร์', "Server info": "ข้อมูลเซอร์เวอร์",
'About and contribute': 'เกี่ยวกับและช่วย', "About and contribute": "เกี่ยวกับและช่วย",
'Toggle navigation': 'สลับนำทาง', "Toggle navigation": "สลับนำทาง",
'Language': 'ภาษา', Language: "ภาษา",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'เบ็ดเตล็ด', Miscellaneous: "เบ็ดเตล็ด",
'Global Statistics': 'สถิติทั่วไป', "Global Statistics": "สถิติทั่วไป",
'About': 'เกี่ยวกับ', About: "เกี่ยวกับ",
'Displaying': 'แแสดงดาวน์โหลด', Displaying: "แแสดงดาวน์โหลด",
'of': 'อันใน', of: "อันใน",
'downloads': 'อันทั้งหมด', downloads: "อันทั้งหมด",
// download filters // download filters
'Download Filters': 'กรองดาวน์โหลด', "Download Filters": "กรองดาวน์โหลด",
'Running': 'กำลังทำงาน', Running: "กำลังทำงาน",
'Active': 'ใช้งานอยู่', Active: "ใช้งานอยู่",
'Waiting': 'กำลังรอ', Waiting: "กำลังรอ",
'Complete': 'เสร็จ', Complete: "เสร็จ",
'Error': 'ผิดพลาด', Error: "ผิดพลาด",
'Paused': 'หยุดอยู่', Paused: "หยุดอยู่",
'Removed': 'ลบแล้ว', Removed: "ลบแล้ว",
'Hide linked meta-data': 'ซ่อนข้อมูลเมตาที่เชื่อมโยง', "Hide linked meta-data": "ซ่อนข้อมูลเมตาที่เชื่อมโยง",
'Toggle': 'สลับ', Toggle: "สลับ",
'Reset filters': 'รีเซตตัวกรอง', "Reset filters": "รีเซตตัวกรอง",
// starred properties // starred properties
'Quick Access Settings': 'ตั้งค่าอย่างรวดเร็ว', "Quick Access Settings": "ตั้งค่าอย่างรวดเร็ว",
'Save settings': 'บันทึกการตั้งค่า', "Save settings": "บันทึกการตั้งค่า",
'Currently no download in line to display, use the': 'ตอนนี้ไม่มีการดาวน์โหลดที่แสดงได้ ก็ใช้ปุ่ม', "Currently no download in line to display, use the":
'download button to start downloading files!': 'ให้เริ่มดาวน์โหลดไฟล์', "ตอนนี้ไม่มีการดาวน์โหลดที่แสดงได้ ก็ใช้ปุ่ม",
'Peers': 'พีร์ส', "download button to start downloading files!": "ให้เริ่มดาวน์โหลดไฟล์",
'More Info': 'ข้อมูลเพิ่ม', Peers: "พีร์ส",
'Remove': 'ลบ', "More Info": "ข้อมูลเพิ่ม",
'# of': 'จำนวน', Remove: "ลบ",
'Length': 'ความยาว', "# of": "จำนวน",
// modals Length: "ความยาว",
'Add Downloads By URIs': 'เพิ่มดาวน์โหลดด้วยยูอาร์ไอ', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "เพิ่มดาวน์โหลดด้วยยูอาร์ไอ",
'', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "",
'', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '', "",
'Download settings': 'ตั้งค่าการดาวน์โหลด', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "",
'Advanced settings': 'ตั้งค่าขั้นสูง', "Download settings": "ตั้งค่าการดาวน์โหลด",
'Cancel': 'ยกเลิก', "Advanced settings": "ตั้งค่าขั้นสูง",
'Start': 'เริ่มต้น', Cancel: "ยกเลิก",
'Choose': 'เลือก', Start: "เริ่มต้น",
'Quick Access (shown on the main page)': 'ใช้งานอย่างรวดเร็ว (แสดงที่เพจหลัก)', Choose: "เลือก",
// add torrent modal "Quick Access (shown on the main page)": "ใช้งานอย่างรวดเร็ว (แสดงที่เพจหลัก)",
'Add Downloads By Torrents': 'เพิ่มดาวน์โหลดด้วยทอร์เรนต์', // add torrent modal
'- Select the torrent from the local filesystem to start the download.': '', "Add Downloads By Torrents": "เพิ่มดาวน์โหลดด้วยทอร์เรนต์",
'- You can select multiple torrents to start multiple downloads.': '', "- Select the torrent from the local filesystem to start the download.": "",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '', "- You can select multiple torrents to start multiple downloads.": "",
'Select Torrents': 'เลือกทอร์เรนต์', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.": "",
'Select a Torrent': 'เลือกทอร์เรนต์', "Select Torrents": "เลือกทอร์เรนต์",
// add metalink modal "Select a Torrent": "เลือกทอร์เรนต์",
'Add Downloads By Metalinks': 'เพิ่มดาวน์โหลดด้วยเมทาลิงค์', // add metalink modal
'Select Metalinks': 'เลือกเมทาลิงค์', "Add Downloads By Metalinks": "เพิ่มดาวน์โหลดด้วยเมทาลิงค์",
'- Select the Metalink from the local filesystem to start the download.': '', "Select Metalinks": "เลือกเมทาลิงค์",
'- You can select multiple Metalinks to start multiple downloads.': '', "- Select the Metalink from the local filesystem to start the download.": "",
'Select a Metalink': 'เลือกเมทาลิงค์', "- You can select multiple Metalinks to start multiple downloads.": "",
// select file modal "Select a Metalink": "เลือกเมทาลิงค์",
'Choose files to start download for': 'เลือกไฟล์ที่จะเริ่มดาวน์โหลด', // select file modal
'Select to download': 'เลือกให้ดาวน์โหลด', "Choose files to start download for": "เลือกไฟล์ที่จะเริ่มดาวน์โหลด",
// settings modal "Select to download": "เลือกให้ดาวน์โหลด",
'Aria2 RPC host and port': 'โฮสต์และพอร์ตของ Aria2 RPC', // settings modal
'Enter the host': 'ป้อนโฮสต์', "Aria2 RPC host and port": "โฮสต์และพอร์ตของ Aria2 RPC",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Enter the host": "ป้อนโฮสต์",
'', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the port': 'ป้อนพอร์ต', "",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Enter the port": "ป้อนพอร์ต",
'', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)": "",
'Enter the RPC path': 'ป้อนเส้นทาง RPC', "Enter the RPC path": "ป้อนเส้นทาง RPC",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': '', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)": "",
'SSL/TLS encryption': 'การเข้ารหัสลับ SSL/TLS', "SSL/TLS encryption": "การเข้ารหัสลับ SSL/TLS",
'Enable SSL/TLS encryption': 'เปิดใช้การเข้ารหัสลับ SSL/TLS', "Enable SSL/TLS encryption": "เปิดใช้การเข้ารหัสลับ SSL/TLS",
'Enter the secret token (optional)': 'ป้อนสัญลักษณ์ความลับ (เป็นตัวเลือก)', "Enter the secret token (optional)": "ป้อนสัญลักษณ์ความลับ (เป็นตัวเลือก)",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)": "",
'', "Enter the username (optional)": "ป้อนเชื่อ (เป็นตัวเลือก)",
'Enter the username (optional)': 'ป้อนเชื่อ (เป็นตัวเลือก)', "Enter the Aria2 RPC username (empty if authentication not enabled)": "",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the password (optional)": "ป้อนรหัสผ่าน (เป็นตัวเลือก)",
'', "Enter the Aria2 RPC password (empty if authentication not enabled)": "",
'Enter the password (optional)': 'ป้อนรหัสผ่าน (เป็นตัวเลือก)', "Enter base URL (optional)": "ป้อน URL หลัก (เป็นตัวเลือก)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': '', "Direct Download": "ดาวน์โหลดโดยตรง",
'Enter base URL (optional)': 'ป้อน URL หลัก (เป็นตัวเลือก)', "If supplied, links will be created to enable direct download from the Aria2 server.": "",
'Direct Download': 'ดาวน์โหลดโดยตรง', "(Requires appropriate webserver to be configured.)": "",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Save Connection configuration": "บันทึกการตั้งค่าการเชื่อมต่อ",
'', Filter: "กรอง",
'(Requires appropriate webserver to be configured.)': '', // server info modal
'Save Connection configuration': 'บันทึกการตั้งค่าการเชื่อมต่อ', "Aria2 server info": "ข้อมูลเซอร์เวอร์ Aria2",
'Filter': 'กรอง', "Aria2 Version": "รุ่น Aria2",
// server info modal "Features Enabled": "คุณสมบัติที่เปิดใช้งาน",
'Aria2 server info': 'ข้อมูลเซอร์เวอร์ Aria2', // about modal
'Aria2 Version': 'รุ่น Aria2', "To download the latest version of the project, add issues or to contribute back, head on to":
'Features Enabled': 'คุณสมบัติที่เปิดใช้งาน', "ให้ดาวน์โหลดรุ่นสุดท้ายของโครงการ เพิ่มปัญหา หรือช่วยเหลือมีส่วนร่วม ไปสู่",
// about modal "Or you can open the latest version in the browser through":
'To download the latest version of the project, add issues or to contribute back, head on to': "หรือเปิดรุ่นสุดท้ายในเบราว์เซอร์โดยใช้",
'ให้ดาวน์โหลดรุ่นสุดท้ายของโครงการ เพิ่มปัญหา หรือช่วยเหลือมีส่วนร่วม ไปสู่', Close: "ปิด"
'Or you can open the latest version in the browser through': 'หรือเปิดรุ่นสุดท้ายในเบราว์เซอร์โดยใช้',
'Close': 'ปิด'
}; };

View File

@ -1,140 +1,156 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.tr_TR = { translations.tr_TR = {
// header // header
'Search': 'Arama', Search: "Arama",
// Nav menu // Nav menu
'Add': 'Ekle', Add: "Ekle",
'By URIs': 'URI ile', "By URIs": "URI ile",
'By Torrents': 'Torrent ile', "By Torrents": "Torrent ile",
'By Metalinks': 'Metalink ile', "By Metalinks": "Metalink ile",
'Manage': 'Yönet', Manage: "Yönet",
'Pause All': 'Hepsini Duraklat', "Pause All": "Hepsini Duraklat",
'Resume Paused': 'Devam Et', "Resume Paused": "Devam Et",
'Purge Completed': 'Temizleme Tamamlandı', "Purge Completed": "Temizleme Tamamlandı",
'Settings': 'Ayarlar', Settings: "Ayarlar",
'Connection Settings': 'Bağlantı Ayarları', "Connection Settings": "Bağlantı Ayarları",
'Global Settings': 'Genel Ayarlar', "Global Settings": "Genel Ayarlar",
'Server info': 'Sunucu bilgisi', "Server info": "Sunucu bilgisi",
'About and contribute': 'Hakkında ve katkıda bulunanlar', "About and contribute": "Hakkında ve katkıda bulunanlar",
'Toggle navigation': 'Gezinmeyi aç / kapat', "Toggle navigation": "Gezinmeyi aç / kapat",
// body // body
// nav side bar // nav side bar
'Miscellaneous': 'Çeşitli', Miscellaneous: "Çeşitli",
'Global Statistics': 'Genel İstatistikler', "Global Statistics": "Genel İstatistikler",
'About': 'Hakkında', About: "Hakkında",
'Displaying': 'Gösteriliyor', Displaying: "Gösteriliyor",
'of': ' / ', of: " / ",
'downloads': 'Indirme', downloads: "Indirme",
'Language': 'Dil', Language: "Dil",
// download filters // download filters
'Download Filters': 'İndirme Filtreleri', "Download Filters": "İndirme Filtreleri",
'Running': 'Çalışıyor', Running: "Çalışıyor",
'Active': 'Aktif', Active: "Aktif",
'Waiting': 'Bekliyor', Waiting: "Bekliyor",
'Complete': 'Tamamlandı', Complete: "Tamamlandı",
'Error': 'Hata', Error: "Hata",
'Paused': 'Duraklatıldı', Paused: "Duraklatıldı",
'Removed': 'Silindi', Removed: "Silindi",
'Hide linked meta-data': 'Bağlı meta verileri gizle', "Hide linked meta-data": "Bağlı meta verileri gizle",
'Toggle': 'aç/kapat', Toggle: "aç/kapat",
'Reset filters': 'Filtreleri sıfırla', "Reset filters": "Filtreleri sıfırla",
// starred properties // starred properties
'Quick Access Settings': 'Hızlı Erişim Ayarları', "Quick Access Settings": "Hızlı Erişim Ayarları",
'Save settings': 'Ayarları kaydet', "Save settings": "Ayarları kaydet",
'Currently no download in line to display, use the': 'Şu anda görüntülenebilecek bir indirme yok,', "Currently no download in line to display, use the":
'download button to start downloading files!': 'butonu aracılığı ile dosya indirebilirsiniz!', "Şu anda görüntülenebilecek bir indirme yok,",
'Peers': 'Peers', "download button to start downloading files!": "butonu aracılığı ile dosya indirebilirsiniz!",
'More Info': 'Daha fazla bilgi', Peers: "Peers",
'Remove': 'Kaldır', "More Info": "Daha fazla bilgi",
'# of': '# dan', Remove: "Kaldır",
'Length': 'Uzunluk', "# of": "# dan",
// modals Length: "Uzunluk",
'Add Downloads By URIs': 'URI kullanarak indirmelere ekle', // modals
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "Add Downloads By URIs": "URI kullanarak indirmelere ekle",
'- Ayrı bir satıra her dosya için URI koyarak aynı anda birden fazla dosya indirebilirsiniz.', "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- Ayrı bir satıra her dosya için URI koyarak aynı anda birden fazla dosya indirebilirsiniz.",
'- Aynı dosyalar için birden fazla URI (ayna) da ekleyebilirsiniz. Bunu yapmak için URIları bir boşlukla ayırın.', "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- Bir URI, HTTP(S)/FTP/BitTorrent-Magnet olabilir.', "- Aynı dosyalar için birden fazla URI (ayna) da ekleyebilirsiniz. Bunu yapmak için URIları bir boşlukla ayırın.",
'Download settings': 'İndirme ayarları', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
'Advanced settings': 'Gelişmiş Ayarlar', "- Bir URI, HTTP(S)/FTP/BitTorrent-Magnet olabilir.",
'Cancel': 'İptal et', "Download settings": "İndirme ayarları",
'Start': 'Başlat', "Advanced settings": "Gelişmiş Ayarlar",
'Choose': 'Seçiniz', Cancel: "İptal et",
'Quick Access (shown on the main page)': 'Hızlı Erişim (ana sayfada gösterilir)', Start: "Başlat",
// add torrent modal Choose: "Seçiniz",
'Add Downloads By Torrents': 'Torrent kullanarak indirmelere ekle', "Quick Access (shown on the main page)": "Hızlı Erişim (ana sayfada gösterilir)",
'- Select the torrent from the local filesystem to start the download.': '- İndirmeyi başlatmak için yerel dosya sisteminden torrenti seçin.', // add torrent modal
'- You can select multiple torrents to start multiple downloads.': '- Birden çok indirmeyi başlatmak için birden çok torrent seçebilirsiniz.', "Add Downloads By Torrents": "Torrent kullanarak indirmelere ekle",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- BitTorrent-Magnetli bir URL eklemek için, İstek Üzerine Ekle seçeneğini kullanın ve oraya ekleyin.', "- Select the torrent from the local filesystem to start the download.":
'Select Torrents': 'Torrentleri seçin', "- İndirmeyi başlatmak için yerel dosya sisteminden torrenti seçin.",
'Select a Torrent': 'Bir Torrent seçin', "- You can select multiple torrents to start multiple downloads.":
// add metalink modal "- Birden çok indirmeyi başlatmak için birden çok torrent seçebilirsiniz.",
'Add Downloads By Metalinks': 'Metalink kullanarak indirmelere ekle', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
'Select Metalinks': 'Metalinkleri seçin', "- BitTorrent-Magnetli bir URL eklemek için, İstek Üzerine Ekle seçeneğini kullanın ve oraya ekleyin.",
'- Select the Metalink from the local filesystem to start the download.': '- İndirmeyi başlatmak için yerel dosya sisteminden Metalinki seçin.', "Select Torrents": "Torrentleri seçin",
'- You can select multiple Metalinks to start multiple downloads.': '- Birden fazla yüklemeye başlamak için birden fazla Metalink seçebilirsiniz.', "Select a Torrent": "Bir Torrent seçin",
'Select a Metalink': 'Bir Metalink Seç', // add metalink modal
// select file modal "Add Downloads By Metalinks": "Metalink kullanarak indirmelere ekle",
'Choose files to start download for': 'Için indirmeye başlamak için dosyaları seçin', "Select Metalinks": "Metalinkleri seçin",
'Select to download': 'Indirmek için seçin', "- Select the Metalink from the local filesystem to start the download.":
// settings modal "- İndirmeyi başlatmak için yerel dosya sisteminden Metalinki seçin.",
'Aria2 RPC host and port': 'Aria2 RPC ana bilgisayar ve bağlantı noktası', "- You can select multiple Metalinks to start multiple downloads.":
'Enter the host': 'Ana bilgisayar(host) girin', "- Birden fazla yüklemeye başlamak için birden fazla Metalink seçebilirsiniz.",
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Select a Metalink": "Bir Metalink Seç",
'Aria2 için RPC\'nin çalıştığı sunucunun IP veya DNS adını girin (varsayılan: localhost)', // select file modal
'Enter the port': 'Bağlantı noktasını gir', "Choose files to start download for": "Için indirmeye başlamak için dosyaları seçin",
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Select to download": "Indirmek için seçin",
'Aria2 için RPC\'nin çalıştığı sunucunun bağlantı noktasını girin (varsayılan: 6800)', // settings modal
'Enter the RPC path': 'RPC yolunu girin', "Aria2 RPC host and port": "Aria2 RPC ana bilgisayar ve bağlantı noktası",
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': 'Aria2 RPC bitiş noktası için yolu girin (varsayılan: / jsonrpc)', "Enter the host": "Ana bilgisayar(host) girin",
'SSL/TLS encryption': 'SSL / TLS şifreleme', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enable SSL/TLS encryption': 'SSL / TLS şifrelemeyi etkinleştir', "Aria2 için RPC'nin çalıştığı sunucunun IP veya DNS adını girin (varsayılan: localhost)",
'Enter the secret token (optional)': 'Gizli simge girin (isteğe bağlı)', "Enter the port": "Bağlantı noktasını gir",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Aria2 RPC gizli simgesini girin (kimlik doğrulama etkin değilse boş bırakın)', "Aria2 için RPC'nin çalıştığı sunucunun bağlantı noktasını girin (varsayılan: 6800)",
'Enter the username (optional)': 'Kullanıcı adını girin (isteğe bağlı)', "Enter the RPC path": "RPC yolunu girin",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Aria2 RPC kullanıcı adını girin (kimlik doğrulama etkin değilse boş bırakın)', "Aria2 RPC bitiş noktası için yolu girin (varsayılan: / jsonrpc)",
'Enter the password (optional)': 'Parolayı girin (isteğe bağlı)', "SSL/TLS encryption": "SSL / TLS şifreleme",
'Enter the Aria2 RPC password (empty if authentication not enabled)': 'Aria2 RPC şifresini girin (kimlik doğrulama etkin değilse boş bırakın)', "Enable SSL/TLS encryption": "SSL / TLS şifrelemeyi etkinleştir",
'Enter base URL (optional)': 'Temel URL\'yi girin (isteğe bağlı)', "Enter the secret token (optional)": "Gizli simge girin (isteğe bağlı)",
'Direct Download': 'Direkt indirme', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'If supplied, links will be created to enable direct download from the Aria2 server.': "Aria2 RPC gizli simgesini girin (kimlik doğrulama etkin değilse boş bırakın)",
'Verilen, bağlantıları aria2 sunucudan doğrudan indirmeyi etkinleştirmek için oluşturulur.', "Enter the username (optional)": "Kullanıcı adını girin (isteğe bağlı)",
'(Requires appropriate webserver to be configured.)': '(Uygun web sunucusunun yapılandırılmasını gerektirir.)', "Enter the Aria2 RPC username (empty if authentication not enabled)":
'Save Connection configuration': 'Bağlantı yapılandırmasını kaydedin', "Aria2 RPC kullanıcı adını girin (kimlik doğrulama etkin değilse boş bırakın)",
'Filter':'Filtre', "Enter the password (optional)": "Parolayı girin (isteğe bağlı)",
// server info modal "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Aria2 server info': 'Aria2 sunucu bilgisi', "Aria2 RPC şifresini girin (kimlik doğrulama etkin değilse boş bırakın)",
'Aria2 Version': 'Aria2 Sürümü', "Enter base URL (optional)": "Temel URL'yi girin (isteğe bağlı)",
'Features Enabled': 'Aşağıdaki Özellikler Etkin', "Direct Download": "Direkt indirme",
// about modal "If supplied, links will be created to enable direct download from the Aria2 server.":
'To download the latest version of the project, add issues or to contribute back, head on to': "Verilen, bağlantıları aria2 sunucudan doğrudan indirmeyi etkinleştirmek için oluşturulur.",
'Projenin en son sürümünü indirmek için sorun ekleyin veya katkıda bulunun;', "(Requires appropriate webserver to be configured.)":
'Or you can open the latest version in the browser through': 'Veya en son sürümü tarayıcınız aracılığıyla açabilirsiniz.', "(Uygun web sunucusunun yapılandırılmasını gerektirir.)",
'Close': 'Kapat', "Save Connection configuration": "Bağlantı yapılandırmasını kaydedin",
// lables Filter: "Filtre",
'Download status':'İndirme durumu', // server info modal
'Download Speed':'İndirme hızı', "Aria2 server info": "Aria2 sunucu bilgisi",
'Upload Speed':'Yükleme hızı', "Aria2 Version": "Aria2 Sürümü",
'Estimated time':'Tahmini süre', "Features Enabled": "Aşağıdaki Özellikler Etkin",
'Download Size':'İndirme Boyutu', // about modal
'Downloaded':'İndirildi', "To download the latest version of the project, add issues or to contribute back, head on to":
'Progress':'İlerleme', "Projenin en son sürümünü indirmek için sorun ekleyin veya katkıda bulunun;",
'Download Path':'İndirme Yolu', "Or you can open the latest version in the browser through":
'Uploaded':'Yüklendi', "Veya en son sürümü tarayıcınız aracılığıyla açabilirsiniz.",
'Download GID':'GID\'yi indirin', Close: "Kapat",
'Number of Pieces':'Parça sayısı', // lables
'Piece Length': 'Parça Uzunluğu', "Download status": "İndirme durumu",
'Shutdown Server': 'Sunucuyu Kapat', "Download Speed": "İndirme hızı",
"Upload Speed": "Yükleme hızı",
"Estimated time": "Tahmini süre",
"Download Size": "İndirme Boyutu",
Downloaded: "İndirildi",
Progress: "İlerleme",
"Download Path": "İndirme Yolu",
Uploaded: "Yüklendi",
"Download GID": "GID'yi indirin",
"Number of Pieces": "Parça sayısı",
"Piece Length": "Parça Uzunluğu",
"Shutdown Server": "Sunucuyu Kapat",
'The last connection attempt was unsuccessful. Trying another configuration': 'Son bağlantı girişimi başarısız oldu. Başka bir yapılandırma deneyin', "The last connection attempt was unsuccessful. Trying another configuration":
'Oh Snap!': 'HAydaaaaa!', "Son bağlantı girişimi başarısız oldu. Başka bir yapılandırma deneyin",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': 'Aria2 RPC sunucusuna bağlanılamadı. 10 saniye içinde tekrar deneyecek. Bağlantı ayarlarını, Ayarlar> Bağlantı Ayarları bölümüne giderek kontrol etmek isteyebilirsiniz.', "Oh Snap!": "HAydaaaaa!",
'Successfully connected to Aria2 through its remote RPC …': 'Uzak RPC aracılığıyla Aria2\'ye başarıyla bağlandı ...', "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': 'Uzak RPC aracılığıyla Aria2\'ye başarıyla bağlandı ancak bağlantı hala güvende değil. Tam güvenlik için, Aria2\'yi başlatırken (--rpc-secret bayrağını kullanın) ve bir yetkilendirme gizli simgesi eklemeyi deneyin.', "Aria2 RPC sunucusuna bağlanılamadı. 10 saniye içinde tekrar deneyecek. Bağlantı ayarlarını, Ayarlar> Bağlantı Ayarları bölümüne giderek kontrol etmek isteyebilirsiniz.",
'Trying to connect to aria2 using the new connection configuration': 'Yeni bağlantı yapılandırmasını kullanarak aria2\'ye bağlanmaya çalışılıyor', "Successfully connected to Aria2 through its remote RPC …":
"Uzak RPC aracılığıyla Aria2'ye başarıyla bağlandı ...",
"Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
"Uzak RPC aracılığıyla Aria2'ye başarıyla bağlandı ancak bağlantı hala güvende değil. Tam güvenlik için, Aria2'yi başlatırken (--rpc-secret bayrağını kullanın) ve bir yetkilendirme gizli simgesi eklemeyi deneyin.",
"Trying to connect to aria2 using the new connection configuration":
"Yeni bağlantı yapılandırmasını kullanarak aria2'ye bağlanmaya çalışılıyor"
}; };

View File

@ -1,154 +1,159 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.zh_CN = { translations.zh_CN = {
// header // header
'Search': '搜索', Search: "搜索",
// Nav menu // Nav menu
'Add': '添加', Add: "添加",
'By URIs': '使用链接', "By URIs": "使用链接",
'By Torrents': '使用种子', "By Torrents": "使用种子",
'By Metalinks': '使用 Metalink', "By Metalinks": "使用 Metalink",
'Manage': '管理', Manage: "管理",
'Pause All': '暂停所有', "Pause All": "暂停所有",
'Resume Paused': '恢复下载', "Resume Paused": "恢复下载",
'Purge Completed': '清除已完成', "Purge Completed": "清除已完成",
'Shutdown Server': '关闭服务器', "Shutdown Server": "关闭服务器",
'Settings': '设置', Settings: "设置",
'Connection Settings': '连接设置', "Connection Settings": "连接设置",
'Global Settings': '全局设置', "Global Settings": "全局设置",
'Server info': '服务器信息', "Server info": "服务器信息",
'About and contribute': '关于和捐助', "About and contribute": "关于和捐助",
'Toggle navigation': '切换导航', "Toggle navigation": "切换导航",
// body // body
// nav side bar // nav side bar
'Miscellaneous': '杂项', Miscellaneous: "杂项",
'Global Statistics': '全局统计', "Global Statistics": "全局统计",
'About': '关于', About: "关于",
'Displaying': '正在显示', Displaying: "正在显示",
'of': '/', of: "/",
'downloads': '下载', downloads: "下载",
'Language': '语言', Language: "语言",
// download filters // download filters
'Download Filters': '下载过滤器', "Download Filters": "下载过滤器",
'Running': '运行中', Running: "运行中",
'Active': '活动的', Active: "活动的",
'Waiting': '等待中', Waiting: "等待中",
'Complete': '已完成', Complete: "已完成",
'Error': '出错的', Error: "出错的",
'Paused': '已暂停', Paused: "已暂停",
'Removed': '已删除', Removed: "已删除",
'Hide linked meta-data': '隐藏连接的元数据', "Hide linked meta-data": "隐藏连接的元数据",
'Toggle': '反向选择', Toggle: "反向选择",
'Reset filters': '重置过滤器', "Reset filters": "重置过滤器",
// download status // download status
'Verifing': '正在验证', Verifing: "正在验证",
'Verify Pending': '等待验证', "Verify Pending": "等待验证",
// starred properties // starred properties
'Quick Access Settings': '快速访问设置', "Quick Access Settings": "快速访问设置",
'Save': '保存', Save: "保存",
'Save settings': '保存设置', "Save settings": "保存设置",
'Currently no download in line to display, use the': '当前没有可显示的下载项,使用', "Currently no download in line to display, use the": "当前没有可显示的下载项,使用",
'download button to start downloading files!': '按钮来开始下载!', "download button to start downloading files!": "按钮来开始下载!",
'Peers': 'Peers', Peers: "Peers",
'More Info': '更多信息', "More Info": "更多信息",
'Remove': '删除', Remove: "删除",
'# of': '块数', "# of": "块数",
'Length': '块大小', Length: "块大小",
// modals // modals
'Add Downloads By URIs': '使用链接下载', "Add Downloads By URIs": "使用链接下载",
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- 你可以同时添加多个文件下载任务,每行下载一个文件;', "- 你可以同时添加多个文件下载任务,每行下载一个文件;",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- 你也可以给同一个下载任务添加多个镜像链接,写在一行并用空格分隔每条链接;', "- 你也可以给同一个下载任务添加多个镜像链接,写在一行并用空格分隔每条链接;",
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- 链接可以是 HTTP(S)、FTP 和磁力链接。', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- 链接可以是 HTTP(S)、FTP 和磁力链接。",
'Download settings': '下载设置', "Download settings": "下载设置",
'Advanced settings': '高级设置', "Advanced settings": "高级设置",
'Cancel': '取消', Cancel: "取消",
'Start': '开始', Start: "开始",
'Choose': '选择', Choose: "选择",
'Quick Access (shown on the main page)': '快速访问(在主页上显示)', "Quick Access (shown on the main page)": "快速访问(在主页上显示)",
// add torrent modal // add torrent modal
'Add Downloads By Torrents': '使用种子下载', "Add Downloads By Torrents": "使用种子下载",
'- Select the torrent from the local filesystem to start the download.': '- 从本地文件系统选择种子文件开始下载;', "- Select the torrent from the local filesystem to start the download.":
'- You can select multiple torrents to start multiple downloads.': '- 你可以同时选择多个种子来启动多个下载;', "- 从本地文件系统选择种子文件开始下载;",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- 如果要添加磁力链接,请使用添加链接的方式。', "- You can select multiple torrents to start multiple downloads.":
'Select Torrents': '选择种子文件', "- 你可以同时选择多个种子来启动多个下载;",
'Select a Torrent': '选择种子文件', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
// add metalink modal "- 如果要添加磁力链接,请使用添加链接的方式。",
'Add Downloads By Metalinks': '使用 Metalink 下载', "Select Torrents": "选择种子文件",
'Select Metalinks': '选择 Metalink 文件', "Select a Torrent": "选择种子文件",
'- Select the Metalink from the local filesystem to start the download.': '* 从本地文件系统选择 Metalink 文件开始下载;', // add metalink modal
'- You can select multiple Metalinks to start multiple downloads.': '* 你可以同时选择多个 Metalink 文件来启动多个下载。', "Add Downloads By Metalinks": "使用 Metalink 下载",
'Select a Metalink': '选择 Metalink 文件', "Select Metalinks": "选择 Metalink 文件",
// select file modal "- Select the Metalink from the local filesystem to start the download.":
'Choose files to start download for': '请选择要下载的文件', "* 从本地文件系统选择 Metalink 文件开始下载;",
'Select to download': '选择以下载', "- You can select multiple Metalinks to start multiple downloads.":
// settings modal "* 你可以同时选择多个 Metalink 文件来启动多个下载。",
'Aria2 RPC host and port': 'Aria2 RPC 主机和端口', "Select a Metalink": "选择 Metalink 文件",
'Enter the host': '主机', // select file modal
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Choose files to start download for": "请选择要下载的文件",
'输入 Aria2 RPC 所在服务器的 IP 或域名默认localhost', "Select to download": "选择以下载",
'Enter the port': '端口', // settings modal
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Aria2 RPC host and port": "Aria2 RPC 主机和端口",
'输入 Aria2 RPC 端口号默认6800', "Enter the host": "主机",
'Enter the RPC path': 'RPC 路径', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': '输入 Aria2 RPC 路径(默认:/jsonrpc', "输入 Aria2 RPC 所在服务器的 IP 或域名默认localhost",
'SSL/TLS encryption': 'SSL/TLS 加密', "Enter the port": "端口",
'Enable SSL/TLS encryption': '启用 SSL/TLS 加密', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the secret token (optional)': '密码令牌(可选)', "输入 Aria2 RPC 端口号默认6800",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the RPC path": "RPC 路径",
'输入 Aria2 RPC 密码令牌(如果未启用则留空)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the username (optional)': '用户名(可选)', "输入 Aria2 RPC 路径(默认:/jsonrpc",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "SSL/TLS encryption": "SSL/TLS 加密",
'输入 Aria2 RPC 用户名(如果未启用身份验证则留空)', "Enable SSL/TLS encryption": "启用 SSL/TLS 加密",
'Enter the password (optional)': '密码(可选)', "Enter the secret token (optional)": "密码令牌(可选)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': '输入 Aria2 RPC 密码(如果未启用身份验证则留空)', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Enter base URL (optional)': '基本链接地址(可选)', "输入 Aria2 RPC 密码令牌(如果未启用则留空)",
'Direct Download': '直接下载', "Enter the username (optional)": "用户名(可选)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the Aria2 RPC username (empty if authentication not enabled)":
'如果指定该选项,将会创建可以直接从 Aria2 服务器上下载文件的链接。', "输入 Aria2 RPC 用户名(如果未启用身份验证则留空)",
'(Requires appropriate webserver to be configured.)': '(需要 WEB 服务器配置正确)', "Enter the password (optional)": "密码(可选)",
'Save Connection configuration': '保存连接配置', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Filter':'过滤', "输入 Aria2 RPC 密码(如果未启用身份验证则留空)",
// server info modal "Enter base URL (optional)": "基本链接地址(可选)",
'Aria2 server info': 'Aria2 服务器信息', "Direct Download": "直接下载",
'Aria2 Version': 'Aria2 版本', "If supplied, links will be created to enable direct download from the Aria2 server.":
'Features Enabled': '已启用功能', "如果指定该选项,将会创建可以直接从 Aria2 服务器上下载文件的链接。",
// about modal "(Requires appropriate webserver to be configured.)": "(需要 WEB 服务器配置正确)",
'To download the latest version of the project, add issues or to contribute back, head on to': "Save Connection configuration": "保存连接配置",
'下载最新版本、提交问题或捐助,请访问', Filter: "过滤",
'Or you can open the latest version in the browser through': '直接在浏览器中使用最新版本,请访问', // server info modal
'Close': '关闭', "Aria2 server info": "Aria2 服务器信息",
// labels "Aria2 Version": "Aria2 版本",
'Download status':'当前下载状态', "Features Enabled": "已启用功能",
'Download Speed':'当前下载速度', // about modal
'Upload Speed':'当前上传速度', "To download the latest version of the project, add issues or to contribute back, head on to":
'Estimated time':'预计剩余时间', "下载最新版本、提交问题或捐助,请访问",
'Download Size':'下载总大小', "Or you can open the latest version in the browser through": "直接在浏览器中使用最新版本,请访问",
'Downloaded':'已下载大小', Close: "关闭",
'Progress':'当前下载进度', // labels
'Download Path':'文件下载路径', "Download status": "当前下载状态",
'Uploaded':'已上传大小', "Download Speed": "当前下载速度",
'Download GID':'下载的 GID', "Upload Speed": "当前上传速度",
'Number of Pieces':'文件块数量', "Estimated time": "预计剩余时间",
'Piece Length':'每块大小', "Download Size": "下载总大小",
Downloaded: "已下载大小",
Progress: "当前下载进度",
"Download Path": "文件下载路径",
Uploaded: "已上传大小",
"Download GID": "下载的 GID",
"Number of Pieces": "文件块数量",
"Piece Length": "每块大小",
//alerts //alerts
'The last connection attempt was unsuccessful. Trying another configuration': "The last connection attempt was unsuccessful. Trying another configuration":
'上次连接请求未成功,正在尝试使用另一个配置', "上次连接请求未成功,正在尝试使用另一个配置",
'Oh Snap!': '糟糕!', "Oh Snap!": "糟糕!",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'无法连接到 Aria2 RPC 服务器将在10秒后重试。您可能需要检查连接设置请前往 设置 > 连接设置', "无法连接到 Aria2 RPC 服务器将在10秒后重试。您可能需要检查连接设置请前往 设置 > 连接设置",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'连接到 Aria2 RPC 服务器时认证失败将在10秒后重试。您可能需要确认您的身份验证信息请前往 设置 > 连接设置', "连接到 Aria2 RPC 服务器时认证失败将在10秒后重试。您可能需要确认您的身份验证信息请前往 设置 > 连接设置",
'Successfully connected to Aria2 through its remote RPC …': "Successfully connected to Aria2 through its remote RPC …": "通过 RPC 连接到 Aria2 成功!",
'通过 RPC 连接到 Aria2 成功!', "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "通过 RPC 连接到 Aria2 成功,但是连接并不安全。要想使用安全连接,尝试在启动 Aria2 时添加一个授权密码令牌(通过 --rpc-secret 参数)",
'通过 RPC 连接到 Aria2 成功,但是连接并不安全。要想使用安全连接,尝试在启动 Aria2 时添加一个授权密码令牌(通过 --rpc-secret 参数)', "Trying to connect to aria2 using the new connection configuration":
'Trying to connect to aria2 using the new connection configuration': "正在尝试使用新的连接配置来连接到 Aria2 ……",
'正在尝试使用新的连接配置来连接到 Aria2 ……', "Remove {{name}} and associated meta-data?": "是否删除 {{name}} 和关联的元数据?"
'Remove {{name}} and associated meta-data?':
'是否删除 {{name}} 和关联的元数据?'
}; };

View File

@ -1,154 +1,159 @@
if(typeof translations == 'undefined'){ if (typeof translations == "undefined") {
translations = {}; translations = {};
} }
translations.zh_TW = { translations.zh_TW = {
// header // header
'Search': '搜尋', Search: "搜尋",
// Nav menu // Nav menu
'Add': '新增', Add: "新增",
'By URIs': '使用連結', "By URIs": "使用連結",
'By Torrents': '使用種子', "By Torrents": "使用種子",
'By Metalinks': '使用 Metalink', "By Metalinks": "使用 Metalink",
'Manage': '管理', Manage: "管理",
'Pause All': '暫停所有', "Pause All": "暫停所有",
'Resume Paused': '恢復下載', "Resume Paused": "恢復下載",
'Purge Completed': '清除已完成', "Purge Completed": "清除已完成",
'Shutdown Server': '關閉伺服器', "Shutdown Server": "關閉伺服器",
'Settings': '設定', Settings: "設定",
'Connection Settings': '連線設定', "Connection Settings": "連線設定",
'Global Settings': '全域性設定', "Global Settings": "全域性設定",
'Server info': '伺服器資訊', "Server info": "伺服器資訊",
'About and contribute': '關於和捐助', "About and contribute": "關於和捐助",
'Toggle navigation': '切換導航', "Toggle navigation": "切換導航",
// body // body
// nav side bar // nav side bar
'Miscellaneous': '雜項', Miscellaneous: "雜項",
'Global Statistics': '全域性統計', "Global Statistics": "全域性統計",
'About': '關於', About: "關於",
'Displaying': '正在顯示', Displaying: "正在顯示",
'of': '/', of: "/",
'downloads': '下載', downloads: "下載",
'Language': '語言', Language: "語言",
// download filters // download filters
'Download Filters': '下載過濾器', "Download Filters": "下載過濾器",
'Running': '執行中', Running: "執行中",
'Active': '活動的', Active: "活動的",
'Waiting': '等待中', Waiting: "等待中",
'Complete': '已完成', Complete: "已完成",
'Error': '出錯的', Error: "出錯的",
'Paused': '已暫停', Paused: "已暫停",
'Removed': '已刪除', Removed: "已刪除",
'Hide linked meta-data': '隱藏連線的元資料', "Hide linked meta-data": "隱藏連線的元資料",
'Toggle': '反向選擇', Toggle: "反向選擇",
'Reset filters': '重置過濾器', "Reset filters": "重置過濾器",
// download status // download status
'Verifing': '正在驗證', Verifing: "正在驗證",
'Verify Pending': '等待驗證', "Verify Pending": "等待驗證",
// starred properties // starred properties
'Quick Access Settings': '快速訪問設定', "Quick Access Settings": "快速訪問設定",
'Save': '儲存', Save: "儲存",
'Save settings': '儲存設定', "Save settings": "儲存設定",
'Currently no download in line to display, use the': '當前沒有可顯示的下載項,使用', "Currently no download in line to display, use the": "當前沒有可顯示的下載項,使用",
'download button to start downloading files!': '按鈕來開始下載!', "download button to start downloading files!": "按鈕來開始下載!",
'Peers': 'Peers', Peers: "Peers",
'More Info': '更多資訊', "More Info": "更多資訊",
'Remove': '刪除', Remove: "刪除",
'# of': '塊數', "# of": "塊數",
'Length': '塊大小', Length: "塊大小",
// modals // modals
'Add Downloads By URIs': '使用連結下載', "Add Downloads By URIs": "使用連結下載",
'- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.': "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
'- 你可以同時新增多個檔案下載任務,每行下載一個檔案;', "- 你可以同時新增多個檔案下載任務,每行下載一個檔案;",
'- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.': "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
'- 你也可以給同一個下載任務新增多個映象連結,寫在一行並用空格分隔每條連結;', "- 你也可以給同一個下載任務新增多個映象連結,寫在一行並用空格分隔每條連結;",
'- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.': '- 連結可以是 HTTP(S)、FTP 和磁力連結。', "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- 連結可以是 HTTP(S)、FTP 和磁力連結。",
'Download settings': '下載設定', "Download settings": "下載設定",
'Advanced settings': '高階設定', "Advanced settings": "高階設定",
'Cancel': '取消', Cancel: "取消",
'Start': '開始', Start: "開始",
'Choose': '選擇', Choose: "選擇",
'Quick Access (shown on the main page)': '快速訪問(在主頁上顯示)', "Quick Access (shown on the main page)": "快速訪問(在主頁上顯示)",
// add torrent modal // add torrent modal
'Add Downloads By Torrents': '使用種子下載', "Add Downloads By Torrents": "使用種子下載",
'- Select the torrent from the local filesystem to start the download.': '- 從本地檔案系統選擇種子檔案開始下載;', "- Select the torrent from the local filesystem to start the download.":
'- You can select multiple torrents to start multiple downloads.': '- 你可以同時選擇多個種子來啟動多個下載;', "- 從本地檔案系統選擇種子檔案開始下載;",
'- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.': '- 如果要新增磁力連結,請使用新增連結的方式。', "- You can select multiple torrents to start multiple downloads.":
'Select Torrents': '選擇種子檔案', "- 你可以同時選擇多個種子來啟動多個下載;",
'Select a Torrent': '選擇種子檔案', "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
// add metalink modal "- 如果要新增磁力連結,請使用新增連結的方式。",
'Add Downloads By Metalinks': '使用 Metalink 下載', "Select Torrents": "選擇種子檔案",
'Select Metalinks': '選擇 Metalink 檔案', "Select a Torrent": "選擇種子檔案",
'- Select the Metalink from the local filesystem to start the download.': '* 從本地檔案系統選擇 Metalink 檔案開始下載;', // add metalink modal
'- You can select multiple Metalinks to start multiple downloads.': '* 你可以同時選擇多個 Metalink 檔案來啟動多個下載。', "Add Downloads By Metalinks": "使用 Metalink 下載",
'Select a Metalink': '選擇 Metalink 檔案', "Select Metalinks": "選擇 Metalink 檔案",
// select file modal "- Select the Metalink from the local filesystem to start the download.":
'Choose files to start download for': '請選擇要下載的檔案', "* 從本地檔案系統選擇 Metalink 檔案開始下載;",
'Select to download': '選擇以下載', "- You can select multiple Metalinks to start multiple downloads.":
// settings modal "* 你可以同時選擇多個 Metalink 檔案來啟動多個下載。",
'Aria2 RPC host and port': 'Aria2 RPC 主機和埠', "Select a Metalink": "選擇 Metalink 檔案",
'Enter the host': '主機', // select file modal
'Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)': "Choose files to start download for": "請選擇要下載的檔案",
'輸入 Aria2 RPC 所在伺服器的 IP 或域名預設localhost', "Select to download": "選擇以下載",
'Enter the port': '埠號', // settings modal
'Enter the port of the server on which the RPC for Aria2 is running (default: 6800)': "Aria2 RPC host and port": "Aria2 RPC 主機和埠",
'輸入 Aria2 RPC 埠號預設6800', "Enter the host": "主機",
'Enter the RPC path': 'RPC 路徑', "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
'Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)': '輸入 Aria2 RPC 路徑(預設:/jsonrpc', "輸入 Aria2 RPC 所在伺服器的 IP 或域名預設localhost",
'SSL/TLS encryption': 'SSL/TLS 加密', "Enter the port": "埠號",
'Enable SSL/TLS encryption': '啟用 SSL/TLS 加密', "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
'Enter the secret token (optional)': '密碼令牌(可選)', "輸入 Aria2 RPC 埠號預設6800",
'Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)': "Enter the RPC path": "RPC 路徑",
'輸入 Aria2 RPC 密碼令牌(如果未啟用則留空)', "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
'Enter the username (optional)': '使用者名稱(可選)', "輸入 Aria2 RPC 路徑(預設:/jsonrpc",
'Enter the Aria2 RPC username (empty if authentication not enabled)': "SSL/TLS encryption": "SSL/TLS 加密",
'輸入 Aria2 RPC 使用者名稱(如果未啟用身份驗證則留空)', "Enable SSL/TLS encryption": "啟用 SSL/TLS 加密",
'Enter the password (optional)': '密碼(可選)', "Enter the secret token (optional)": "密碼令牌(可選)",
'Enter the Aria2 RPC password (empty if authentication not enabled)': '輸入 Aria2 RPC 密碼(如果未啟用身份驗證則留空)', "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
'Enter base URL (optional)': '基本連結地址(可選)', "輸入 Aria2 RPC 密碼令牌(如果未啟用則留空)",
'Direct Download': '直接下載', "Enter the username (optional)": "使用者名稱(可選)",
'If supplied, links will be created to enable direct download from the Aria2 server.': "Enter the Aria2 RPC username (empty if authentication not enabled)":
'如果指定該選項,將會建立可以直接從 Aria2 伺服器上下載檔案的連結。', "輸入 Aria2 RPC 使用者名稱(如果未啟用身份驗證則留空)",
'(Requires appropriate webserver to be configured.)': '(需要 WEB 伺服器配置正確)', "Enter the password (optional)": "密碼(可選)",
'Save Connection configuration': '儲存連線配置', "Enter the Aria2 RPC password (empty if authentication not enabled)":
'Filter':'過濾', "輸入 Aria2 RPC 密碼(如果未啟用身份驗證則留空)",
// server info modal "Enter base URL (optional)": "基本連結地址(可選)",
'Aria2 server info': 'Aria2 伺服器資訊', "Direct Download": "直接下載",
'Aria2 Version': 'Aria2 版本', "If supplied, links will be created to enable direct download from the Aria2 server.":
'Features Enabled': '已啟用功能', "如果指定該選項,將會建立可以直接從 Aria2 伺服器上下載檔案的連結。",
// about modal "(Requires appropriate webserver to be configured.)": "(需要 WEB 伺服器配置正確)",
'To download the latest version of the project, add issues or to contribute back, head on to': "Save Connection configuration": "儲存連線配置",
'下載最新版本、提交問題或捐助,請訪問', Filter: "過濾",
'Or you can open the latest version in the browser through': '直接在瀏覽器中使用最新版本,請訪問', // server info modal
'Close': '關閉', "Aria2 server info": "Aria2 伺服器資訊",
// labels "Aria2 Version": "Aria2 版本",
'Download status':'當前下載狀態', "Features Enabled": "已啟用功能",
'Download Speed':'當前下載速度', // about modal
'Upload Speed':'當前上傳速度', "To download the latest version of the project, add issues or to contribute back, head on to":
'Estimated time':'預計剩餘時間', "下載最新版本、提交問題或捐助,請訪問",
'Download Size':'下載總大小', "Or you can open the latest version in the browser through": "直接在瀏覽器中使用最新版本,請訪問",
'Downloaded':'已下載大小', Close: "關閉",
'Progress':'當前下載進度', // labels
'Download Path':'檔案下載路徑', "Download status": "當前下載狀態",
'Uploaded':'已上傳大小', "Download Speed": "當前下載速度",
'Download GID':'下載的 GID', "Upload Speed": "當前上傳速度",
'Number of Pieces':'檔案塊數量', "Estimated time": "預計剩餘時間",
'Piece Length':'每塊大小', "Download Size": "下載總大小",
Downloaded: "已下載大小",
Progress: "當前下載進度",
"Download Path": "檔案下載路徑",
Uploaded: "已上傳大小",
"Download GID": "下載的 GID",
"Number of Pieces": "檔案塊數量",
"Piece Length": "每塊大小",
//alerts //alerts
'The last connection attempt was unsuccessful. Trying another configuration': "The last connection attempt was unsuccessful. Trying another configuration":
'上次連線請求未成功,正在嘗試使用另一個配置', "上次連線請求未成功,正在嘗試使用另一個配置",
'Oh Snap!': '糟糕!', "Oh Snap!": "糟糕!",
'Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings': "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
'無法連線到 Aria2 RPC 伺服器將在10秒後重試。您可能需要檢查連線設定請前往 設定 > 連線設定', "無法連線到 Aria2 RPC 伺服器將在10秒後重試。您可能需要檢查連線設定請前往 設定 > 連線設定",
'Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings': "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
'連線到 Aria2 RPC 伺服器時認證失敗將在10秒後重試。您可能需要確認您的身份驗證資訊請前往 設定 > 連線設定', "連線到 Aria2 RPC 伺服器時認證失敗將在10秒後重試。您可能需要確認您的身份驗證資訊請前往 設定 > 連線設定",
'Successfully connected to Aria2 through its remote RPC …': "Successfully connected to Aria2 through its remote RPC …": "通過 RPC 連線到 Aria2 成功!",
'通過 RPC 連線到 Aria2 成功!', "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
'Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)': "通過 RPC 連線到 Aria2 成功,但是連線並不安全。要想使用安全連線,嘗試在啟動 Aria2 時新增一個授權密碼令牌(通過 --rpc-secret 引數)",
'通過 RPC 連線到 Aria2 成功,但是連線並不安全。要想使用安全連線,嘗試在啟動 Aria2 時新增一個授權密碼令牌(通過 --rpc-secret 引數)', "Trying to connect to aria2 using the new connection configuration":
'Trying to connect to aria2 using the new connection configuration': "正在嘗試使用新的連線配置來連線到 Aria2 ……",
'正在嘗試使用新的連線配置來連線到 Aria2 ……', "Remove {{name}} and associated meta-data?": "是否刪除 {{name}} 和關聯的元資料?"
'Remove {{name}} and associated meta-data?':
'是否刪除 {{name}} 和關聯的元資料?'
}; };

View File

@ -1,46 +1,54 @@
var http = require("http"), var http = require("http"),
url = require("url"), url = require("url"),
path = require("path"), path = require("path"),
fs = require("fs") fs = require("fs");
port = process.argv[2] || 8888; port = process.argv[2] || 8888;
http.createServer(function(request, response) { http
var uri = url.parse(request.url).pathname, .createServer(function(request, response) {
filename = path.join(process.cwd(), uri); var uri = url.parse(request.url).pathname,
filename = path.join(process.cwd(), uri);
var extname = path.extname(filename); var extname = path.extname(filename);
var contentType = 'text/html'; var contentType = "text/html";
switch (extname) { switch (extname) {
case '.js': contentType = 'text/javascript'; break; case ".js":
case '.css': contentType = 'text/css'; break; contentType = "text/javascript";
case '.ico': contentType = 'image/x-icon'; break; break;
case '.svg': contentType = 'image/svg+xml'; break; case ".css":
} contentType = "text/css";
break;
case ".ico":
fs.exists(filename, function(exists) { contentType = "image/x-icon";
if(!exists) { break;
response.writeHead(404, {"Content-Type": "text/plain"}); case ".svg":
response.write("404 Not Found\n"); contentType = "image/svg+xml";
response.end(); break;
return; }
}
if (fs.statSync(filename).isDirectory()) filename += '/index.html'; fs.exists(filename, function(exists) {
if (!exists) {
response.writeHead(404, { "Content-Type": "text/plain" });
response.write("404 Not Found\n");
response.end();
return;
}
fs.readFile(filename, "binary", function(err, file) { if (fs.statSync(filename).isDirectory()) filename += "/index.html";
if(err) {
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.end();
return;
}
response.writeHead(200, {'Content-Type': contentType});
response.write(file, "binary");
response.end();
});
}); fs.readFile(filename, "binary", function(err, file) {
}).listen(parseInt(port, 10)); if (err) {
response.writeHead(500, { "Content-Type": "text/plain" });
response.write(err + "\n");
response.end();
return;
}
response.writeHead(200, { "Content-Type": contentType });
response.write(file, "binary");
response.end();
});
});
})
.listen(parseInt(port, 10));
console.log("WebUI Aria2 Server is running on http://localhost:" + port ); console.log("WebUI Aria2 Server is running on http://localhost:" + port);