summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config.php.example2
-rw-r--r--inc/dictionary.inc.php105
-rw-r--r--inc/message.inc.php52
-rw-r--r--inc/render.inc.php3
-rw-r--r--inc/up_json_encode.php175
-rw-r--r--inc/util.inc.php20
-rw-r--r--index.php15
-rw-r--r--lang/de/flag.pngbin0 -> 483 bytes
-rw-r--r--lang/de/messages-hardcoded.json1
-rw-r--r--lang/de/messages.json45
-rw-r--r--lang/de/templates/dialog-generic.json3
-rw-r--r--lang/de/templates/main-menu-login.json14
-rw-r--r--lang/de/templates/main-menu-logout.json14
-rw-r--r--lang/de/templates/messagebox-error.json3
-rw-r--r--lang/de/templates/messagebox-info.json1
-rw-r--r--lang/de/templates/messagebox-success.json1
-rw-r--r--lang/de/templates/messagebox-warning.json1
-rw-r--r--lang/de/templates/minilinux/download.json1
-rw-r--r--lang/de/templates/minilinux/filelist.json9
-rw-r--r--lang/de/templates/page-adduser.json8
-rw-r--r--lang/de/templates/page-baseconfig.json7
-rw-r--r--lang/de/templates/page-login.json8
-rw-r--r--lang/de/templates/page-main-guest.json5
-rw-r--r--lang/de/templates/page-main.json10
-rw-r--r--lang/de/templates/page-minilinux.json4
-rw-r--r--lang/de/templates/page-news.json12
-rw-r--r--lang/de/templates/page-remote-tgz-list.json5
-rw-r--r--lang/de/templates/page-syslog.json10
-rw-r--r--lang/de/templates/page-vmstore.json15
-rw-r--r--lang/de/templates/pagenav.json1
-rw-r--r--lang/de/templates/serversetup/ipaddress.json7
-rw-r--r--lang/de/templates/serversetup/ipxe.json15
-rw-r--r--lang/de/templates/sysconfig/_page.json18
-rw-r--r--lang/de/templates/sysconfig/ad-checkconnection.json5
-rw-r--r--lang/de/templates/sysconfig/ad-finish.json7
-rw-r--r--lang/de/templates/sysconfig/ad-start.json15
-rw-r--r--lang/de/templates/sysconfig/branding-check.json5
-rw-r--r--lang/de/templates/sysconfig/branding-start.json7
-rw-r--r--lang/de/templates/sysconfig/cfg-finish.json4
-rw-r--r--lang/de/templates/sysconfig/cfg-start.json7
-rw-r--r--lang/de/templates/sysconfig/custom-filelist.json3
-rw-r--r--lang/de/templates/sysconfig/custom-fileselect.json5
-rw-r--r--lang/de/templates/sysconfig/custom-upload.json7
-rw-r--r--lang/de/templates/sysconfig/start.json4
-rw-r--r--lang/de/templates/systemstatus/_page.json8
-rw-r--r--lang/de/templates/systemstatus/addresses.json1
-rw-r--r--lang/de/templates/systemstatus/diskstat.json6
-rw-r--r--lang/de/templates/systemstatus/services.json1
-rw-r--r--lang/de/templates/systemstatus/systeminfo.json15
-rw-r--r--lang/de/templates/translation/_page.json8
-rw-r--r--lang/de/templates/translation/messages.json17
-rw-r--r--lang/de/templates/translation/template.json15
-rw-r--r--lang/de/templates/vmstore/mount.json5
-rw-r--r--lang/en/flag.pngbin0 -> 656 bytes
-rw-r--r--lang/en/messages-hardcoded.json1
-rw-r--r--lang/en/messages.json45
-rw-r--r--lang/en/templates/dialog-generic.json3
-rw-r--r--lang/en/templates/main-menu-login.json14
-rw-r--r--lang/en/templates/main-menu-logout.json14
-rw-r--r--lang/en/templates/messagebox-error.json3
-rw-r--r--lang/en/templates/messagebox-info.json2
-rw-r--r--lang/en/templates/messagebox-success.json2
-rw-r--r--lang/en/templates/messagebox-warning.json2
-rw-r--r--lang/en/templates/minilinux/download.json2
-rw-r--r--lang/en/templates/minilinux/filelist.json9
-rw-r--r--lang/en/templates/page-adduser.json8
-rw-r--r--lang/en/templates/page-baseconfig.json7
-rw-r--r--lang/en/templates/page-login.json8
-rw-r--r--lang/en/templates/page-main-guest.json5
-rw-r--r--lang/en/templates/page-main.json10
-rw-r--r--lang/en/templates/page-minilinux.json4
-rw-r--r--lang/en/templates/page-news.json12
-rw-r--r--lang/en/templates/page-remote-tgz-list.json5
-rw-r--r--lang/en/templates/page-syslog.json10
-rw-r--r--lang/en/templates/page-vmstore.json15
-rw-r--r--lang/en/templates/pagenav.json2
-rw-r--r--lang/en/templates/serversetup/ipaddress.json7
-rw-r--r--lang/en/templates/serversetup/ipxe.json15
-rw-r--r--lang/en/templates/sysconfig/_page.json18
-rw-r--r--lang/en/templates/sysconfig/ad-checkconnection.json5
-rw-r--r--lang/en/templates/sysconfig/ad-finish.json7
-rw-r--r--lang/en/templates/sysconfig/ad-start.json15
-rw-r--r--lang/en/templates/sysconfig/branding-check.json5
-rw-r--r--lang/en/templates/sysconfig/branding-start.json7
-rw-r--r--lang/en/templates/sysconfig/cfg-finish.json4
-rw-r--r--lang/en/templates/sysconfig/cfg-start.json7
-rw-r--r--lang/en/templates/sysconfig/custom-filelist.json3
-rw-r--r--lang/en/templates/sysconfig/custom-fileselect.json5
-rw-r--r--lang/en/templates/sysconfig/custom-upload.json7
-rw-r--r--lang/en/templates/sysconfig/start.json4
-rw-r--r--lang/en/templates/systemstatus/_page.json8
-rw-r--r--lang/en/templates/systemstatus/addresses.json2
-rw-r--r--lang/en/templates/systemstatus/diskstat.json6
-rw-r--r--lang/en/templates/systemstatus/services.json2
-rw-r--r--lang/en/templates/systemstatus/systeminfo.json15
-rw-r--r--lang/en/templates/translation/_page.json8
-rw-r--r--lang/en/templates/translation/messages.json17
-rw-r--r--lang/en/templates/translation/template.json15
-rw-r--r--lang/en/templates/vmstore/mount.json5
-rw-r--r--lang/lang.sql95
-rw-r--r--lang/pt/flag.pngbin0 -> 1115 bytes
-rw-r--r--lang/pt/messages-hardcoded.json1
-rw-r--r--lang/pt/messages.json45
-rw-r--r--lang/pt/templates/dialog-generic.json3
-rw-r--r--lang/pt/templates/main-menu-login.json14
-rw-r--r--lang/pt/templates/main-menu-logout.json14
-rw-r--r--lang/pt/templates/messagebox-error.json3
-rw-r--r--lang/pt/templates/messagebox-info.json1
-rw-r--r--lang/pt/templates/messagebox-success.json1
-rw-r--r--lang/pt/templates/messagebox-warning.json1
-rw-r--r--lang/pt/templates/minilinux/download.json1
-rw-r--r--lang/pt/templates/minilinux/filelist.json9
-rw-r--r--lang/pt/templates/page-adduser.json8
-rw-r--r--lang/pt/templates/page-baseconfig.json7
-rw-r--r--lang/pt/templates/page-login.json8
-rw-r--r--lang/pt/templates/page-main-guest.json5
-rw-r--r--lang/pt/templates/page-main.json10
-rw-r--r--lang/pt/templates/page-minilinux.json4
-rw-r--r--lang/pt/templates/page-news.json12
-rw-r--r--lang/pt/templates/page-remote-tgz-list.json5
-rw-r--r--lang/pt/templates/page-syslog.json10
-rw-r--r--lang/pt/templates/page-vmstore.json15
-rw-r--r--lang/pt/templates/pagenav.json1
-rw-r--r--lang/pt/templates/serversetup/ipaddress.json7
-rw-r--r--lang/pt/templates/serversetup/ipxe.json15
-rw-r--r--lang/pt/templates/sysconfig/_page.json18
-rw-r--r--lang/pt/templates/sysconfig/ad-checkconnection.json5
-rw-r--r--lang/pt/templates/sysconfig/ad-finish.json7
-rw-r--r--lang/pt/templates/sysconfig/ad-start.json15
-rw-r--r--lang/pt/templates/sysconfig/branding-check.json5
-rw-r--r--lang/pt/templates/sysconfig/branding-start.json7
-rw-r--r--lang/pt/templates/sysconfig/cfg-finish.json4
-rw-r--r--lang/pt/templates/sysconfig/cfg-start.json7
-rw-r--r--lang/pt/templates/sysconfig/custom-filelist.json3
-rw-r--r--lang/pt/templates/sysconfig/custom-fileselect.json5
-rw-r--r--lang/pt/templates/sysconfig/custom-upload.json7
-rw-r--r--lang/pt/templates/sysconfig/start.json4
-rw-r--r--lang/pt/templates/systemstatus/_page.json8
-rw-r--r--lang/pt/templates/systemstatus/addresses.json1
-rw-r--r--lang/pt/templates/systemstatus/diskstat.json6
-rw-r--r--lang/pt/templates/systemstatus/services.json1
-rw-r--r--lang/pt/templates/systemstatus/systeminfo.json15
-rw-r--r--lang/pt/templates/translation/_page.json8
-rw-r--r--lang/pt/templates/translation/messages.json17
-rw-r--r--lang/pt/templates/translation/template.json15
-rw-r--r--lang/pt/templates/vmstore/mount.json5
-rw-r--r--modules/adduser.inc.php4
-rw-r--r--modules/baseconfig.inc.php4
-rw-r--r--modules/minilinux.inc.php2
-rw-r--r--modules/news.inc.php6
-rw-r--r--modules/serversetup.inc.php2
-rw-r--r--modules/session.inc.php2
-rw-r--r--modules/sysconfig.inc.php4
-rw-r--r--modules/sysconfig/addconfig.inc.php6
-rw-r--r--modules/sysconfig/addmodule.inc.php4
-rw-r--r--modules/sysconfig/addmodule_ad.inc.php14
-rw-r--r--modules/sysconfig/addmodule_branding.inc.php7
-rw-r--r--modules/sysconfig/addmodule_custom.inc.php12
-rw-r--r--modules/syslog.inc.php1
-rw-r--r--modules/systemstatus.inc.php2
-rw-r--r--modules/translation.inc.php428
-rw-r--r--templates/dialog-generic.html4
-rw-r--r--templates/main-menu-login.html47
-rw-r--r--templates/main-menu-logout.html47
-rw-r--r--templates/main-menu.html37
-rw-r--r--templates/menu-login.html1
-rw-r--r--templates/menu-logout.html1
-rw-r--r--templates/minilinux/filelist.html15
-rw-r--r--templates/page-adduser.html24
-rw-r--r--templates/page-baseconfig.html10
-rw-r--r--templates/page-login.html12
-rw-r--r--templates/page-main-guest.html6
-rw-r--r--templates/page-main.html20
-rw-r--r--templates/page-minilinux.html6
-rw-r--r--templates/page-news.html29
-rw-r--r--templates/page-remote-tgz-list.html8
-rw-r--r--templates/page-syslog.html58
-rw-r--r--templates/page-vmstore.html48
-rw-r--r--templates/serversetup/ipaddress.html14
-rw-r--r--templates/serversetup/ipxe.html36
-rw-r--r--templates/sysconfig/_page.html43
-rw-r--r--templates/sysconfig/ad-checkconnection.html6
-rw-r--r--templates/sysconfig/ad-finish.html8
-rw-r--r--templates/sysconfig/ad-start.html40
-rw-r--r--templates/sysconfig/branding-check.html10
-rw-r--r--templates/sysconfig/branding-start.html12
-rw-r--r--templates/sysconfig/cfg-finish.html4
-rw-r--r--templates/sysconfig/cfg-start.html10
-rw-r--r--templates/sysconfig/custom-filelist.html2
-rw-r--r--templates/sysconfig/custom-fileselect.html6
-rw-r--r--templates/sysconfig/custom-upload.html16
-rw-r--r--templates/sysconfig/start.html4
-rw-r--r--templates/systemstatus/_page.html12
-rw-r--r--templates/systemstatus/diskstat.html14
-rw-r--r--templates/systemstatus/systeminfo.html33
-rw-r--r--templates/translation/_page.html40
-rw-r--r--templates/translation/messages.html107
-rw-r--r--templates/translation/template.html59
-rw-r--r--templates/vmstore/mount.html8
199 files changed, 2509 insertions, 409 deletions
diff --git a/config.php.example b/config.php.example
index d8fcd11a..daea919b 100644
--- a/config.php.example
+++ b/config.php.example
@@ -1,7 +1,7 @@
<?php
// This might leak sensitive information. Never enable in production!
-define('CONFIG_DEBUG', true);
+define('CONFIG_DEBUG', false);
define('CONFIG_SESSION_DIR', '/tmp/openslx');
define('CONFIG_SESSION_TIMEOUT', 86400 * 3);
diff --git a/inc/dictionary.inc.php b/inc/dictionary.inc.php
new file mode 100644
index 00000000..14305c99
--- /dev/null
+++ b/inc/dictionary.inc.php
@@ -0,0 +1,105 @@
+<?php
+
+class Dictionary
+{
+
+ private static $messageArray = array();
+ private static $languages;
+ private static $templateCache = array();
+ private static $hardcodedMessages = false;
+
+ public static function init()
+ {
+ self::$languages = array();
+ foreach (glob('lang/??', GLOB_ONLYDIR) as $lang) {
+ $lang = basename($lang);
+ if ($lang === '..')
+ continue;
+ self::$languages[] = $lang;
+ }
+
+ //Changes the language in case there is a request to
+ $lang = Request::get('lang');
+ if ($lang !== false && in_array($lang, self::$languages)) {
+ setcookie('lang', $lang, time() + 60 * 60 * 24 * 30 * 12);
+ $url = Request::get('url');
+ if ($url === false && isset($_SERVER['HTTP_REFERER']))
+ $url = $_SERVER['HTTP_REFERER'];
+ if ($url === false)
+ $url = '?do=Main';
+ Util::redirect($url);
+ }
+
+ //Default language
+ $language = 'en';
+
+ if (isset($_COOKIE['lang']) && in_array($_COOKIE['lang'], self::$languages)) {
+ // Did user override language?
+ $language = $_COOKIE['lang'];
+ } else if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+ $langs = preg_split('/[,\s]+/', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+ foreach ($langs as $lang) {
+ $lang = substr($lang, 0, 2);
+ if (in_array($lang, self::$languages)) {
+ $language = $lang;
+ break;
+ }
+ }
+ }
+
+ define('LANG', $language);
+ }
+
+ public static function getArrayTemplate($template, $lang = false)
+ {
+ return self::getArray('templates/' . $template, $lang);
+ }
+
+ public static function getArray($section, $lang = false)
+ {
+ if ($lang === false)
+ $lang = LANG;
+ $file = Util::safePath("lang/" . $lang . "/" . $section . ".json");
+ if (isset(self::$templateCache[$file]))
+ return self::$templateCache[$file];
+ $language = array('lang' => $lang);
+ $content = @file_get_contents($file);
+ if ($content === false) // File does not exist for language
+ return $language;
+ $json = json_decode($content, true);
+ if (!is_array($json))
+ return $language;
+ return self::$templateCache[$file] = array_merge($language, $json);
+ }
+
+ public static function translate($string)
+ {
+ if (self::$hardcodedMessages === false)
+ self::$hardcodedMessages = json_decode(file_get_contents("lang/" . LANG . "/messages-hardcoded.json"), true);
+ if (!isset(self::$hardcodedMessages[$string]))
+ return "(missing: $string :missing)";
+ return self::$hardcodedMessages[$string];
+ }
+
+ public static function getMessage($id)
+ {
+ if (self::$messageArray === false)
+ self::$messageArray = json_decode(file_get_contents("lang/" . LANG . "/messages.json"), true);
+ if (!isset(self::$messageArray[$id]))
+ return "(missing: $id :missing)";
+ return self::$messageArray[$id];
+ }
+
+ /**
+ * Get all supported languages as array
+ * @return array List of languages (2 char id)
+ */
+ public static function getLanguages()
+ {
+ return self::$languages;
+ }
+
+}
+
+Dictionary::init();
+
diff --git a/inc/message.inc.php b/inc/message.inc.php
index fbace2fa..0e054846 100644
--- a/inc/message.inc.php
+++ b/inc/message.inc.php
@@ -1,47 +1,5 @@
<?php
-// TODO: Move to extra file
-global $error_text;
-$error_text = array(
- 'loginfail' => 'Benutzername oder Kennwort falsch',
- 'token' => 'Ungültiges Token. CSRF Angriff?',
- 'adduser-disabled' => 'Keine ausreichenden Rechte, um weitere Benutzer hinzuzufügen',
- 'password-mismatch' => 'Passwort und Passwortbestätigung stimmen nicht überein',
- 'empty-field' => 'Ein Feld wurde nicht ausgefüllt',
- 'adduser-success' => 'Benutzer erfolgreich hinzugefügt',
- 'no-permission' => 'Keine ausreichenden Rechte, um auf diese Seite zuzugreifen',
- 'settings-updated' => 'Einstellungen wurden aktualisiert',
- 'debug-mode' => 'Der Debug-Modus ist aktiv!',
- 'value-invalid' => 'Der Wert {{1}} ist ungültig für die Option {{0}} und wurde ignoriert',
- 'invalid-action' => 'Ungültige Aktion: {{0}}',
- 'remote-timeout' => 'Konnte Ressource {{0}} nicht herunterladen ({{1}})',
- 'remote-parse-failed' => 'Parsen der empfangenen Daten fehlgeschlagen ({{0}})',
- 'missing-file' => 'Es wurde keine Datei ausgewählt!',
- 'invalid-file' => 'Die Datei {{0}} existiert nicht!',
- 'upload-complete' => 'Upload von {{0}} war erfolgreich',
- 'upload-failed' => 'Upload schlug fehl: {{0}}',
- 'config-activated' => 'Konfiguration {{0}} wurde aktiviert',
- 'config-invalid' => 'Konfiguration mit ID {{0}} existiert nicht',
- 'error-write' => 'Fehler beim Schreiben von {{0}}',
- 'error-read' => 'Fehler beim Lesen von {{0}}',
- 'error-archive' => 'Korruptes Archiv oder nicht unterstütztes Format',
- 'error-rename' => 'Konnte {{0}} nicht in {{1}} umbenennen',
- 'error-nodir' => 'Das Verzeichnis {{0}} existiert nicht.',
- 'empty-archive' => 'Das Archiv enthält keine Dateien oder Verzeichnisse',
- 'error-extract' => 'Konnte Archiv nicht nach {{0}} entpacken - {{1}}',
- 'module-added' => 'Modul erfolgreich hinzugefügt',
- 'module-deleted' => 'Modul {{0}} wurde gelöscht',
- 'module-in-use' => 'Modul {{0}} wird noch durch Konfiguration {{1}} verwendet',
- 'taskmanager-error' => 'Verbindung zum Taskmanager fehlgeschlagen',
- 'taskmanager-format' => 'Taskmanager hat ungültige Daten zurückgeliefert',
- 'task-error' => 'Ausführung fehlgeschlagen: {{0}}',
- 'invalid-ip' => 'Kein Interface ist auf die Adresse {{0}} konfiguriert',
- 'news-save-success' => 'News erfolgreich gespeichert',
- 'news-empty' => 'Es wurde keine News in der Datenbank gefunden',
- 'news-del-success' => 'News gelöscht',
- 'reboot-unconfirmed' => 'Sicherheitsabfrage zum Reboot nicht bestätigt',
-);
-
class Message
{
private static $list = array();
@@ -79,8 +37,6 @@ class Message
*/
private static function add($type, $id, $params)
{
- global $error_text;
- if (!isset($error_text[$id])) Util::traceError('Invalid message id: ' . $id);
self::$list[] = array(
'type' => $type,
'id' => $id,
@@ -96,11 +52,10 @@ class Message
*/
public static function renderList()
{
- global $error_text;
// Ajax
if (AJAX) {
foreach (self::$list as $item) {
- $message = $error_text[$item['id']];
+ $message = Dictionary::getMessage($item['id']);
foreach ($item['params'] as $index => $text) {
$message = str_replace('{{' . $index . '}}', '<b>' . htmlspecialchars($text) . '</b>', $message);
}
@@ -112,7 +67,7 @@ class Message
// Non-Ajax
if (!self::$flushed) Render::openTag('div', array('class' => 'container'));
foreach (self::$list as $item) {
- $message = $error_text[$item['id']];
+ $message = Dictionary::getMessage($item['id']);
foreach ($item['params'] as $index => $text) {
$message = str_replace('{{' . $index . '}}', '<b>' . htmlspecialchars($text) . '</b>', $message);
}
@@ -130,10 +85,9 @@ class Message
*/
public static function asString()
{
- global $error_text;
$return = '';
foreach (self::$list as $item) {
- $message = $error_text[$item['id']];
+ $message = Dictionary::getMessage($item['id']);
foreach ($item['params'] as $index => $text) {
$message = str_replace('{{' . $index . '}}', $text, $message);
}
diff --git a/inc/render.inc.php b/inc/render.inc.php
index 5eabdaca..0b891c80 100644
--- a/inc/render.inc.php
+++ b/inc/render.inc.php
@@ -163,9 +163,10 @@ class Render
*/
public static function parse($template, $params = false)
{
+ $dictionary = Dictionary::getArrayTemplate($template);
if (is_array($params) || $params === false || is_null($params))
$params['token'] = Session::get('token');
- return self::$mustache->render(self::getTemplate($template), $params);
+ return self::$mustache->render(self::getTemplate($template), array_merge($dictionary,$params));
}
/**
diff --git a/inc/up_json_encode.php b/inc/up_json_encode.php
new file mode 100644
index 00000000..07fcb0c7
--- /dev/null
+++ b/inc/up_json_encode.php
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * api: php
+ * title: upgrade.php
+ * description: Emulates functions from new PHP versions on older interpreters.
+ * version: 19
+ * license: Public Domain
+ * url: http://freshmeat.net/projects/upgradephp
+ * type: functions
+ * category: library
+ * priority: auto
+ * load_if: (PHP_VERSION<5.2)
+ * sort: -255
+ * provides: upgrade-php, api:php5, json
+ *
+ *
+ * By loading this library you get PHP version independence. It provides
+ * downwards compatibility to older PHP interpreters by emulating missing
+ * functions or constants using IDENTICAL NAMES. So this doesn't slow down
+ * script execution on setups where the native functions already exist. It
+ * is meant as quick drop-in solution. It spares you from rewriting code or
+ * using cumbersome workarounds instead of the more powerful v5 functions.
+ *
+ * It cannot mirror PHP5s extended OO-semantics and functionality into PHP4
+ * however. A few features are added here that weren't part of PHP yet. And
+ * some other function collections are separated out into the ext/ directory.
+ * It doesn't produce many custom error messages (YAGNI), and instead leaves
+ * reporting to invoked functions or for native PHP execution.
+ *
+ * And further this is PUBLIC DOMAIN (no copyright, no license, no warranty)
+ * so therefore compatible to ALL open source licenses. You could rip this
+ * paragraph out to republish this instead only under more restrictive terms
+ * or your favorite license (GNU LGPL/GPL, BSDL, MPL/CDDL, Artistic/PHPL, ..)
+ *
+ * Any contribution is appreciated. <milky*users#sf#net>
+ *
+ */
+/**
+ * -------------------------- FUTURE ---
+ * @group SVN
+ * @since future
+ *
+ * Following functions aren't implemented in current PHP versions, but
+ * might already be in CVS/SVN.
+ *
+ * @removed
+ * setcookie2
+ *
+ */
+/**
+ * Converts PHP variable or array into a "JSON" (JavaScript value expression
+ * or "object notation") string.
+ *
+ * @compat
+ * Output seems identical to PECL versions. "Only" 20x slower than PECL version.
+ * @bugs
+ * Doesn't take care with unicode too much - leaves UTF-8 sequences alone.
+ *
+ * @param $var mixed PHP variable/array/object
+ * @return string transformed into JSON equivalent
+ */
+if (!defined("JSON_HEX_TAG")) {
+ define("JSON_HEX_TAG", 1);
+ define("JSON_HEX_AMP", 2);
+ define("JSON_HEX_APOS", 4);
+ define("JSON_HEX_QUOT", 8);
+ define("JSON_FORCE_OBJECT", 16);
+}
+if (!defined("JSON_NUMERIC_CHECK")) {
+ define("JSON_NUMERIC_CHECK", 32); // 5.3.3
+}
+if (!defined("JSON_UNESCAPED_SLASHES")) {
+ define("JSON_UNESCAPED_SLASHES", 64); // 5.4.0
+ define("JSON_PRETTY_PRINT", 128); // 5.4.0
+ define("JSON_UNESCAPED_UNICODE", 256); // 5.4.0
+}
+
+function up_json_encode($var, $options = 0, $_indent = "")
+{
+ global ${'.json_last_error'};
+ ${'.json_last_error'} = JSON_ERROR_NONE;
+
+ #-- prepare JSON string
+ list($_space, $_tab, $_nl) = ($options & JSON_PRETTY_PRINT) ? array(" ", " $_indent", "\n") : array("", "", "");
+ $json = "$_indent";
+
+ if (($options & JSON_NUMERIC_CHECK) and is_string($var) and is_numeric($var)) {
+ $var = (strpos($var, ".") || strpos($var, "e")) ? floatval($var) : intval($var);
+ }
+
+ #-- add array entries
+ if (is_array($var) || ($obj = is_object($var))) {
+ $obj = is_object($var);
+ #-- check if array is associative
+ if (!$obj && !($options & JSON_FORCE_OBJECT)) {
+ $keys = array_keys($var);
+ sort($keys);
+ for ($i = 0; $i < count($keys); ++$i) {
+ if (!is_numeric($keys[$i]) || (int)$keys[$i] !== $i)
+ $obj = true;
+ }
+ } else {
+ $obj = true;
+ }
+
+ #-- concat individual entries
+ $empty = 0;
+ $json = "";
+ foreach ((array) $var as $i => $v) {
+ $json .= ($empty++ ? ",$_nl" : "") // comma separators
+ . $_tab . ($obj ? (up_json_encode((string)$i, $options & ~JSON_NUMERIC_CHECK, $_tab) . ":$_space") : "") // assoc prefix
+ . (up_json_encode($v, $options, $_tab)); // value
+ }
+
+ #-- enclose into braces or brackets
+ $json = $obj ? "{" . "$_nl$json$_nl$_indent}" : "[$_nl$json$_nl$_indent]";
+ }
+
+ #-- strings need some care
+ elseif (is_string($var)) {
+
+ if (!empty($var) && mb_detect_encoding($var, 'UTF-8', true) === false) {
+ trigger_error("up_json_encode: invalid UTF-8 encoding in string '$var', cannot proceed.", E_USER_WARNING);
+ $var = NULL;
+ }
+ $rewrite = array(
+ "\\" => "\\\\",
+ "\"" => "\\\"",
+ "\010" => "\\b",
+ "\f" => "\\f",
+ "\n" => "\\n",
+ "\r" => "\\r",
+ "\t" => "\\t",
+ "/" => $options & JSON_UNESCAPED_SLASHES ? "/" : "\\/",
+ "<" => $options & JSON_HEX_TAG ? "\\u003C" : "<",
+ ">" => $options & JSON_HEX_TAG ? "\\u003E" : ">",
+ "'" => $options & JSON_HEX_APOS ? "\\u0027" : "'",
+ "\"" => $options & JSON_HEX_QUOT ? "\\u0022" : "\"",
+ "&" => $options & JSON_HEX_AMP ? "\\u0026" : "&",
+ );
+ $var = strtr($var, $rewrite);
+ //@COMPAT control chars should probably be stripped beforehand, not escaped as here
+ if (function_exists("iconv") && ($options & JSON_UNESCAPED_UNICODE) == 0) {
+ $var = preg_replace("/[^\\x{0020}-\\x{007F}]/ue", "'\\u'.current(unpack('H*', iconv('UTF-8', 'UCS-2BE', '$0')))", $var);
+ }
+ $json = '"' . $var . '"';
+ }
+
+ #-- basic types
+ elseif (is_bool($var)) {
+ $json = $var ? "true" : "false";
+ } elseif ($var === NULL) {
+ $json = "null";
+ } elseif (is_int($var)) {
+ $json = "$var";
+ } elseif (is_float($var)) {
+ if (is_nan($var) || is_infinite($var)) {
+ ${'.json_last_error'} = JSON_ERROR_INF_OR_NAN;
+ return;
+ } else {
+ $json = "$var";
+ }
+ }
+
+ #-- something went wrong
+ else {
+ trigger_error("up_json_encode: don't know what a '" . gettype($var) . "' is.", E_USER_WARNING);
+ ${'.json_last_error'} = JSON_ERROR_UNSUPPORTED_TYPE;
+ return;
+ }
+
+ #-- done
+ return($json);
+}
diff --git a/inc/util.inc.php b/inc/util.inc.php
index 45a6b684..109c0c5d 100644
--- a/inc/util.inc.php
+++ b/inc/util.inc.php
@@ -103,6 +103,26 @@ class Util
return preg_replace('/[^a-zA-Z0-9_\-]+/', '_', $name);
}
+ public static function safePath($path, $prefix = '')
+ {
+ if (empty($path))
+ return false;
+ $path = trim($path);
+ if ($path{0} == '/' || preg_match('/[\x00-\x19\?\*]/', $path))
+ return false;
+ if (strpos($path, '..') !== false)
+ return false;
+ if (substr($path, 0, 2) !== './')
+ $path = "./$path";
+ if (empty($prefix))
+ return $path;
+ if (substr($prefix, 0, 2) !== './')
+ $prefix = "./$prefix";
+ if (substr($path, 0, strlen($prefix)) !== $prefix)
+ return false;
+ return $path;
+ }
+
/**
* Create human readable error description from a $_FILES[<..>]['error'] code
*
diff --git a/index.php b/index.php
index 4b83baaa..8efb21ed 100644
--- a/index.php
+++ b/index.php
@@ -2,6 +2,8 @@
require_once 'config.php';
+require_once('inc/user.inc.php');
+
/**
* Page class which all "modules" must be extending from
*/
@@ -112,8 +114,17 @@ if (AJAX) {
Page::preprocess();
// Generate Main menu
-$menu = new Menu;
-Render::addTemplate('main-menu', $menu);
+//$menu = new Menu;
+if (User::getName() === false) {
+ Render::addTemplate('main-menu-login', array(
+ 'url' => urlencode($_SERVER['REQUEST_URI'])
+ ));
+} else {
+ Render::addTemplate('main-menu-logout', array(
+ 'url' => urlencode($_SERVER['REQUEST_URI']),
+ 'user' => User::getName()
+ ));
+}
Message::renderList();
diff --git a/lang/de/flag.png b/lang/de/flag.png
new file mode 100644
index 00000000..e840992d
--- /dev/null
+++ b/lang/de/flag.png
Binary files differ
diff --git a/lang/de/messages-hardcoded.json b/lang/de/messages-hardcoded.json
new file mode 100644
index 00000000..16c98d2c
--- /dev/null
+++ b/lang/de/messages-hardcoded.json
@@ -0,0 +1 @@
+{"lang_unknwonTaskManager":"Unbekannter Taskmanager-Fehler","lang_configurationCompilation":"Konfiguration zusammenstellen","lang_moduleAdd":"Modul hinzuf\u00fcgen","lang_adAuthentication":"Active Directory Authentifizierung","lang_adModule":"Mit diesem Modul ist die Anmeldung an den Client PCs mit den Benutzerkonten eines Active Directory m\u00f6glich. Je nach Konfiguration ist auch die Nutzung eines Benutzerverzeichnisses auf dem Client m\u00f6glich.","lang_authentication":"Authentifizierung","lang_generic":"Generisch","lang_addCustomModuleInfo":"Mit einem Erweiterten Modul ist es m\u00f6glich, beliebige Dateien zum Grundsystem hinzuzuf\u00fcgen Nutzen Sie dieses Modul, um z.B. spezielle Konfigurationsdateien auf den Client PCs zu verwenden, die sich nicht mit einem der anderen Wizards erstellen l\u00e4sst. Das Hinzuf\u00fcgen eines Erweiterten Moduls erfordert in der Regel zumindest grundlegende Systemkenntnisse im Linuxbereich.","lang_days":"Tag(e)","lang_hours":"Stunde(n)","lang_specificLogo":"Einrichtungsspezifisches Logo","lang_institutionLogo":"Logo der Einrichtung","lang_infoLogo":"Dieses Modul dient dem Hinzuf\u00fcgen eines Logos der Hochschule\/Universit\u00e4t, welches dann z.B. auf dem Anmeldebildschirm angezeigt wird.","lang_location":"Lokalisierung","lang_contentOf":"Inhalt von \"","lang_serverConfiguration":"Serverseitige Konfiguration","lang_login":"Anmelden","lang_createUser":"Benutzer anlegen"} \ No newline at end of file
diff --git a/lang/de/messages.json b/lang/de/messages.json
new file mode 100644
index 00000000..db10fbad
--- /dev/null
+++ b/lang/de/messages.json
@@ -0,0 +1,45 @@
+{
+ "adduser-disabled": "Keine ausreichenden Rechte, um weitere Benutzer hinzuzuf\u00fcgen",
+ "adduser-success": "Benutzer erfolgreich hinzugef\u00fcgt",
+ "config-activated": "Konfiguration {{0}} wurde aktiviert",
+ "config-invalid": "Konfiguration mit ID {{0}} existiert nicht",
+ "debug-mode": "Der Debug-Modus ist aktiv!",
+ "deleted-tag": "Tag wurde entfernt",
+ "empty-archive": "Das Archiv enth\u00e4lt keine Dateien oder Verzeichnisse",
+ "empty-field": "Ein Feld wurde nicht ausgef\u00fcllt",
+ "error-archive": "Korruptes Archiv oder nicht unterst\u00fctztes Format",
+ "error-extract": "Konnte Archiv nicht nach {{0}} entpacken - {{1}}",
+ "error-nodir": "Das Verzeichnis {{0}} existiert nicht.",
+ "error-read": "Fehler beim Lesen von {{0}}",
+ "error-rename": "Konnte {{0}} nicht in {{1}} umbenennen",
+ "error-write": "Fehler beim Schreiben von {{0}}",
+ "i18n-empty-tag": "Ein String wurde ohne Tag \u00fcbermittelt.",
+ "i18n-invalid-lang": "Ung\u00fcltige Sprache: {{0}}",
+ "invalid-action": "Ung\u00fcltige Aktion: {{0}}",
+ "invalid-file": "Die Datei {{0}} existiert nicht!",
+ "invalid-ip": "Kein Interface ist auf die Adresse {{0}} konfiguriert",
+ "invalid-template": "Ausgew\u00e4hlte Template ist nicht g\u00fcltig",
+ "loginfail": "Benutzername oder Kennwort falsch",
+ "missing-file": "Es wurde keine Datei ausgew\u00e4hlt!",
+ "module-added": "Modul erfolgreich hinzugef\u00fcgt",
+ "module-deleted": "Modul {{0}} wurde gel\u00f6scht",
+ "module-in-use": "Modul {{0}} wird noch durch Konfiguration {{1}} verwendet",
+ "news-del-success": "News gel\u00f6scht",
+ "news-empty": "Es wurde keine News in der Datenbank gefunden",
+ "news-save-success": "News erfolgreich aktualisiert",
+ "no-permission": "Keine ausreichenden Rechte, um auf diese Seite zuzugreifen",
+ "password-mismatch": "Passwort und Passwortbest\u00e4tigung stimmen nicht \u00fcberein",
+ "reboot-unconfirmed": "Sicherheitsabfrage zum Reboot nicht best\u00e4tigt",
+ "remote-parse-failed": "Parsen der empfangenen Daten fehlgeschlagen ({{0}})",
+ "remote-timeout": "Konnte Ressource {{0}} nicht herunterladen ({{1}})",
+ "settings-updated": "Einstellungen wurden aktualisiert",
+ "task-error": "Ausf\u00fchrung fehlgeschlagen: {{0}}",
+ "taskmanager-error": "Verbindung zum Taskmanager fehlgeschlagen",
+ "taskmanager-format": "Taskmanager hat ung\u00fcltige Daten zur\u00fcckgeliefert",
+ "token": "Ung\u00fcltiges Token. CSRF Angriff?",
+ "unsuccessful-action": "Nicht erfolgreich",
+ "updated-tags": "Tags wurden aktualisiert",
+ "upload-complete": "Upload von {{0}} war erfolgreich",
+ "upload-failed": "Upload schlug fehl: {{0}}",
+ "value-invalid": "Der Wert {{1}} ist ung\u00fcltig f\u00fcr die Option {{0}} und wurde ignoriert"
+} \ No newline at end of file
diff --git a/lang/de/templates/dialog-generic.json b/lang/de/templates/dialog-generic.json
new file mode 100644
index 00000000..ff429fdd
--- /dev/null
+++ b/lang/de/templates/dialog-generic.json
@@ -0,0 +1,3 @@
+{
+ "lang_next": "Weiter"
+} \ No newline at end of file
diff --git a/lang/de/templates/main-menu-login.json b/lang/de/templates/main-menu-login.json
new file mode 100644
index 00000000..083d68a7
--- /dev/null
+++ b/lang/de/templates/main-menu-login.json
@@ -0,0 +1,14 @@
+{
+ "lang_administration": "\u00dcbersetzungen",
+ "lang_client": "Client",
+ "lang_clientLog": "Client Log",
+ "lang_configurationBasic": "Grundkonfiguration",
+ "lang_configurationVariables": "KonfigurationsVariablen",
+ "lang_language": "Sprachen",
+ "lang_localization": "Lokalisierung",
+ "lang_login": "Anmelden",
+ "lang_news": "News",
+ "lang_server": "Server",
+ "lang_settings": "Einstellungen",
+ "lang_vmLocation": "VM Speicherort"
+} \ No newline at end of file
diff --git a/lang/de/templates/main-menu-logout.json b/lang/de/templates/main-menu-logout.json
new file mode 100644
index 00000000..6b7ba9ff
--- /dev/null
+++ b/lang/de/templates/main-menu-logout.json
@@ -0,0 +1,14 @@
+{
+ "lang_administration": "\u00dcbersetzungen",
+ "lang_client": "Client",
+ "lang_clientLog": "Client Log",
+ "lang_configurationBasic": "Grundkonfiguration",
+ "lang_configurationVariables": "KonfigurationsVariablen",
+ "lang_language": "Sprachen",
+ "lang_localization": "Lokalisierung",
+ "lang_logout": "Abmelden",
+ "lang_news": "News",
+ "lang_server": "Server",
+ "lang_settings": "Einstellungen",
+ "lang_vmLocation": "VM Speicherort"
+} \ No newline at end of file
diff --git a/lang/de/templates/messagebox-error.json b/lang/de/templates/messagebox-error.json
new file mode 100644
index 00000000..c44dc44f
--- /dev/null
+++ b/lang/de/templates/messagebox-error.json
@@ -0,0 +1,3 @@
+[
+
+] \ No newline at end of file
diff --git a/lang/de/templates/messagebox-info.json b/lang/de/templates/messagebox-info.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/de/templates/messagebox-info.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/de/templates/messagebox-success.json b/lang/de/templates/messagebox-success.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/de/templates/messagebox-success.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/de/templates/messagebox-warning.json b/lang/de/templates/messagebox-warning.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/de/templates/messagebox-warning.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/de/templates/minilinux/download.json b/lang/de/templates/minilinux/download.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/de/templates/minilinux/download.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/de/templates/minilinux/filelist.json b/lang/de/templates/minilinux/filelist.json
new file mode 100644
index 00000000..ec659d1e
--- /dev/null
+++ b/lang/de/templates/minilinux/filelist.json
@@ -0,0 +1,9 @@
+{
+ "lang_actual": "Aktuell",
+ "lang_canUpdate1": "Mindestens eine Komponente von",
+ "lang_canUpdate2": "kann aktualisiert werden. F\u00fcr einen reibungslosen Betrieb wird empfohlen, alle Komponenten auf dem aktuellen Stand zu halten.",
+ "lang_configurationPackageNotFound": "Keine Konfigurationspakete gefunden!",
+ "lang_outdated": "Veraltet",
+ "lang_systemUpdated": "Das System ist auf dem aktuellen Stand.",
+ "lang_update": "Aktualisieren"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-adduser.json b/lang/de/templates/page-adduser.json
new file mode 100644
index 00000000..0f446025
--- /dev/null
+++ b/lang/de/templates/page-adduser.json
@@ -0,0 +1,8 @@
+{
+ "lang_confirmation": "Wiederholen",
+ "lang_createUser": "Benutzer anlegen",
+ "lang_fullName": "Vollst\u00e4ndiger Name",
+ "lang_password": "Passwort",
+ "lang_telephone": "Telefon",
+ "lang_username": "Benutzerkennung"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-baseconfig.json b/lang/de/templates/page-baseconfig.json
new file mode 100644
index 00000000..fe62ab86
--- /dev/null
+++ b/lang/de/templates/page-baseconfig.json
@@ -0,0 +1,7 @@
+{
+ "lang_basicConfiguration": "Basiskonfiguration",
+ "lang_close": "Schlie\u00dfen",
+ "lang_help": "Hilfe",
+ "lang_reset": "Zur\u00fccksetzen",
+ "lang_save": "Speichern"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-login.json b/lang/de/templates/page-login.json
new file mode 100644
index 00000000..03576a07
--- /dev/null
+++ b/lang/de/templates/page-login.json
@@ -0,0 +1,8 @@
+{
+ "lang_enter": "Anmeldung",
+ "lang_login": "Anmelden",
+ "lang_password": "Passwort",
+ "lang_register": "Registrieren",
+ "lang_rememberID": "Angemeldet bleiben",
+ "lang_username": "Benutzerkennung"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-main-guest.json b/lang/de/templates/page-main-guest.json
new file mode 100644
index 00000000..efd11954
--- /dev/null
+++ b/lang/de/templates/page-main-guest.json
@@ -0,0 +1,5 @@
+{
+ "lang_introGuest": "Dies ist das Administrations-Interface der lokalen bwLehrpool-Installation. Bitte authentifizieren Sie sich, um Einstellungen vorzunehmen.",
+ "lang_login": "Anmelden",
+ "lang_welcome": "Willkommen"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-main.json b/lang/de/templates/page-main.json
new file mode 100644
index 00000000..f2db5ac6
--- /dev/null
+++ b/lang/de/templates/page-main.json
@@ -0,0 +1,10 @@
+{
+ "lang_bootMenuWarning": "Das Bootmen\u00fc ist veraltet oder wurde noch nicht generiert.",
+ "lang_configure": "Konfigurieren",
+ "lang_intro": "Dies ist die bwLehrpool Konfigurationsoberfl\u00e4che.",
+ "lang_minilinuxMissing": "Wichtige Dateien der MiniLinux-Installation fehlen.",
+ "lang_systemConfiguration": "Systemkonfiguration",
+ "lang_systemConfigurationNotChosen": "Es wurde noch keine Systemkonfiguration ausgew\u00e4hlt.",
+ "lang_vmLocationNotSet": "Es ist noch kein Speicherort f\u00fcr die Virtuellen Maschinen festgelegt.",
+ "lang_welcome": "Willkommen"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-minilinux.json b/lang/de/templates/page-minilinux.json
new file mode 100644
index 00000000..f30f7b76
--- /dev/null
+++ b/lang/de/templates/page-minilinux.json
@@ -0,0 +1,4 @@
+{
+ "lang_errorGetting": "Fehler beim Herunterladen der Liste!",
+ "lang_listObtained": "Liste wird heruntergeladen..."
+} \ No newline at end of file
diff --git a/lang/de/templates/page-news.json b/lang/de/templates/page-news.json
new file mode 100644
index 00000000..b25a6b46
--- /dev/null
+++ b/lang/de/templates/page-news.json
@@ -0,0 +1,12 @@
+{
+ "lang_activeNews": "Aktive News",
+ "lang_content": "Inhalt",
+ "lang_date": "Datum",
+ "lang_delete": "L\u00f6schen",
+ "lang_latestUpdate": "Letzte Aktualisierung",
+ "lang_newsIntro": "Hier haben Sie die M\u00f6glichkeit, die von bwLehrpool-Clients angezeigten News zu editieren.",
+ "lang_newsOld": "Alte News",
+ "lang_save": "Speichern",
+ "lang_show": "Ansehen",
+ "lang_title": "Titel"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-remote-tgz-list.json b/lang/de/templates/page-remote-tgz-list.json
new file mode 100644
index 00000000..c277826c
--- /dev/null
+++ b/lang/de/templates/page-remote-tgz-list.json
@@ -0,0 +1,5 @@
+{
+ "lang_centralConfiguration": "Zentral verf\u00fcgbare Konfigurationen",
+ "lang_configurationPackageNotFound": "Keine Konfigurationspakete gefunden!",
+ "lang_systemConfiguration": "Systemkonfiguration"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-syslog.json b/lang/de/templates/page-syslog.json
new file mode 100644
index 00000000..49e94602
--- /dev/null
+++ b/lang/de/templates/page-syslog.json
@@ -0,0 +1,10 @@
+{
+ "lang_client": "Client",
+ "lang_clientLog": "Client Log",
+ "lang_details": "Details",
+ "lang_event": "Ereignis",
+ "lang_filter": "Filter",
+ "lang_go": "Go",
+ "lang_not": "not",
+ "lang_when": "Wann"
+} \ No newline at end of file
diff --git a/lang/de/templates/page-vmstore.json b/lang/de/templates/page-vmstore.json
new file mode 100644
index 00000000..db057d26
--- /dev/null
+++ b/lang/de/templates/page-vmstore.json
@@ -0,0 +1,15 @@
+{
+ "lang_close": "Schlie\u00dfen",
+ "lang_intern": "Intern",
+ "lang_noAdditionalInformation": "Keine Weitere Konfiguration notwendig",
+ "lang_password": "Passwort",
+ "lang_readOnly": "Nur-Lese-Zugangsdaten",
+ "lang_readWrite": "Lese\/Schreib-Zugangsdaten",
+ "lang_save": "Speichern",
+ "lang_username": "Benutzerkennung",
+ "lang_vmLocation": "VM Speicherort",
+ "lang_vmLocationChoose": "Bitte w\u00e4hlen Sie, wo die Images der Virtuellen Maschinen gespeichert werden sollen.",
+ "lang_vmLocationHelp1": "F\u00fcr Testzwecke k\u00f6nnen die VMs direkt auf dem Satellitenserver gespeichert werden. Sofern Sie jedoch die ausgelieferte Satelliten-vmdk betreiben bedenken Sie bitte, dass Sie dann nur ca. 100GB Speicher zur Verf\u00fcgung haben.",
+ "lang_vmLocationHelp2": "Im Produktivbetrieb bietet es sich an, hierf\u00fcr einen performanten Netzwerkspeicher zu benutzen. Dieser Netzwerkspeicher kann per NFS oder CIFS\/SMB eingebunden werden. In jedem Fall muss sichergestellt werden, dass der Satellitenserver zum Hinzuf\u00fcgen neuer Virtueller Maschinen Schreibzugriff auf diesen Netzwerkspeicher hat. Bei der Nutzung von NFSv3 kann dies IP-Basiert eingerichtet werden, f\u00fcr die Nutzung von CIFS\/SMB k\u00f6nnen Sie Zugangsdaten angaben, die zum Schreiben berechtigen.",
+ "lang_vmLocationHelp3": "Die bwLehrpool-Clients brauchen lediglich Lesezugriff auf den Netzwerkspeicher (und sollten aus Sicherheitsgr\u00fcnden auch wirklich nur lesen k\u00f6nnen). Bei CIFS\/SMB erreichen Sie dies am einfachsten, indem Sie passwortlosen Gastzugriff mit Leserechten auf die Freigabe erlauben."
+} \ No newline at end of file
diff --git a/lang/de/templates/pagenav.json b/lang/de/templates/pagenav.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/de/templates/pagenav.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/de/templates/serversetup/ipaddress.json b/lang/de/templates/serversetup/ipaddress.json
new file mode 100644
index 00000000..eb3d34d3
--- /dev/null
+++ b/lang/de/templates/serversetup/ipaddress.json
@@ -0,0 +1,7 @@
+{
+ "lang_active": "Aktiv",
+ "lang_bootAddress": "Boot-Adresse des Servers",
+ "lang_bootHint": "Das Bootmen\u00fc muss nach einer \u00c4nderung der IP-Adresse neu generiert werden. In der Regel geschieht dies automatisch, der Vorgang kann in der Sektion Bootmen\u00fc allerdings auch manuell ausgel\u00f6st werden.",
+ "lang_chooseIP": "Bitte w\u00e4hlen Sie die IP-Adresse, \u00fcber die der Server von den Clients zum Booten angesprochen werden soll.",
+ "lang_set": "Setzen"
+} \ No newline at end of file
diff --git a/lang/de/templates/serversetup/ipxe.json b/lang/de/templates/serversetup/ipxe.json
new file mode 100644
index 00000000..36e49d31
--- /dev/null
+++ b/lang/de/templates/serversetup/ipxe.json
@@ -0,0 +1,15 @@
+{
+ "lang_bootBehavior": "Standard-Bootverhalten",
+ "lang_bootInfo": "Hier k\u00f6nnen Anpassungen am Erscheinungsbild des Bootmen\u00fcs vorgenommen werden.",
+ "lang_bootMenu": "Bootmen\u00fc",
+ "lang_bootMenuCreate": "Bootmen\u00fc erzeugen",
+ "lang_close": "Schlie\u00dfen",
+ "lang_example": "Beispiel",
+ "lang_localHDD": "Lokale HDD",
+ "lang_menuCustom": "Benutzerdefinierter Men\u00fczusatz",
+ "lang_menuCustomHint1": "Hier haben Sie die M\u00f6glichkeit, eigenen Men\u00fc-Code zum angezeigten PXE-Men\u00fc hinzuzuf\u00fcgen, um z.B. auf weitere PXE-Server zu verweisen. Das Format entspricht dem syslinux Men\u00fcformat.",
+ "lang_menuCustomHint2": "Sie k\u00f6nnen ein oder mehrere Eintr\u00e4ge erzeugen. Wenn Sie einen Eintrag erzeugen m\u00f6chten, der automatisch gestartet wird, wenn der Benutzer keine Auswahl t\u00e4tigt, vergeben Sie als",
+ "lang_menuCustomHint3": "und w\u00e4hlen Sie als Standard-Bootverhalten ebenfalls my-entry.",
+ "lang_menuDisplayTime": "Anzeigedauer des Men\u00fcs",
+ "lang_seconds": "Sekunden"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/_page.json b/lang/de/templates/sysconfig/_page.json
new file mode 100644
index 00000000..7c10aa8c
--- /dev/null
+++ b/lang/de/templates/sysconfig/_page.json
@@ -0,0 +1,18 @@
+{
+ "lang_activate": "Aktivieren",
+ "lang_active": "Aktiv",
+ "lang_availableModules": "Verf\u00fcgbare Konfigurationsmodule",
+ "lang_availableSystem": "Verf\u00fcgbare Systemkonfigurationen",
+ "lang_close": "Schlie\u00dfen",
+ "lang_configurationModuleNotFound": "Keine Konfigurationsmodule gefunden!",
+ "lang_delete": "L\u00f6schen",
+ "lang_helpModuleConfiguration": "Konfigurationsmodule sind die Bausteine, aus denen eine Systemkonfiguration erstellt wird. Hier lassen sich sowohl generische Module durch einen Wizard anlegen, als auch komplett eigene Module erstellen (fortgeschritten, Linuxkenntnisse erforderlich).",
+ "lang_helpSystemConfiguration": "\u00dcber eine Systemkonfiguration wird die grundlegende Lokalisierung des bwLehrpool-Systems durchgef\u00fchrt. Dazu geh\u00f6ren Aspekte wie das Authentifizierungsverfahren f\u00fcr Benutzer (z.B. Active Directory, LDAP), Druckerkonfiguration, Home-Verzeichnisse, etc. Eine Systemkonfiguration setzt sich aus einem oder mehreren Konfigurationsmodulen zusammen, welche im unteren Bereich dieser Seite verwaltet werden k\u00f6nnen.",
+ "lang_moduleConfiguration": "Konfigurationsmodule",
+ "lang_newConfiguration": "Neue Konfiguration",
+ "lang_newModule": "Neues Modul",
+ "lang_show": "Ansehen",
+ "lang_systemConfiguration": "Systemkonfiguration",
+ "lang_systemConfigurationAlert": "Bevor Sie eine Systemkonfiguration erstellen k\u00f6nnen, m\u00fcssen Sie zun\u00e4chst ein Konfigurationsmodul erzeugen.",
+ "lang_systemConfigurationNotFound": "Keine Systemkonfigurationen gefunden.Erstellen Sie eine neue Konfiguration aus den unten aufgef\u00fchrten Konfigurationsmodulen."
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/ad-checkconnection.json b/lang/de/templates/sysconfig/ad-checkconnection.json
new file mode 100644
index 00000000..17415bc4
--- /dev/null
+++ b/lang/de/templates/sysconfig/ad-checkconnection.json
@@ -0,0 +1,5 @@
+{
+ "lang_back": "Zur\u00fcck",
+ "lang_connectionWait": "Die Verbindung zum angegebenen AD-Server wird nun \u00fcberpr\u00fcft. Bitte haben Sie einen Moment Geduld.",
+ "lang_skip": "\u00dcberspringen"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/ad-finish.json b/lang/de/templates/sysconfig/ad-finish.json
new file mode 100644
index 00000000..e91e98dc
--- /dev/null
+++ b/lang/de/templates/sysconfig/ad-finish.json
@@ -0,0 +1,7 @@
+{
+ "lang_adStarted": "Der AD-Proxy wird nun konfiguriert und gestartet...",
+ "lang_generateModule": "Modul erzeugen",
+ "lang_restartWizard": "Assistent neustarten",
+ "lang_systemConfiguration": "Systemkonfiguration",
+ "lang_to": "Zur"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/ad-start.json b/lang/de/templates/sysconfig/ad-start.json
new file mode 100644
index 00000000..cf4aa59d
--- /dev/null
+++ b/lang/de/templates/sysconfig/ad-start.json
@@ -0,0 +1,15 @@
+{
+ "lang_adText1": "Zum Einrichten der Benutzerauthentifizierung \u00fcber ein Active Directory wird neben der Adresse des anzusprechenden Servers ein dedizierter Benutzer im AD ben\u00f6tigt, \u00fcber welchen das AD angesprochen wird.",
+ "lang_adText2": "Dieser Benutzer ben\u00f6tigt keine besonderen Rechte, Sie k\u00f6nnen diesem Benutzer zur Sicherheit auch die Rechte zum Anmelden entziehen. Der Benutzer muss lediglich ausreichende Berechtigungen haben, um einen LDAP-Bind am AD durchzuf\u00fchren, und nach Benutzern zu suchen.",
+ "lang_adText3": "Im Folgenden muss der Distinguished Name des Benutzers angegeben werden. Diesen k\u00f6nnen Sie ermitteln, indem Sie das Kommandozeilenprogramm dsquery auf einem Domain Controller wie folgt aufrufen:",
+ "lang_adText4": "Nach Eingabe aller ben\u00f6tigten Daten wird im n\u00e4chsten Schritt \u00fcberpr\u00fcft, ob die Kommunikation mit dem AD m\u00f6glich ist.",
+ "lang_bindDN": "Bind DN",
+ "lang_close": "Schlie\u00dfen",
+ "lang_next": "Weiter",
+ "lang_password": "Passwort",
+ "lang_searchBase": "Suchbasis",
+ "lang_userDirectory": "Benutzerverzeichnis",
+ "lang_userDirectoryInfo1": "Optionale Angabe: Wenn die Clients f\u00fcr die Benutzer ein eigenes Verzeichnis (Homeverzeichnis, Benutzerverzeichnis) von einem Server einbinden sollen, geben Sie bitte hier das Format in UNC-Notation an, also z.B. ",
+ "lang_userDirectoryInfo2": "%s ist dabei ein Platzhalter f\u00fcr den Login-Namen des Benutzers.",
+ "lang_userDirectoryInfo3": "Das Verzeichnis wird mit den gleichen Zugangsdaten eingebunden, die der Benutzer beim Login angibt. (D.h. kein Kerberos Support o.\u00e4.)"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/branding-check.json b/lang/de/templates/sysconfig/branding-check.json
new file mode 100644
index 00000000..740cc34f
--- /dev/null
+++ b/lang/de/templates/sysconfig/branding-check.json
@@ -0,0 +1,5 @@
+{
+ "lang_brandingInfo": "Unten sehen Sie zur Kontrolle noch einmal das ausgew\u00e4hlte Logo. Sollten Sie das Logo nicht sehen k\u00f6nnen, pr\u00fcfen Sie bitte, ob Sie ein valides SVG-Bild verwendet haben. Alternativ ist es m\u00f6glich, dass beim Verarbeiten des Bildes ein Fehler auftrat. Sie k\u00f6nnen daher das Modul trotzdem speichern und testen, ob das Logo im bwLehrpool-System angezeigt wird.",
+ "lang_save": "Speichern",
+ "lang_title": "Titel"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/branding-start.json b/lang/de/templates/sysconfig/branding-start.json
new file mode 100644
index 00000000..1b7a660b
--- /dev/null
+++ b/lang/de/templates/sysconfig/branding-start.json
@@ -0,0 +1,7 @@
+{
+ "lang_branding": "F\u00fcr beste Ergebnisse sollten Sie ihr Einrichtungslogo im SVG Format hochladen. Das SVG-Format ist ein Vektorgrafikformat, was zum Skalieren vorteilhaft ist. Eine Gute Quelle f\u00fcr SVG-Logos von Unis und Hochschulen ist ihr jeweiliger Wikipedia-Artikel.",
+ "lang_computerLoad": "Bild von lokalem Rechner hochladen",
+ "lang_or": "oder",
+ "lang_upload": "Hochladen",
+ "lang_urlLoad": "Bild von URL laden"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/cfg-finish.json b/lang/de/templates/sysconfig/cfg-finish.json
new file mode 100644
index 00000000..86fb7a15
--- /dev/null
+++ b/lang/de/templates/sysconfig/cfg-finish.json
@@ -0,0 +1,4 @@
+{
+ "lang_configurationActive": "Konfiguration aktivieren",
+ "lang_configurationSuccess": "Die Konfiguration wurde erfolgreich erstellt."
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/cfg-start.json b/lang/de/templates/sysconfig/cfg-start.json
new file mode 100644
index 00000000..c5f4c5fa
--- /dev/null
+++ b/lang/de/templates/sysconfig/cfg-start.json
@@ -0,0 +1,7 @@
+{
+ "lang_configuration": "Konfiguration",
+ "lang_configurationChoose": "Bitte w\u00e4hlen Sie, welche Module f\u00fcr diese Konfiguration verwendet werden sollen.",
+ "lang_name": "Name",
+ "lang_new": "Neu",
+ "lang_next": "Weiter"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/custom-filelist.json b/lang/de/templates/sysconfig/custom-filelist.json
new file mode 100644
index 00000000..1a73a858
--- /dev/null
+++ b/lang/de/templates/sysconfig/custom-filelist.json
@@ -0,0 +1,3 @@
+{
+ "lang_back": "Zur\u00fcck"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/custom-fileselect.json b/lang/de/templates/sysconfig/custom-fileselect.json
new file mode 100644
index 00000000..94085f65
--- /dev/null
+++ b/lang/de/templates/sysconfig/custom-fileselect.json
@@ -0,0 +1,5 @@
+{
+ "lang_checkFileContent": "Hier haben Sie die M\u00f6glichkeit, den Inhalt des Archivs noch einmal zu \u00fcberpr\u00fcfen.",
+ "lang_moduleName": "Modulname",
+ "lang_next": "Weiter"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/custom-upload.json b/lang/de/templates/sysconfig/custom-upload.json
new file mode 100644
index 00000000..b41d6748
--- /dev/null
+++ b/lang/de/templates/sysconfig/custom-upload.json
@@ -0,0 +1,7 @@
+{
+ "lang_customModuleInfo1": "\u00dcber ein benutzerdefiniertes Modul ist es m\u00f6glich, beliebige Dateien zum Linux-Grundsystem, das auf den Clients gebootet wird, hinzuzuf\u00fcgen. Dazu kann ein Archiv mit einer Dateisystemstruktur hochgeladen werden, die in dieser Form 1:1 in das gebootete Linux extrahiert wird.",
+ "lang_customModuleInfo2": "Beispiel: Enth\u00e4lt das hochgeladene Archiv eine Datei etc\/beispiel.conf, so wird auf einem gebooteten Client diese Datei als \/etc\/beispiel.conf zu finden sein.",
+ "lang_file": "Archiv",
+ "lang_supportedFiles": "Unterst\u00fctzte Archivformate",
+ "lang_upload": "Hochladen"
+} \ No newline at end of file
diff --git a/lang/de/templates/sysconfig/start.json b/lang/de/templates/sysconfig/start.json
new file mode 100644
index 00000000..37992831
--- /dev/null
+++ b/lang/de/templates/sysconfig/start.json
@@ -0,0 +1,4 @@
+{
+ "lang_add": "Hinzuf\u00fcgen",
+ "lang_moduleChoose": "Bitte w\u00e4hlen Sie aus, welche Art Konfigurationsmodul Sie erstellen m\u00f6chten."
+} \ No newline at end of file
diff --git a/lang/de/templates/systemstatus/_page.json b/lang/de/templates/systemstatus/_page.json
new file mode 100644
index 00000000..b0d31f0c
--- /dev/null
+++ b/lang/de/templates/systemstatus/_page.json
@@ -0,0 +1,8 @@
+{
+ "lang_addressConfiguration": "Adresskonfiguration",
+ "lang_iAmSure": "Ja, ich bin sicher",
+ "lang_maintenance": "Maintenance",
+ "lang_services": "Dienste",
+ "lang_space": "Speicherplatz",
+ "lang_system": "System"
+} \ No newline at end of file
diff --git a/lang/de/templates/systemstatus/addresses.json b/lang/de/templates/systemstatus/addresses.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/de/templates/systemstatus/addresses.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/de/templates/systemstatus/diskstat.json b/lang/de/templates/systemstatus/diskstat.json
new file mode 100644
index 00000000..3d2f28ba
--- /dev/null
+++ b/lang/de/templates/systemstatus/diskstat.json
@@ -0,0 +1,6 @@
+{
+ "lang_capacity": "Kapazit\u00e4t",
+ "lang_systemPartition": "Systempartition",
+ "lang_vmStore": "VM-Speicher",
+ "lang_vmStoreError": "Fehler beim Ermitteln des verf\u00fcgbaren Speicherplatzes am VM-Speicherort. Bitte \u00fcberpr\u00fcfen Sie die Konfiguration."
+} \ No newline at end of file
diff --git a/lang/de/templates/systemstatus/services.json b/lang/de/templates/systemstatus/services.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/de/templates/systemstatus/services.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/de/templates/systemstatus/systeminfo.json b/lang/de/templates/systemstatus/systeminfo.json
new file mode 100644
index 00000000..cd4027f1
--- /dev/null
+++ b/lang/de/templates/systemstatus/systeminfo.json
@@ -0,0 +1,15 @@
+{
+ "lang_attention": "Achtung!",
+ "lang_average": "Durchschnitt",
+ "lang_cpuLoad": "CPU-Last",
+ "lang_free": "Frei",
+ "lang_logicCPUs": "Logische CPUs",
+ "lang_notDetermined": "Konnte nicht ermittelt werden",
+ "lang_occupied": "Belegt",
+ "lang_onlyOS": "Nur OS",
+ "lang_ramUsage": "RAM-Nutzung",
+ "lang_swapUsage": "swap-Nutzung",
+ "lang_swapWarning": "Es wird swap-Speicher genutzt. Dies kann ein Hinweis darauf sein, dass dem Satelliten-Server zu wenig physikalischer Speicher zur Verf\u00fcgung steht. Im Falle von Performance-Problemen oder Instabilit\u00e4t des Servers sollten Sie erw\u00e4gen, den Server mit mehr RAM auszustatten.",
+ "lang_total": "Gesamt",
+ "lang_uptimeOS": "OS Uptime"
+} \ No newline at end of file
diff --git a/lang/de/templates/translation/_page.json b/lang/de/templates/translation/_page.json
new file mode 100644
index 00000000..94e448c2
--- /dev/null
+++ b/lang/de/templates/translation/_page.json
@@ -0,0 +1,8 @@
+{
+ "lang_adminInfo": "In diesem Abschnitt k\u00f6nnen Sie die JSON-Tags, die \u00fcbersetzten Texte durch die Website verwendet wird, enth\u00e4lt zu \u00e4ndern. Um dies zu tun, w\u00e4hlen Sie eine Vorlage aus, um ihre jeweiligen Tags \u00e4ndern. Alternativ klicken Sie auf den Link unten, um die Nachrichten der Website \u00e4ndern.",
+ "lang_editMessages": "Nachrichten bearbeiten",
+ "lang_english": "Englisch",
+ "lang_german": "Deutsch",
+ "lang_langAdministration": "Sprache Verwaltung",
+ "lang_portuguese": "Portuguiesisch"
+} \ No newline at end of file
diff --git a/lang/de/templates/translation/messages.json b/lang/de/templates/translation/messages.json
new file mode 100644
index 00000000..656c7e15
--- /dev/null
+++ b/lang/de/templates/translation/messages.json
@@ -0,0 +1,17 @@
+{
+ "lang_back": "Z\u00fcruck",
+ "lang_deleteTAG": "L\u00f6schen",
+ "lang_englishJSON": "Englisch JSON",
+ "lang_englishTAG": "Englisch TAG",
+ "lang_germanJSON": "Deutsch JSON",
+ "lang_germanTAG": "Deutsch TAG",
+ "lang_messages": "Nachrichten",
+ "lang_messagesHardcoded": "Hardcoded Nachrichten",
+ "lang_newTAG": "Neuer Tag",
+ "lang_newTag": "Neue Nachricht",
+ "lang_portugueseJSON": "Portugiesisch JSON",
+ "lang_portugueseTAG": "Portugiesisch TAG",
+ "lang_save": "Speichern",
+ "lang_templateHint": "Hinweis: Gelbe Linien zeigen eine \u00dcbersetzung fehlt und roten Linien zeigen ein Tag wird nicht von der Vorlage verwendet.",
+ "lang_templateMessagesHelp": ""
+} \ No newline at end of file
diff --git a/lang/de/templates/translation/template.json b/lang/de/templates/translation/template.json
new file mode 100644
index 00000000..8f3dfb66
--- /dev/null
+++ b/lang/de/templates/translation/template.json
@@ -0,0 +1,15 @@
+{
+ "lang_back": "Z\u00fcruck",
+ "lang_createTag": "TAG schafen",
+ "lang_deleteTAG": "L\u00f6schen",
+ "lang_englishJSON": "Englisch JSON",
+ "lang_englishTAG": "Englisch TAG",
+ "lang_germanJSON": "Deutsch JSON",
+ "lang_germanTAG": "Deutsch TAG",
+ "lang_newTAG": "Neue Tag",
+ "lang_portugueseJSON": "Portugiesisch JSON",
+ "lang_portugueseTAG": "Portugiesisch TAG",
+ "lang_save": "Speichern",
+ "lang_templateAdminHelp": "",
+ "lang_templateHint": "Hinweis: Gelbe Linie zeigt eine \u00dcbersetzung fehlt und roten Linien zeigen ein Tag wird nicht von das Template verwendet."
+} \ No newline at end of file
diff --git a/lang/de/templates/vmstore/mount.json b/lang/de/templates/vmstore/mount.json
new file mode 100644
index 00000000..dbc75281
--- /dev/null
+++ b/lang/de/templates/vmstore/mount.json
@@ -0,0 +1,5 @@
+{
+ "lang_back": "Zur\u00fcck",
+ "lang_configure": "Konfigurieren",
+ "lang_vmLocationConfiguration": "VM Speicherort wird konfiguriert"
+} \ No newline at end of file
diff --git a/lang/en/flag.png b/lang/en/flag.png
new file mode 100644
index 00000000..f9337dc5
--- /dev/null
+++ b/lang/en/flag.png
Binary files differ
diff --git a/lang/en/messages-hardcoded.json b/lang/en/messages-hardcoded.json
new file mode 100644
index 00000000..6ff6a2c3
--- /dev/null
+++ b/lang/en/messages-hardcoded.json
@@ -0,0 +1 @@
+{"lang_unknwonTaskManager":"Unknown Task Manager error","lang_configurationCompilation":"Compile configuration","lang_moduleAdd":"Add Module","lang_adAuthentication":"Active Directory Authentication","lang_adModule":"This module makes possible the application to the client PCs with the user accounts of an Active Directory. Depending on the configuration, the use of a user directory on the client is possible.","lang_authentication":"Authentication","lang_generic":"Generic","lang_addCustomModuleInfo":"With an extended module it is possible to add any files to the basic system that uses this module, for example to use specific configuration files, which can not be created with one of the other Wizards. Adding an Extended module usually requires at least basic knowledge of the Linux system.","lang_days":"Day(s)","lang_hours":"Hour(s)","lang_specificLogo":"Institution Specific Logo","lang_institutionLogo":"Institution Logo","lang_infoLogo":"This module is used to add the logo of a College \/ University, which then, for example, is displayed on the login screen.","lang_location":"Location","lang_contentOf":"Content of \"","lang_serverConfiguration":"Server-side Configuration","lang_login":"Login","lang_createUser":"Create User"} \ No newline at end of file
diff --git a/lang/en/messages.json b/lang/en/messages.json
new file mode 100644
index 00000000..a300cff7
--- /dev/null
+++ b/lang/en/messages.json
@@ -0,0 +1,45 @@
+{
+ "adduser-disabled": "Insufficient privileges to add more users",
+ "adduser-success": "User successfully added",
+ "config-activated": "Configuration {{0}} has been activated",
+ "config-invalid": "Configuration with id {{0}} does not exist",
+ "debug-mode": "The debug mode is active!",
+ "deleted-tag": "Tag was successfully removed",
+ "empty-archive": "The archive contains no files or directories",
+ "empty-field": "A field was not filled",
+ "error-archive": "Corrupted archive or unsupported format",
+ "error-extract": "Could not unpack archive {{0}} to {{1}}",
+ "error-nodir": "The directory {{0}} does not exist.",
+ "error-read": "Error reading {{0}}",
+ "error-rename": "Could not rename {{0}} into {{1}}",
+ "error-write": "Failed to write {{0}}",
+ "i18n-empty-tag": "",
+ "i18n-invalid-lang": "",
+ "invalid-action": "Invalid action: {{0}}",
+ "invalid-file": "The file {{0}} does not exist!",
+ "invalid-ip": "No interface is configured with the address {{0}}",
+ "invalid-template": "Selected template is not valid",
+ "loginfail": "Username or Password incorrect",
+ "missing-file": "There was no file selected!",
+ "module-added": "Module successfully added",
+ "module-deleted": "Module {{0}} was deleted",
+ "module-in-use": "Module {{0}} is still used by Configuration {{1}}",
+ "news-del-success": "News deleted",
+ "news-empty": "There was no news found in the database",
+ "news-save-success": "News updated successfully",
+ "no-permission": "No sufficient privileges to access this page",
+ "password-mismatch": "Password and password confirmation do not match",
+ "reboot-unconfirmed": "Confirmation prompt to reboot not confirmed",
+ "remote-parse-failed": "Parsing the received data failed ({{0}})",
+ "remote-timeout": "Could not download resource {{0}} ({{1}})",
+ "settings-updated": "Settings have been updated",
+ "task-error": "Execution failed: {{0}}",
+ "taskmanager-error": "Failed to connect to the Task Manager",
+ "taskmanager-format": "Task Manager has returned invalid data",
+ "token": "Invalid token. CSRF attack?",
+ "unsuccessful-action": "",
+ "updated-tags": "",
+ "upload-complete": "Upload of {{0}} was successful",
+ "upload-failed": "Upload failed: {{0}}",
+ "value-invalid": "The value {{1}} is invalid for option {{0}} and has been ignored"
+} \ No newline at end of file
diff --git a/lang/en/templates/dialog-generic.json b/lang/en/templates/dialog-generic.json
new file mode 100644
index 00000000..c7551ed3
--- /dev/null
+++ b/lang/en/templates/dialog-generic.json
@@ -0,0 +1,3 @@
+{
+ "lang_next": "Next"
+} \ No newline at end of file
diff --git a/lang/en/templates/main-menu-login.json b/lang/en/templates/main-menu-login.json
new file mode 100644
index 00000000..26391c9f
--- /dev/null
+++ b/lang/en/templates/main-menu-login.json
@@ -0,0 +1,14 @@
+{
+ "lang_administration": "Translations",
+ "lang_client": "Client",
+ "lang_clientLog": "Client Log",
+ "lang_configurationBasic": "Basic Configuration",
+ "lang_configurationVariables": "Configuration Variables",
+ "lang_language": "Language",
+ "lang_localization": "Localization",
+ "lang_login": "Login",
+ "lang_news": "News",
+ "lang_server": "Server",
+ "lang_settings": "Settings",
+ "lang_vmLocation": "VM Location"
+} \ No newline at end of file
diff --git a/lang/en/templates/main-menu-logout.json b/lang/en/templates/main-menu-logout.json
new file mode 100644
index 00000000..54d7831e
--- /dev/null
+++ b/lang/en/templates/main-menu-logout.json
@@ -0,0 +1,14 @@
+{
+ "lang_administration": "Translations",
+ "lang_client": "Client",
+ "lang_clientLog": "Client Log",
+ "lang_configurationBasic": "Basic Configuration",
+ "lang_configurationVariables": "Configuration Variables",
+ "lang_language": "Language",
+ "lang_localization": "Localization",
+ "lang_logout": "Logout",
+ "lang_news": "News",
+ "lang_server": "Server",
+ "lang_settings": "Settings",
+ "lang_vmLocation": "VM Location"
+} \ No newline at end of file
diff --git a/lang/en/templates/messagebox-error.json b/lang/en/templates/messagebox-error.json
new file mode 100644
index 00000000..c44dc44f
--- /dev/null
+++ b/lang/en/templates/messagebox-error.json
@@ -0,0 +1,3 @@
+[
+
+] \ No newline at end of file
diff --git a/lang/en/templates/messagebox-info.json b/lang/en/templates/messagebox-info.json
new file mode 100644
index 00000000..2c63c085
--- /dev/null
+++ b/lang/en/templates/messagebox-info.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/lang/en/templates/messagebox-success.json b/lang/en/templates/messagebox-success.json
new file mode 100644
index 00000000..2c63c085
--- /dev/null
+++ b/lang/en/templates/messagebox-success.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/lang/en/templates/messagebox-warning.json b/lang/en/templates/messagebox-warning.json
new file mode 100644
index 00000000..2c63c085
--- /dev/null
+++ b/lang/en/templates/messagebox-warning.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/lang/en/templates/minilinux/download.json b/lang/en/templates/minilinux/download.json
new file mode 100644
index 00000000..2c63c085
--- /dev/null
+++ b/lang/en/templates/minilinux/download.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/lang/en/templates/minilinux/filelist.json b/lang/en/templates/minilinux/filelist.json
new file mode 100644
index 00000000..11835c10
--- /dev/null
+++ b/lang/en/templates/minilinux/filelist.json
@@ -0,0 +1,9 @@
+{
+ "lang_actual": "Actual",
+ "lang_canUpdate1": "At least one component of",
+ "lang_canUpdate2": "can be updated. For a smooth operation, it is recommended to keep all components up to date.",
+ "lang_configurationPackageNotFound": "Configuration package not found!",
+ "lang_outdated": "Outdated",
+ "lang_systemUpdated": "The system is up to date.",
+ "lang_update": "Update"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-adduser.json b/lang/en/templates/page-adduser.json
new file mode 100644
index 00000000..42bae6dc
--- /dev/null
+++ b/lang/en/templates/page-adduser.json
@@ -0,0 +1,8 @@
+{
+ "lang_confirmation": "Confirm Password",
+ "lang_createUser": "Create User",
+ "lang_fullName": "Full Name",
+ "lang_password": "Password",
+ "lang_telephone": "Telephone",
+ "lang_username": "Username"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-baseconfig.json b/lang/en/templates/page-baseconfig.json
new file mode 100644
index 00000000..dfd235b5
--- /dev/null
+++ b/lang/en/templates/page-baseconfig.json
@@ -0,0 +1,7 @@
+{
+ "lang_basicConfiguration": "Basic Configuration",
+ "lang_close": "Close",
+ "lang_help": "Help",
+ "lang_reset": "Reset",
+ "lang_save": "Save"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-login.json b/lang/en/templates/page-login.json
new file mode 100644
index 00000000..4b192a7a
--- /dev/null
+++ b/lang/en/templates/page-login.json
@@ -0,0 +1,8 @@
+{
+ "lang_enter": "Enter",
+ "lang_login": "Login",
+ "lang_password": "Password",
+ "lang_register": "Register",
+ "lang_rememberID": "Remember ID",
+ "lang_username": "Username"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-main-guest.json b/lang/en/templates/page-main-guest.json
new file mode 100644
index 00000000..8676d0d4
--- /dev/null
+++ b/lang/en/templates/page-main-guest.json
@@ -0,0 +1,5 @@
+{
+ "lang_introGuest": "This is the administration interface of the local bwLehrpool intallation. Please authenticate yourself to adjust settings.",
+ "lang_login": "Login",
+ "lang_welcome": "Welcome"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-main.json b/lang/en/templates/page-main.json
new file mode 100644
index 00000000..86f4eb52
--- /dev/null
+++ b/lang/en/templates/page-main.json
@@ -0,0 +1,10 @@
+{
+ "lang_bootMenuWarning": "The boot menu is outdated or has not been generated.",
+ "lang_configure": "Configure",
+ "lang_intro": "This is the bwLehrpool configuration interface.",
+ "lang_minilinuxMissing": "Important files from the mini Linux installation are missing.",
+ "lang_systemConfiguration": "System Configuration",
+ "lang_systemConfigurationNotChosen": "A system configuration has not been chosen yet.",
+ "lang_vmLocationNotSet": "A location for the virtual machine is not set yet.",
+ "lang_welcome": "Welcome"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-minilinux.json b/lang/en/templates/page-minilinux.json
new file mode 100644
index 00000000..087e01be
--- /dev/null
+++ b/lang/en/templates/page-minilinux.json
@@ -0,0 +1,4 @@
+{
+ "lang_errorGetting": "",
+ "lang_listObtained": ""
+} \ No newline at end of file
diff --git a/lang/en/templates/page-news.json b/lang/en/templates/page-news.json
new file mode 100644
index 00000000..ab925ccc
--- /dev/null
+++ b/lang/en/templates/page-news.json
@@ -0,0 +1,12 @@
+{
+ "lang_activeNews": "Active News",
+ "lang_content": "Content",
+ "lang_date": "Date",
+ "lang_delete": "Delete",
+ "lang_latestUpdate": "Latest update",
+ "lang_newsIntro": "Here you have the possibility to edit the news displayed to the bwLehrpool clients.",
+ "lang_newsOld": "Old News",
+ "lang_save": "Save",
+ "lang_show": "Show",
+ "lang_title": "Title"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-remote-tgz-list.json b/lang/en/templates/page-remote-tgz-list.json
new file mode 100644
index 00000000..22f0fd53
--- /dev/null
+++ b/lang/en/templates/page-remote-tgz-list.json
@@ -0,0 +1,5 @@
+{
+ "lang_centralConfiguration": "Central configurations available",
+ "lang_configurationPackageNotFound": "Configuration package not found!",
+ "lang_systemConfiguration": "System Configuration"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-syslog.json b/lang/en/templates/page-syslog.json
new file mode 100644
index 00000000..71f61693
--- /dev/null
+++ b/lang/en/templates/page-syslog.json
@@ -0,0 +1,10 @@
+{
+ "lang_client": "Client",
+ "lang_clientLog": "Client Log",
+ "lang_details": "Details",
+ "lang_event": "Event",
+ "lang_filter": "Filter",
+ "lang_go": "Go",
+ "lang_not": "not",
+ "lang_when": "When"
+} \ No newline at end of file
diff --git a/lang/en/templates/page-vmstore.json b/lang/en/templates/page-vmstore.json
new file mode 100644
index 00000000..667b8734
--- /dev/null
+++ b/lang/en/templates/page-vmstore.json
@@ -0,0 +1,15 @@
+{
+ "lang_close": "Close",
+ "lang_intern": "Intern",
+ "lang_noAdditionalInformation": "No additional cofiguration required",
+ "lang_password": "Password",
+ "lang_readOnly": "Read-only Access",
+ "lang_readWrite": "Read\/Write Access",
+ "lang_save": "Save",
+ "lang_username": "Username",
+ "lang_vmLocation": "VM Location",
+ "lang_vmLocationChoose": "Please choose where the images of virtual machines will be stored.",
+ "lang_vmLocationHelp1": "For test purposes, the VMs can be stored directly on the Satellite server. However, if you operate the delivered satellite vmdk please remember that you have only about 100GB of memory.",
+ "lang_vmLocationHelp2": "In productive operation, it makes sense for this to use a high-performance network storage. This network storage can be integrated via NFS or CIFS \/ SMB. In any case, it must be ensured that the satellite server has write access to this network storage to add a new Virtual Machine . When using NFSv3 this can be set up IP-based, for the use of CIFS \/ SMB, you can access data disclosures that would entitle them to write.",
+ "lang_vmLocationHelp3": "The bwLehrpool clients only need read access to the network storage (and for security reasons, really can only read). In CIFS \/ SMB You can do this most easily by allowing passwordless guest access with read access to the share."
+} \ No newline at end of file
diff --git a/lang/en/templates/pagenav.json b/lang/en/templates/pagenav.json
new file mode 100644
index 00000000..2c63c085
--- /dev/null
+++ b/lang/en/templates/pagenav.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/lang/en/templates/serversetup/ipaddress.json b/lang/en/templates/serversetup/ipaddress.json
new file mode 100644
index 00000000..699aeacc
--- /dev/null
+++ b/lang/en/templates/serversetup/ipaddress.json
@@ -0,0 +1,7 @@
+{
+ "lang_active": "Active",
+ "lang_bootAddress": "Boot Address of the Server",
+ "lang_bootHint": "The Boot menu must be recreated after changing the IP address. Usually this is done automatically, but the process can also be triggered manually in the section of the boot menu.",
+ "lang_chooseIP": "Please select the IP address that the client server will use to boot.",
+ "lang_set": "Set"
+} \ No newline at end of file
diff --git a/lang/en/templates/serversetup/ipxe.json b/lang/en/templates/serversetup/ipxe.json
new file mode 100644
index 00000000..1ab18e14
--- /dev/null
+++ b/lang/en/templates/serversetup/ipxe.json
@@ -0,0 +1,15 @@
+{
+ "lang_bootBehavior": "Default Boot Behavior",
+ "lang_bootInfo": "Here adjustments can be made to the appearance of the boot menu.",
+ "lang_bootMenu": "Boot Menu",
+ "lang_bootMenuCreate": "Create Boot Menu",
+ "lang_close": "Close",
+ "lang_example": "Example",
+ "lang_localHDD": "Local HDD",
+ "lang_menuCustom": "Custom Extra Menu",
+ "lang_menuCustomHint1": "Here you have the opportunity to add your own menu code to the displayed PXE menu, eg to refer to other PXE server. The format corresponds to the syslinux menu format.",
+ "lang_menuCustomHint2": "You can create one or more entries. If you want to create an entry that starts automatically when the user makes a selection, assign as",
+ "lang_menuCustomHint3": "and select as the default boot behavior my-entry as well.",
+ "lang_menuDisplayTime": "Menu Display Time",
+ "lang_seconds": "Seconds"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/_page.json b/lang/en/templates/sysconfig/_page.json
new file mode 100644
index 00000000..679514c2
--- /dev/null
+++ b/lang/en/templates/sysconfig/_page.json
@@ -0,0 +1,18 @@
+{
+ "lang_activate": "Activate",
+ "lang_active": "",
+ "lang_availableModules": "Available Configuration Modules",
+ "lang_availableSystem": "Available System Configuration",
+ "lang_close": "Close",
+ "lang_configurationModuleNotFound": "Configuration module not found!",
+ "lang_delete": "Delete",
+ "lang_helpModuleConfiguration": "Configuration modules are the building blocks from which a system configuration is created. Here you can create both generic modules by a wizard, as well as create completely custom modules (advanced Linux knowledge required).",
+ "lang_helpSystemConfiguration": "The fundamental localization of the bwLehrpool system is done through a system configuration. These include aspects such as the authentication method for users (eg Active Directory, LDAP), printer configuration, home directories, etc. A system configuration is composed of one or more configuration modules, which can be managed at the bottom of this page.",
+ "lang_moduleConfiguration": "Module Configuration",
+ "lang_newConfiguration": "New Configuration",
+ "lang_newModule": "New Module",
+ "lang_show": "Show",
+ "lang_systemConfiguration": "System Configuration",
+ "lang_systemConfigurationAlert": "Before you can create a system configuration, you must first create a configuration module.",
+ "lang_systemConfigurationNotFound": "No system configurations found. Create a new configuration from the configuration modules listed below."
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/ad-checkconnection.json b/lang/en/templates/sysconfig/ad-checkconnection.json
new file mode 100644
index 00000000..5ae50d59
--- /dev/null
+++ b/lang/en/templates/sysconfig/ad-checkconnection.json
@@ -0,0 +1,5 @@
+{
+ "lang_back": "Back",
+ "lang_connectionWait": "The connection to the specified AD server is now checked. Please wait a moment.",
+ "lang_skip": "Skip"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/ad-finish.json b/lang/en/templates/sysconfig/ad-finish.json
new file mode 100644
index 00000000..8f89046e
--- /dev/null
+++ b/lang/en/templates/sysconfig/ad-finish.json
@@ -0,0 +1,7 @@
+{
+ "lang_adStarted": "The AD-proxy is now configured and started ...",
+ "lang_generateModule": "Generate Module",
+ "lang_restartWizard": "Restart Wizard",
+ "lang_systemConfiguration": "System Configuration",
+ "lang_to": "To"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/ad-start.json b/lang/en/templates/sysconfig/ad-start.json
new file mode 100644
index 00000000..f40c6939
--- /dev/null
+++ b/lang/en/templates/sysconfig/ad-start.json
@@ -0,0 +1,15 @@
+{
+ "lang_adText1": "To set up user authentication through Active Directory, a dedicated user is required in AD next to the address of the server, which is addressed by the AD.",
+ "lang_adText2": "This user does not need special rights, you can follow this user to evade security and the rights to log on. The user only needs to have sufficient permissions to perform an LDAP Bind on AD, and search for users.",
+ "lang_adText3": "Next the distinguished name of the user must be specified. You can determine this by dsquery command line program on a domain controller as the following call:",
+ "lang_adText4": "After entering all required data in the next step, it checks whether communication is possible with the AD.",
+ "lang_bindDN": "Bind DN",
+ "lang_close": "Close",
+ "lang_next": "Next",
+ "lang_password": "Password",
+ "lang_searchBase": "Search Base",
+ "lang_userDirectory": "User Directory",
+ "lang_userDirectoryInfo1": "Optional: If the clients should embed a separate directory (home directory, user directory) from a server for the user, please enter here the format in UNC notation, eg",
+ "lang_userDirectoryInfo2": "%s is a placeholder for the user's login name.",
+ "lang_userDirectoryInfo3": "The directory is loaded with the same credentials that the user specifies when login. (That is no Kerberos support, etc.)"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/branding-check.json b/lang/en/templates/sysconfig/branding-check.json
new file mode 100644
index 00000000..6a481d8b
--- /dev/null
+++ b/lang/en/templates/sysconfig/branding-check.json
@@ -0,0 +1,5 @@
+{
+ "lang_brandingInfo": "Below you can check the selected logo. If you can not see the logo, please check whether you have used a valid SVG image. Alternatively, it is possible that during processing of the image, an error occurred. Therefore, you can save the module anyway and test whether the logo is displayed in the bwLehrpool system.",
+ "lang_save": "Save",
+ "lang_title": "Title"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/branding-start.json b/lang/en/templates/sysconfig/branding-start.json
new file mode 100644
index 00000000..f419f5a4
--- /dev/null
+++ b/lang/en/templates/sysconfig/branding-start.json
@@ -0,0 +1,7 @@
+{
+ "lang_branding": "For best results, you should upload the logo in SVG format. SVG is a vector graphics format, which is advantageous for scaling. A good source for SVG logos of universities and colleges is their respective Wikipedia article.",
+ "lang_computerLoad": "Load image from local computer",
+ "lang_or": "or",
+ "lang_upload": "Upload",
+ "lang_urlLoad": "Load image from URL"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/cfg-finish.json b/lang/en/templates/sysconfig/cfg-finish.json
new file mode 100644
index 00000000..b8729636
--- /dev/null
+++ b/lang/en/templates/sysconfig/cfg-finish.json
@@ -0,0 +1,4 @@
+{
+ "lang_configurationActive": "Enable configuration",
+ "lang_configurationSuccess": "The configuration has been successfully created."
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/cfg-start.json b/lang/en/templates/sysconfig/cfg-start.json
new file mode 100644
index 00000000..8ab46f37
--- /dev/null
+++ b/lang/en/templates/sysconfig/cfg-start.json
@@ -0,0 +1,7 @@
+{
+ "lang_configuration": "Configuration",
+ "lang_configurationChoose": "Please select which modules will be used for this configuration.",
+ "lang_name": "Name",
+ "lang_new": "New",
+ "lang_next": "Next"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/custom-filelist.json b/lang/en/templates/sysconfig/custom-filelist.json
new file mode 100644
index 00000000..50bec5b5
--- /dev/null
+++ b/lang/en/templates/sysconfig/custom-filelist.json
@@ -0,0 +1,3 @@
+{
+ "lang_back": "Back"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/custom-fileselect.json b/lang/en/templates/sysconfig/custom-fileselect.json
new file mode 100644
index 00000000..2ae25e16
--- /dev/null
+++ b/lang/en/templates/sysconfig/custom-fileselect.json
@@ -0,0 +1,5 @@
+{
+ "lang_checkFileContent": "Here you have the possibility to check the contents of the archive again.",
+ "lang_moduleName": "Module Name",
+ "lang_next": "Next"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/custom-upload.json b/lang/en/templates/sysconfig/custom-upload.json
new file mode 100644
index 00000000..a568be7c
--- /dev/null
+++ b/lang/en/templates/sysconfig/custom-upload.json
@@ -0,0 +1,7 @@
+{
+ "lang_customModuleInfo1": "About a custom module, it is possible to add arbitrary files to a Linux system that is booted clients. For this purpose, an archive can be uploaded using a file system structure that is extracted in this form 1:1 in the booted Linux.",
+ "lang_customModuleInfo2": "Example: If the uploaded archive is the file etc\/example.conf, this file will be located as \/etc\/example.conf to a booted client.",
+ "lang_file": "File",
+ "lang_supportedFiles": "Supported File Formats",
+ "lang_upload": "Upload"
+} \ No newline at end of file
diff --git a/lang/en/templates/sysconfig/start.json b/lang/en/templates/sysconfig/start.json
new file mode 100644
index 00000000..4567d649
--- /dev/null
+++ b/lang/en/templates/sysconfig/start.json
@@ -0,0 +1,4 @@
+{
+ "lang_add": "Add",
+ "lang_moduleChoose": "Please select which type of configuration module you want to create."
+} \ No newline at end of file
diff --git a/lang/en/templates/systemstatus/_page.json b/lang/en/templates/systemstatus/_page.json
new file mode 100644
index 00000000..df976df4
--- /dev/null
+++ b/lang/en/templates/systemstatus/_page.json
@@ -0,0 +1,8 @@
+{
+ "lang_addressConfiguration": "Address Configuration",
+ "lang_iAmSure": "Yes, I am sure",
+ "lang_maintenance": "Maintenance",
+ "lang_services": "Services",
+ "lang_space": "Space",
+ "lang_system": "System"
+} \ No newline at end of file
diff --git a/lang/en/templates/systemstatus/addresses.json b/lang/en/templates/systemstatus/addresses.json
new file mode 100644
index 00000000..2c63c085
--- /dev/null
+++ b/lang/en/templates/systemstatus/addresses.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/lang/en/templates/systemstatus/diskstat.json b/lang/en/templates/systemstatus/diskstat.json
new file mode 100644
index 00000000..50dfc383
--- /dev/null
+++ b/lang/en/templates/systemstatus/diskstat.json
@@ -0,0 +1,6 @@
+{
+ "lang_capacity": "Capacity",
+ "lang_systemPartition": "System Partition",
+ "lang_vmStore": "VM Store",
+ "lang_vmStoreError": "Error when determining the available disk space on the VM location. Please check the configuration."
+} \ No newline at end of file
diff --git a/lang/en/templates/systemstatus/services.json b/lang/en/templates/systemstatus/services.json
new file mode 100644
index 00000000..2c63c085
--- /dev/null
+++ b/lang/en/templates/systemstatus/services.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/lang/en/templates/systemstatus/systeminfo.json b/lang/en/templates/systemstatus/systeminfo.json
new file mode 100644
index 00000000..602693f5
--- /dev/null
+++ b/lang/en/templates/systemstatus/systeminfo.json
@@ -0,0 +1,15 @@
+{
+ "lang_attention": "Attention!",
+ "lang_average": "Average",
+ "lang_cpuLoad": "CPU Load",
+ "lang_free": "Free",
+ "lang_logicCPUs": "Logic CPUs",
+ "lang_notDetermined": "Could not be determined",
+ "lang_occupied": "Occupied",
+ "lang_onlyOS": "OS Only",
+ "lang_ramUsage": "RAM Usage",
+ "lang_swapUsage": "swap Usage",
+ "lang_swapWarning": "Memory swap is being used. This may be an indication that the satellite server does not have enough physical memory available. In the case of performance problems or server instability you should consider equipping the server with more RAM.",
+ "lang_total": "Total",
+ "lang_uptimeOS": "OS Uptime"
+} \ No newline at end of file
diff --git a/lang/en/templates/translation/_page.json b/lang/en/templates/translation/_page.json
new file mode 100644
index 00000000..1c84d34c
--- /dev/null
+++ b/lang/en/templates/translation/_page.json
@@ -0,0 +1,8 @@
+{
+ "lang_adminInfo": "In this section you can change the JSON tags that contains the translated texts used by the site. To do this, select a template below to modify their respective tags. Alternatively, click the link below to change the messages of the site.",
+ "lang_editMessages": "Edit Messages",
+ "lang_english": "English",
+ "lang_german": "German",
+ "lang_langAdministration": "Language Administration",
+ "lang_portuguese": "Portuguese"
+} \ No newline at end of file
diff --git a/lang/en/templates/translation/messages.json b/lang/en/templates/translation/messages.json
new file mode 100644
index 00000000..433e9cdf
--- /dev/null
+++ b/lang/en/templates/translation/messages.json
@@ -0,0 +1,17 @@
+{
+ "lang_back": "Back",
+ "lang_deleteTAG": "Delete",
+ "lang_englishJSON": "English JSON",
+ "lang_englishTAG": "English TAG",
+ "lang_germanJSON": "German JSON",
+ "lang_germanTAG": "German TAG",
+ "lang_messages": "Messages",
+ "lang_messagesHardcoded": "Hardcoded Messages",
+ "lang_newTAG": "New TAG",
+ "lang_newTag": "New Tag",
+ "lang_portugueseJSON": "German JSON",
+ "lang_portugueseTAG": "Portuguese TAG",
+ "lang_save": "Save",
+ "lang_templateHint": "Hint: Yellow lines indicate a translation is missing and red lines indicate a tag is not being used by the template.",
+ "lang_templateMessagesHelp": ""
+} \ No newline at end of file
diff --git a/lang/en/templates/translation/template.json b/lang/en/templates/translation/template.json
new file mode 100644
index 00000000..ad07a8b6
--- /dev/null
+++ b/lang/en/templates/translation/template.json
@@ -0,0 +1,15 @@
+{
+ "lang_back": "Back",
+ "lang_createTag": "Create TAG",
+ "lang_deleteTAG": "Delete",
+ "lang_englishJSON": "English JSON",
+ "lang_englishTAG": "English TAG",
+ "lang_germanJSON": "German JSON",
+ "lang_germanTAG": "German TAG",
+ "lang_newTAG": "New TAG",
+ "lang_portugueseJSON": "German JSON",
+ "lang_portugueseTAG": "Portuguese TAG",
+ "lang_save": "Save",
+ "lang_templateAdminHelp": "",
+ "lang_templateHint": "Hint: Yellow lines indicate a translation is missing and red lines indicate a tag is not being used by the template."
+} \ No newline at end of file
diff --git a/lang/en/templates/vmstore/mount.json b/lang/en/templates/vmstore/mount.json
new file mode 100644
index 00000000..29814430
--- /dev/null
+++ b/lang/en/templates/vmstore/mount.json
@@ -0,0 +1,5 @@
+{
+ "lang_back": "Back",
+ "lang_configure": "Configure",
+ "lang_vmLocationConfiguration": "VM location is configured"
+} \ No newline at end of file
diff --git a/lang/lang.sql b/lang/lang.sql
new file mode 100644
index 00000000..d6ad37c5
--- /dev/null
+++ b/lang/lang.sql
@@ -0,0 +1,95 @@
+ALTER TABLE cat_setting ADD COLUMN en varchar(250);
+ALTER TABLE cat_setting ADD COLUMN de varchar(250);
+ALTER TABLE cat_setting ADD COLUMN pt varchar(250);
+
+UPDATE cat_setting SET en='Uncategorized', de='Unkategorisiert', pt='Sem Categoria' WHERE catid=0;
+UPDATE cat_setting SET en='Inactivity and Shutdown', de='Inaktivität und Abschaltung', pt='Inatividade e Desligamento' WHERE catid=1;
+UPDATE cat_setting SET en='Internet Access', de='Internetzugriff', pt='Acesso à Internet' WHERE catid=2;
+UPDATE cat_setting SET en='Time Synchronization', de='Zeitsynchronisation', pt='Sincronização de Tempo' WHERE catid=3;
+UPDATE cat_setting SET en='Basic System', de='Grundsystem', pt='Sistema Básico' WHERE catid=4;
+
+ALTER TABLE setting ADD COLUMN en text;
+ALTER TABLE setting ADD COLUMN de text;
+ALTER TABLE setting ADD COLUMN pt text;
+
+UPDATE setting SET en='To load addons. There currently only vmware is available.', de='Zu ladende Addons. Zur Zeit steht nur vmware zur Verfügung.', pt='Para carregar addons. Atualmente apenas o vmware está disponível.' WHERE setting='SLX_ADDONS';
+
+UPDATE setting SET en='Determines whether logins and logouts of the users should be reported to the satellite.
+*yes* = login with user ID
+*anonymous* = anonymous login
+*no* = no login', de='Legt fest, ob Logins und Logouts der Benutzer an den Satelliten gemeldet werden sollen.
+*yes* = Mit Benutzerkennung loggen
+*anonymous* = Anonym loggen
+*no* = Nicht loggen', pt='Determina se logins e logouts dos usuários devem ser reportados ao satélite.
+*yes* = Login com ID de usuário
+*anonymous* = login anônimo
+*no* = sem login' WHERE setting='SLX_REMOTE_LOG_SESSIONS';
+
+UPDATE setting SET en='Time /in seconds/, in which a user session may remain without action before it is terminated.
+Leave field blank to disable the function.', de='Zeit /in Sekunden/, die eine Benutzersitzung ohne Aktion sein darf, bevor sie beendet wird.
+Feld leer lassen, um die Funktion zu deaktivieren.', pt='Hora /em segundos/, em que uma sessão de usuário pode permanecer sem ação antes de ser encerrada.
+Deixe o campo em branco para desativar a função.' WHERE setting='SLX_LOGOUT_TIMEOUT';
+
+UPDATE setting SET en='Fixed time to turn off the computer, even if there is a user active.
+Several times can be specified, separated by spaces.', de='Feste Uhrzeit, zu der sich die Rechner ausschalten, auch wenn noch ein Benutzer aktiv ist.
+Mehrere Zeitpunkte können durch Leerzeichen getrennt angegeben werden.', pt='Horário fixo para desligar o computador, até mesmo caso tenha um usuário ativo.
+Múltiplos horários podem ser especificados, separados por espaços.' WHERE setting='SLX_SHUTDOWN_SCHEDULE';
+
+UPDATE setting SET en='Time in seconds after which a computer is switched off, if no user is logged on.
+Leave blank to disable the function.', de='Zeit in Sekunden, nach dem ein Rechner abgeschaltet wird, sofern kein Benutzer angemeldet ist.
+Feld leer lassen, um die Funktion zu deaktivieren.', pt='Tempo em segundos no qual um computador é desligado, caso não tenha um usuário logado.
+Deixar em branco para desabilitar a função.' WHERE setting='SLX_SHUTDOWN_TIMEOUT';
+
+UPDATE setting SET en='DNS domain in which the client integrate, provided the DHCP server does not specifies such.', de='DNS-Domäne, in die sich die Clients eingliedern, sofern der DHCP Server keine solche vorgibt.', pt='Domínio DNS no qual o cliente se integra, desde que o servidor DHCP não especifique tal.' WHERE setting='SLX_NET_DOMAIN';
+
+UPDATE setting SET en='Address or addresses ranges in which the proxy server is not used (for example the address range of the device). Valid entries are individual IP addresses and IP ranges in CIDR notation (for example 1.2.0.0/16). Multiple selections can be separated by spaces.', de='Adressen bzw. Adressbereiche, für die der Proxyserver nicht verwendet werden soll (z.B. der Adressbereich der Einrichtung). Gültige Angaben sind einzelne IP-Adressen, sowie IP-Bereiche in CIDR-Notation (z.B. 1.2.0.0/16). Mehrere Angaben können durch Leerzeichen getrennt werden.', pt='Intervalos de endereços em que o servidor proxy não é usado (por exemplo, o intervalo de endereço do dispositivo). As entradas válidas são endereços IP individuais e intervalos de IP em notação CIDR (por exemplo 1.2.0.0/16). Seleções múltiplas podem ser separadas por espaços.' WHERE setting='SLX_PROXY_BLACKLIST';
+
+UPDATE setting SET en='The address to use for the proxy server.', de='Die Adresse des zu verwendenden Proxy Servers.', pt='O endereço de servidor proxy a ser usado.' WHERE setting='SLX_PROXY_IP';
+
+UPDATE setting SET en='Determines whether a proxy server is required to access the Internet.
+*off* = do not use a Proxy.
+*on* = Always use proxy.
+*auto* = Only use proxy when the client PC is in a private address space.', de='Legt fest, ob zum Zugriff aufs Internet ein Proxy-Server benötigt wird.
+*off* = keinen Proxy benutzen.
+*on* = Proxy immer benutzen.
+*auto* = Proxy nur benutzen, wenn sich der Client-PC in einem privaten Adressbereich befindet.', pt='Determina se um servidor proxy é necessário para acessar a Internet.
+*off* = não utilizar proxy.
+*on* = sempre utilizar proxy.
+*auto* = apenas utilizar proxy quando o PC cliente estiver em um espaço de endereço privado.' WHERE setting='SLX_PROXY_MODE';
+
+UPDATE setting SET en='The port to use for the proxy server.', de='Der Port des zu verwendenden Proxy Servers.', pt='A porta a ser utilizada pelo servidor proxy.' WHERE setting='SLX_PROXY_PORT';
+
+UPDATE setting SET en='Type of the proxy.
+*socks4*, *socks5*,
+*http-connect* (HTTP proxy with support from the CONNECT method),
+*http-relay* (Classic HTTP proxy)', de='Art des Proxys.
+*socks4*, *socks5*,
+*http-connect* (HTTP Proxy mit Unterstützung der CONNECT-Methode),
+*http-relay* (Klassischer HTTP Proxy)', pt='Tipo do proxy.
+*socks4*, *socks5*,
+*http-connect* (Proxy HTTP com suporte ao método CONNECT),
+*http-relay* (Clássico proxy HTTP)' WHERE setting='SLX_PROXY_TYPE';
+
+UPDATE setting SET en='Specifies whether and how the internal clock of the computer should be set in relation to the system time of the /MiniLinux/.
+*off* = The internal clock of the computer is not changed.
+*local* = The internal clock is set to local time. Preferably if, for example, there is still a native Windows installation available on the PC.
+*utc* = The internal clock is set to the /Coordinated Universal Time/. This is the most common setup in a pure Linux environment.', de='Legt fest, ob und wie die interne Uhr des Rechners im Bezug auf die Systemzeit des /MiniLinux/ gesetzt werden soll.
+*off* = Die interne Uhr des Rechners wird nicht verändert.
+*local* = Die interne Uhr wird auf die Lokalzeit gesetzt. Bevorzugt wenn z.B. noch eine native Windows-Installation auf dem PC vorhanden ist.
+*utc* = Die interne Uhr wird auf die /Koordinierte Weltzeit/ gesetzt. Dies ist die gängige Einstellung in einem reinen Linux-Umfeld.', pt='Especifica se e como o relógio interno do computador deve ser definido em relação ao horário do sistema do /MiniLinux/.
+*off* = O relógio interno do computador não é alterado.
+*local* = O relógio interno está definido para a hora local. De preferência se, por exemplo, ainda existe uma instalação Windows nativo disponível no PC.
+*utc* = O relógio interno é definido para o /Tempo Universal Coordenado/. Esta é a configuração mais comum em um ambiente puramente Linux' WHERE setting='SLX_BIOS_CLOCK';
+
+UPDATE setting SET en='Address of the NTP time server. Multiple servers can be specified separated by spaces.
+The servers are queried in sequence until a responding server is found.', de='Adresse des NTP-Zeitservers. Es können mehrere Server mit Leerzeichen getrennt angegeben werden.
+Die Server werden der Reihe nach angefragt, bis ein antwortender Server gefunden wird.', pt='Endereço do servidor de horário NTP. Vários servidores podem ser especificados separados por espaços.
+Os servidores são consultados em seqüência até que um servidor respondendo for encontrado.' WHERE setting='SLX_NTP_SERVER';
+
+UPDATE setting SET en='The root password of the basic system. Only required for diagnostic purposes on the client.
+Leave field blank to disallow root logins.
+/Hint/: The password is encrypted with $6$ hash, so it is no longer readable after saving!', de='Das root-Passwort des Grundsystems. Wird nur für Diagnosezwecke am Client benötigt.
+Feld leer lassen, um root-Logins zu verbieten.
+/Hinweis/: Das Passwort wird crypt $6$ gehasht, daher wir das Passwort nach dem Speichern nicht mehr lesbar sein!', pt='A senha root do sistema base. Exigido somente para fins de diagnóstico no cliente.
+Deixar campo em branco para não permitir login com root.
+/Dica/: A senha é criptografada com hash $6$, então se torna ilegível após ser salva!' WHERE setting='SLX_ROOT_PASS';
diff --git a/lang/pt/flag.png b/lang/pt/flag.png
new file mode 100644
index 00000000..78c57dea
--- /dev/null
+++ b/lang/pt/flag.png
Binary files differ
diff --git a/lang/pt/messages-hardcoded.json b/lang/pt/messages-hardcoded.json
new file mode 100644
index 00000000..a233eb38
--- /dev/null
+++ b/lang/pt/messages-hardcoded.json
@@ -0,0 +1 @@
+{"lang_unknwonTaskManager":"Erro desconhecido do Gerenciador de Tarefas","lang_configurationCompilation":"Compilar configura\u00e7\u00e3o","lang_moduleAdd":"Adicionar M\u00f3dulo","lang_adAuthentication":"Autentica\u00e7\u00e3o do Active Directory","lang_adModule":"Este m\u00f3dulo possibilita a aplica\u00e7\u00e3o para os computadores clientes com as contas de usu\u00e1rio de um Active Directory. Dependendo da configura\u00e7\u00e3o, o uso de um diret\u00f3rio de usu\u00e1rio no cliente \u00e9 poss\u00edvel.","lang_authentication":"Autentica\u00e7\u00e3o","lang_generic":"Gen\u00e9rico","lang_addCustomModuleInfo":"Com um m\u00f3dulo estendido, \u00e9 poss\u00edvel adicionar os arquivos para o sistema b\u00e1sico que usa este m\u00f3dulo, por exemplo, para usar arquivos de configura\u00e7\u00e3o espec\u00edficas, que n\u00e3o podem ser criados com um dos outros assistentes. Adicionar um m\u00f3dulo estendido normalmente exige pelo menos um conhecimento b\u00e1sico do sistema Linux.","lang_days":"Dia(s)aaaaaaa","lang_hours":"Hora(s)","lang_specificLogo":"Logotipo Espec\u00edfico da Institui\u00e7\u00e3o","lang_institutionLogo":"Logotipo da Institui\u00e7\u00e3o","lang_infoLogo":"Este m\u00f3dulo \u00e9 usado para adicionar o logotipo de uma faculdade \/ universidade, que ent\u00e3o, por exemplo, \u00e9 exibido na tela de login.","lang_location":"Localiza\u00e7\u00e3o","lang_contentOf":"Conte\u00fado de \"","lang_serverConfiguration":"Configura\u00e7\u00e3o do servidor","lang_login":"Entrar","lang_createUser":"Criar Usu\u00e1rio"} \ No newline at end of file
diff --git a/lang/pt/messages.json b/lang/pt/messages.json
new file mode 100644
index 00000000..c11497b0
--- /dev/null
+++ b/lang/pt/messages.json
@@ -0,0 +1,45 @@
+{
+ "adduser-disabled": "Privil\u00e9gios insuficientes para adicionar mais usu\u00e1rios",
+ "adduser-success": "Usu\u00e1rio adicionado com sucesso",
+ "config-activated": "Configura\u00e7\u00e3o {{0}} foi ativada",
+ "config-invalid": "Configura\u00e7\u00e3o com id {{0}} n\u00e3o existe",
+ "debug-mode": "O modo de depura\u00e7\u00e3o est\u00e1 ativo!",
+ "deleted-tag": "Tag foi removida com sucesso",
+ "empty-archive": "O arquivo n\u00e3o cont\u00e9m arquivos ou diret\u00f3rios",
+ "empty-field": "Um campo n\u00e3o foi preenchido",
+ "error-archive": "Arquivo corrompido ou formato n\u00e3o suportado",
+ "error-extract": "N\u00e3o foi poss\u00edvel descompactar arquivo {{0}} para {{1}}",
+ "error-nodir": "O diret\u00f3rio {{0}} n\u00e3o existe.",
+ "error-read": "Erro ao ler {{0}}",
+ "error-rename": "N\u00e3o foi poss\u00edvel renomear {{0}} em {{1}}",
+ "error-write": "Erro ao escrever {{0}}",
+ "i18n-empty-tag": "",
+ "i18n-invalid-lang": "",
+ "invalid-action": "A\u00e7\u00e3o inv\u00e1lida: {{0}}",
+ "invalid-file": "O arquivo {{0}} n\u00e3o existe!",
+ "invalid-ip": "Nenhuma interface est\u00e1 configurada com o endere\u00e7o {{0}}",
+ "invalid-template": "Template selecionado n\u00e3o \u00e9 v\u00e1lido",
+ "loginfail": "Nome de usu\u00e1rio ou senha incorreta",
+ "missing-file": "N\u00e3o havia nenhum arquivo selecionado!",
+ "module-added": "M\u00f3dulo adicionado com sucesso",
+ "module-deleted": "M\u00f3dulo {{0}} foi exclu\u00eddo",
+ "module-in-use": "M\u00f3dulo {{0}} ainda \u00e9 usado pela configura\u00e7\u00e3o {{1}}",
+ "news-del-success": "Not\u00edcia exclu\u00edda",
+ "news-empty": "N\u00e3o havia not\u00edcias no banco de dados",
+ "news-save-success": "Not\u00edcia atualizada com sucesso",
+ "no-permission": "N\u00e3o h\u00e1 privil\u00e9gios suficientes para acessar essa p\u00e1gina",
+ "password-mismatch": "Senha e confirma\u00e7\u00e3o de senha n\u00e3o s\u00e3o iguais",
+ "reboot-unconfirmed": "Confirma\u00e7\u00e3o para reinicializar n\u00e3o foi confirmada",
+ "remote-parse-failed": "An\u00e1lise dos dados recebidos falhou ({{0}})",
+ "remote-timeout": "N\u00e3o foi poss\u00edvel baixar o recurso {{0}} ({{1}})",
+ "settings-updated": "As configura\u00e7\u00f5es foram atualizadas",
+ "task-error": "Falha na execu\u00e7\u00e3o: {{0}}",
+ "taskmanager-error": "Falha ao conectar-se ao Gerenciador de Tarefas",
+ "taskmanager-format": "Gerenciador de Tarefas retornou dados inv\u00e1lidos",
+ "token": "Token inv\u00e1lido. Ataque CSRF?",
+ "unsuccessful-action": "A a\u00e7\u00e3o n\u00e3o foi bem sucedida",
+ "updated-tags": "Tags foram atualizadas com sucesso",
+ "upload-complete": "Envio de {{0}} foi bem sucedido",
+ "upload-failed": "Envio falhou: {{0}}",
+ "value-invalid": "O valor {{1}} \u00e9 inv\u00e1lido para op\u00e7\u00e3o {{0}} e foi ignorado"
+} \ No newline at end of file
diff --git a/lang/pt/templates/dialog-generic.json b/lang/pt/templates/dialog-generic.json
new file mode 100644
index 00000000..3fff2478
--- /dev/null
+++ b/lang/pt/templates/dialog-generic.json
@@ -0,0 +1,3 @@
+{
+ "lang_next": "Pr\u00f3ximo"
+} \ No newline at end of file
diff --git a/lang/pt/templates/main-menu-login.json b/lang/pt/templates/main-menu-login.json
new file mode 100644
index 00000000..460a9180
--- /dev/null
+++ b/lang/pt/templates/main-menu-login.json
@@ -0,0 +1,14 @@
+{
+ "lang_administration": "Tradu\u00e7\u00f5es",
+ "lang_client": "Cliente",
+ "lang_clientLog": "Log dos Clientes",
+ "lang_configurationBasic": "Comfigura\u00e7\u00e3o B\u00e1sica",
+ "lang_configurationVariables": "Vari\u00e1veis de Configura\u00e7\u00e3o",
+ "lang_language": "L\u00edngua",
+ "lang_localization": "Localiza\u00e7\u00e3o",
+ "lang_login": "Entrar",
+ "lang_news": "Novidades",
+ "lang_server": "Servidor",
+ "lang_settings": "Op\u00e7\u00f5es",
+ "lang_vmLocation": "Localiza\u00e7\u00e3o da VM"
+} \ No newline at end of file
diff --git a/lang/pt/templates/main-menu-logout.json b/lang/pt/templates/main-menu-logout.json
new file mode 100644
index 00000000..d329ac47
--- /dev/null
+++ b/lang/pt/templates/main-menu-logout.json
@@ -0,0 +1,14 @@
+{
+ "lang_administration": "Tradu\u00e7\u00f5es",
+ "lang_client": "Cliente",
+ "lang_clientLog": "Log dos Clientes",
+ "lang_configurationBasic": "Comfigura\u00e7\u00e3o B\u00e1sica",
+ "lang_configurationVariables": "Vari\u00e1veis de Configura\u00e7\u00e3o",
+ "lang_language": "L\u00edngua",
+ "lang_localization": "Localiza\u00e7\u00e3o",
+ "lang_logout": "Sair",
+ "lang_news": "Novidades",
+ "lang_server": "Servidor",
+ "lang_settings": "Op\u00e7\u00f5es",
+ "lang_vmLocation": "Localiza\u00e7\u00e3o da VM"
+} \ No newline at end of file
diff --git a/lang/pt/templates/messagebox-error.json b/lang/pt/templates/messagebox-error.json
new file mode 100644
index 00000000..c44dc44f
--- /dev/null
+++ b/lang/pt/templates/messagebox-error.json
@@ -0,0 +1,3 @@
+[
+
+] \ No newline at end of file
diff --git a/lang/pt/templates/messagebox-info.json b/lang/pt/templates/messagebox-info.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/pt/templates/messagebox-info.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/pt/templates/messagebox-success.json b/lang/pt/templates/messagebox-success.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/pt/templates/messagebox-success.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/pt/templates/messagebox-warning.json b/lang/pt/templates/messagebox-warning.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/pt/templates/messagebox-warning.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/pt/templates/minilinux/download.json b/lang/pt/templates/minilinux/download.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/pt/templates/minilinux/download.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/pt/templates/minilinux/filelist.json b/lang/pt/templates/minilinux/filelist.json
new file mode 100644
index 00000000..c7ce8965
--- /dev/null
+++ b/lang/pt/templates/minilinux/filelist.json
@@ -0,0 +1,9 @@
+{
+ "lang_actual": "Atual",
+ "lang_canUpdate1": "Pelo menos um componente de",
+ "lang_canUpdate2": "pode ser atualizado. Para um bom funcionamento, recomenda-se manter todos os componentes atualizados.",
+ "lang_configurationPackageNotFound": "Pacote de configura\u00e7\u00e3o n\u00e3o encontrado!",
+ "lang_outdated": "Desatualizado",
+ "lang_systemUpdated": "O sistema est\u00e1 atualizado.",
+ "lang_update": "Atualizar"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-adduser.json b/lang/pt/templates/page-adduser.json
new file mode 100644
index 00000000..524f3dd5
--- /dev/null
+++ b/lang/pt/templates/page-adduser.json
@@ -0,0 +1,8 @@
+{
+ "lang_confirmation": "Confirmar Senha",
+ "lang_createUser": "Criar Usu\u00e1rio",
+ "lang_fullName": "Nome Completo",
+ "lang_password": "Senha",
+ "lang_telephone": "Telefone",
+ "lang_username": "Nome de Usu\u00e1rio"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-baseconfig.json b/lang/pt/templates/page-baseconfig.json
new file mode 100644
index 00000000..fc1e8508
--- /dev/null
+++ b/lang/pt/templates/page-baseconfig.json
@@ -0,0 +1,7 @@
+{
+ "lang_basicConfiguration": "Configura\u00e7\u00e3o B\u00e1sica",
+ "lang_close": "Fechar",
+ "lang_help": "Ajuda",
+ "lang_reset": "Limpar",
+ "lang_save": "Salvar"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-login.json b/lang/pt/templates/page-login.json
new file mode 100644
index 00000000..3d1e19eb
--- /dev/null
+++ b/lang/pt/templates/page-login.json
@@ -0,0 +1,8 @@
+{
+ "lang_enter": "Entrar",
+ "lang_login": "Entrar",
+ "lang_password": "Senha",
+ "lang_register": "Registrar",
+ "lang_rememberID": "Lembrar Usu\u00e1rio",
+ "lang_username": "Nome de Usu\u00e1rio"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-main-guest.json b/lang/pt/templates/page-main-guest.json
new file mode 100644
index 00000000..0e20f03b
--- /dev/null
+++ b/lang/pt/templates/page-main-guest.json
@@ -0,0 +1,5 @@
+{
+ "lang_introGuest": "Esta \u00e9 a interface de administra\u00e7\u00e3o da instala\u00e7\u00e3o local do bwLehrpool. Por favor, autentique-se para ajustar op\u00e7\u00f5es.",
+ "lang_login": "Entrar",
+ "lang_welcome": "Bem-vindo"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-main.json b/lang/pt/templates/page-main.json
new file mode 100644
index 00000000..e14b2663
--- /dev/null
+++ b/lang/pt/templates/page-main.json
@@ -0,0 +1,10 @@
+{
+ "lang_bootMenuWarning": "O menu de boot est\u00e1 desatualizado ou ainda n\u00e3o foi gerado.",
+ "lang_configure": "Configurar",
+ "lang_intro": "Esta \u00e9 a interface de configura\u00e7\u00e3o do bwLehrpool.",
+ "lang_minilinuxMissing": "Arquivos importantes da instala\u00e7\u00e3o do minilinux est\u00e3o faltando.",
+ "lang_systemConfiguration": "Confgura\u00e7\u00e3o do Sistema",
+ "lang_systemConfigurationNotChosen": "Uma configura\u00e7\u00e3o de sistema ainda n\u00e3o foi escolhida.",
+ "lang_vmLocationNotSet": "Uma localiza\u00e7\u00e3o para a m\u00e1quina virtual ainda n\u00e3o foi escolhida.",
+ "lang_welcome": "Bem-vindo"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-minilinux.json b/lang/pt/templates/page-minilinux.json
new file mode 100644
index 00000000..087e01be
--- /dev/null
+++ b/lang/pt/templates/page-minilinux.json
@@ -0,0 +1,4 @@
+{
+ "lang_errorGetting": "",
+ "lang_listObtained": ""
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-news.json b/lang/pt/templates/page-news.json
new file mode 100644
index 00000000..3c03cb34
--- /dev/null
+++ b/lang/pt/templates/page-news.json
@@ -0,0 +1,12 @@
+{
+ "lang_activeNews": "Novidades",
+ "lang_content": "Conte\u00fado",
+ "lang_date": "Data",
+ "lang_delete": "Excluir",
+ "lang_latestUpdate": "\u00daltima Atualiza\u00e7\u00e3o",
+ "lang_newsIntro": "Aqui voc\u00ea tem a possibilidade de editar as novidades que s\u00e3o mostradas para os clientes do bwLehrpool.",
+ "lang_newsOld": "Antigas",
+ "lang_save": "Salvar",
+ "lang_show": "Mostrar",
+ "lang_title": "T\u00edtulo"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-remote-tgz-list.json b/lang/pt/templates/page-remote-tgz-list.json
new file mode 100644
index 00000000..ce3b52b0
--- /dev/null
+++ b/lang/pt/templates/page-remote-tgz-list.json
@@ -0,0 +1,5 @@
+{
+ "lang_centralConfiguration": "Configura\u00e7\u00f5es centrais dispon\u00edveis",
+ "lang_configurationPackageNotFound": "Pacote de configura\u00e7\u00e3o n\u00e3o encontrado!",
+ "lang_systemConfiguration": "Confgura\u00e7\u00e3o do Sistema"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-syslog.json b/lang/pt/templates/page-syslog.json
new file mode 100644
index 00000000..432c065d
--- /dev/null
+++ b/lang/pt/templates/page-syslog.json
@@ -0,0 +1,10 @@
+{
+ "lang_client": "Cliente",
+ "lang_clientLog": "Log dos Clientes",
+ "lang_details": "Detalhes",
+ "lang_event": "Evento",
+ "lang_filter": "Filtro",
+ "lang_go": "Ir",
+ "lang_not": "n\u00e3o",
+ "lang_when": "Quando"
+} \ No newline at end of file
diff --git a/lang/pt/templates/page-vmstore.json b/lang/pt/templates/page-vmstore.json
new file mode 100644
index 00000000..334c9881
--- /dev/null
+++ b/lang/pt/templates/page-vmstore.json
@@ -0,0 +1,15 @@
+{
+ "lang_close": "Fechar",
+ "lang_intern": "Iterna",
+ "lang_noAdditionalInformation": "Nenhuma configura\u00e7\u00e3o adicional necess\u00e1ria",
+ "lang_password": "Senha",
+ "lang_readOnly": "Acesso Somente Leitura",
+ "lang_readWrite": "Acesso Leitura\/Escrita",
+ "lang_save": "Salvar",
+ "lang_username": "Nome de Usu\u00e1rio",
+ "lang_vmLocation": "Localiza\u00e7\u00e3o da VM",
+ "lang_vmLocationChoose": "Por favor, escolha aonde as imagens das m\u00e1quinas virtuais ser\u00e3o armazenadas.",
+ "lang_vmLocationHelp1": "Para fins de teste, as VMs podem ser armazenados diretamente no servidor sat\u00e9lite. No entanto, se voc\u00ea operar o vmdk do sat\u00e9lite entregue por favor lembre-se que voc\u00ea tem apenas cerca de 100 GB de mem\u00f3ria.",
+ "lang_vmLocationHelp2": "Em opera\u00e7\u00e3o, faz sentido para este usar um armazenamento de rede de alto desempenho. Este armazenamento de rede pode ser integrado atrav\u00e9s de NFS ou CIFS \/ SMB. Em qualquer caso, deve-se assegurar de que o servidor de sat\u00e9lite tenha acesso de grava\u00e7\u00e3o para este armazenamento de rede para poder adicionar uma nova m\u00e1quina virtual. Ao utilizar NFSv3 este pode ser configurado com base em IP, para o uso de CIFS \/ SMB, voc\u00ea pode acessar as divulga\u00e7\u00f5es de dados que lhe permitiria escrever.",
+ "lang_vmLocationHelp3": "Os clientes bwLehrpool s\u00f3 precisam ter acesso de leitura ao armazenamento de rede (e por raz\u00f5es de seguran\u00e7a, realmente s\u00f3 pode ler). Em CIFS \/ SMB Voc\u00ea pode fazer isso mais facilmente, permitindo o acesso a visitantes sem senha com acesso de leitura."
+} \ No newline at end of file
diff --git a/lang/pt/templates/pagenav.json b/lang/pt/templates/pagenav.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/pt/templates/pagenav.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/pt/templates/serversetup/ipaddress.json b/lang/pt/templates/serversetup/ipaddress.json
new file mode 100644
index 00000000..57eb2070
--- /dev/null
+++ b/lang/pt/templates/serversetup/ipaddress.json
@@ -0,0 +1,7 @@
+{
+ "lang_active": "Ativo",
+ "lang_bootAddress": "Endere\u00e7o Boot do Servidor",
+ "lang_bootHint": "O menu de boot deve ser recriado ap\u00f3s alterar o endere\u00e7o IP. Geralmente isso \u00e9 feito automaticamente, mas o processo tamb\u00e9m pode ser acionado manualmente na se\u00e7\u00e3o do menu de boot.",
+ "lang_chooseIP": "Por favor, selecione o endere\u00e7o IP que o servidor do cliente utilizar\u00e1 realizar o boot.",
+ "lang_set": "Conjunto"
+} \ No newline at end of file
diff --git a/lang/pt/templates/serversetup/ipxe.json b/lang/pt/templates/serversetup/ipxe.json
new file mode 100644
index 00000000..4c0c8fa5
--- /dev/null
+++ b/lang/pt/templates/serversetup/ipxe.json
@@ -0,0 +1,15 @@
+{
+ "lang_bootBehavior": "Comportamento Padr\u00e3o de Boot",
+ "lang_bootInfo": "Aqui ajustes podem ser feitos na apar\u00eancia do menu de boot.",
+ "lang_bootMenu": "Menu de Boot",
+ "lang_bootMenuCreate": "Criar Menu de Boot",
+ "lang_close": "Fechar",
+ "lang_example": "Exemplo",
+ "lang_localHDD": "HDD Local",
+ "lang_menuCustom": "Menu Adicional Customizado",
+ "lang_menuCustomHint1": "Aqui voc\u00ea tem a oportunidade de adicionar seu pr\u00f3prio c\u00f3digo de menu para o menu PXE exibido, por exemplo, para se referir a outro servidor PXE. O formato corresponde ao formato de menu syslinux.",
+ "lang_menuCustomHint2": "Voc\u00ea pode criar uma ou mais entradas. Se voc\u00ea quiser criar uma entrada que \u00e9 iniciada automaticamente quando o usu\u00e1rio faz uma sele\u00e7\u00e3o, atribua como",
+ "lang_menuCustomHint3": "e selecione como o comportamento de boot padr\u00e3o tamb\u00e9m my-entry.",
+ "lang_menuDisplayTime": "Tempo de Exibi\u00e7\u00e3o do Menu",
+ "lang_seconds": "Segundos"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/_page.json b/lang/pt/templates/sysconfig/_page.json
new file mode 100644
index 00000000..b0c1f8e9
--- /dev/null
+++ b/lang/pt/templates/sysconfig/_page.json
@@ -0,0 +1,18 @@
+{
+ "lang_activate": "Ativar",
+ "lang_active": "",
+ "lang_availableModules": "M\u00f3dulos de Configura\u00e7\u00e3o Dispon\u00edveis",
+ "lang_availableSystem": "Configura\u00e7\u00f5es de Sistema Dispon\u00edveis",
+ "lang_close": "Fechar",
+ "lang_configurationModuleNotFound": "M\u00f3dulo de configura\u00e7\u00e3o n\u00e3o encontrado!",
+ "lang_delete": "Excluir",
+ "lang_helpModuleConfiguration": "M\u00f3dulos de configura\u00e7\u00e3o s\u00e3o as pe\u00e7as fundamentais para a cria\u00e7\u00e3o de uma configura\u00e7\u00e3o de sistema. Aqui voc\u00ea pode criar tanto m\u00f3dulos gen\u00e9ricos atrav\u00e9s de nossa interface, tanto quanto criar m\u00f3dulos completamente customizados (\u00e9 necess\u00e1rio conhecimento de Linux avan\u00e7ado).",
+ "lang_helpSystemConfiguration": "A localiza\u00e7\u00e3o fundamental do sistema bwLehrpool \u00e9 feita atrav\u00e9s de uma configura\u00e7\u00e3o de sistema. Isso inclui aspectos como o m\u00e9todo de autentica\u00e7\u00e3o de usu\u00e1rios (por exemplo, Diret\u00f3rio Ativo, LDAP), configura\u00e7\u00e3o de impressora, diret\u00f3rios home, etc. Uma configura\u00e7\u00e3o de sistema \u00e9 composta por um ou mais m\u00f3dulo de configura\u00e7\u00e3o, que podem ser gerenciados na parte inferior da p\u00e1gina.",
+ "lang_moduleConfiguration": "Configura\u00e7\u00e3o do M\u00f3dulo",
+ "lang_newConfiguration": "Nova Configura\u00e7\u00e3o",
+ "lang_newModule": "Novo M\u00f3dulo",
+ "lang_show": "Mostrar",
+ "lang_systemConfiguration": "Confgura\u00e7\u00e3o do Sistema",
+ "lang_systemConfigurationAlert": "Antes de criar uma configura\u00e7\u00e3o de sistema, voc\u00ea deve criar primeiro um m\u00f3dulo de configura\u00e7\u00e3o.",
+ "lang_systemConfigurationNotFound": "Nenhuma configura\u00e7\u00e3o de sistena encontrada. Crie uma nova configura\u00e7\u00e3o a partir dos m\u00f3dulos de configura\u00e7\u00e3o abaixo."
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/ad-checkconnection.json b/lang/pt/templates/sysconfig/ad-checkconnection.json
new file mode 100644
index 00000000..cf1fbfba
--- /dev/null
+++ b/lang/pt/templates/sysconfig/ad-checkconnection.json
@@ -0,0 +1,5 @@
+{
+ "lang_back": "Voltar",
+ "lang_connectionWait": "A conex\u00e3o com o servidor AD especificado agora est\u00e1 checada. Por favor, aguarde um momento.",
+ "lang_skip": "Pular"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/ad-finish.json b/lang/pt/templates/sysconfig/ad-finish.json
new file mode 100644
index 00000000..5345410c
--- /dev/null
+++ b/lang/pt/templates/sysconfig/ad-finish.json
@@ -0,0 +1,7 @@
+{
+ "lang_adStarted": "O AD-proxy est\u00e1 configurado e come\u00e7ou ...",
+ "lang_generateModule": "Gerar M\u00f3dulo",
+ "lang_restartWizard": "Reiniciar Assistente",
+ "lang_systemConfiguration": "Confgura\u00e7\u00e3o do Sistema",
+ "lang_to": "Para"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/ad-start.json b/lang/pt/templates/sysconfig/ad-start.json
new file mode 100644
index 00000000..e9f4c887
--- /dev/null
+++ b/lang/pt/templates/sysconfig/ad-start.json
@@ -0,0 +1,15 @@
+{
+ "lang_adText1": "Para configurar a autentica\u00e7\u00e3o de usu\u00e1rio por meio do Active Directory, um usu\u00e1rio dedicado \u00e9 necess\u00e1rio no AD pr\u00f3ximo ao endere\u00e7o do servidor, que \u00e9 endere\u00e7ado pelo AD.",
+ "lang_adText2": "Este usu\u00e1rio n\u00e3o precisa de direitos especiais, voc\u00ea pode seguir este usu\u00e1rio para escapar da seguran\u00e7a e dos direitos para fazer logon. O usu\u00e1rio s\u00f3 precisa ter permiss\u00f5es suficientes para executar a liga\u00e7\u00e3o LDAP no AD, e procurar por usu\u00e1rios.",
+ "lang_adText3": "A seguir o nome distinto do usu\u00e1rio deve ser especificado. Voc\u00ea pode determinar isso pelo programa de linha de comando dsquery em um controlador de dom\u00ednio como a seguinte chamada:",
+ "lang_adText4": "Depois de inserir todos os dados necess\u00e1rios na pr\u00f3xima etapa, ela verifica se a comunica\u00e7\u00e3o \u00e9 poss\u00edvel com o AD.",
+ "lang_bindDN": "Vincular DN",
+ "lang_close": "Fechar",
+ "lang_next": "Pr\u00f3ximo",
+ "lang_password": "Senha",
+ "lang_searchBase": "Base de Pesquisa",
+ "lang_userDirectory": "Diret\u00f3rio de Usu\u00e1rio",
+ "lang_userDirectoryInfo1": "Opcional: Se os clientes devem incorporar um diret\u00f3rio separado (diret\u00f3rio home, diret\u00f3rio de usu\u00e1rio) de um servidor para o usu\u00e1rio, digite aqui o formato em nota\u00e7\u00e3o UNC, por exemplo,",
+ "lang_userDirectoryInfo2": "%s \u00e9 um marcador para o nome de login do usu\u00e1rio.",
+ "lang_userDirectoryInfo3": "O diret\u00f3rio \u00e9 carregado com as mesmas credenciais que o usu\u00e1rio especifica quando entra. (Isto \u00e9, n\u00e3o h\u00e1 suporte Kerberos, etc)"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/branding-check.json b/lang/pt/templates/sysconfig/branding-check.json
new file mode 100644
index 00000000..c1500f55
--- /dev/null
+++ b/lang/pt/templates/sysconfig/branding-check.json
@@ -0,0 +1,5 @@
+{
+ "lang_brandingInfo": "Abaixo voc\u00ea pode conferir o logotipo selecionado. Se voc\u00ea n\u00e3o pode ver o logotipo, por favor, verifique se voc\u00ea usou uma imagem SVG v\u00e1lido. Alternativamente, \u00e9 poss\u00edvel que durante o processamento da imagem, ocorreu um erro. Portanto, voc\u00ea pode salvar o m\u00f3dulo de qualquer maneira e testar se o logotipo \u00e9 exibido no sistema bwLehrpool.",
+ "lang_save": "Salvar",
+ "lang_title": "T\u00edtulo"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/branding-start.json b/lang/pt/templates/sysconfig/branding-start.json
new file mode 100644
index 00000000..84f4b687
--- /dev/null
+++ b/lang/pt/templates/sysconfig/branding-start.json
@@ -0,0 +1,7 @@
+{
+ "lang_branding": "Para melhores resultados, voc\u00ea deve fazer o upload do logotipo em formato SVG. SVG \u00e9 um formato de gr\u00e1ficos vetoriais, o que \u00e9 vantajoso para a amplia\u00e7\u00e3o. Uma boa fonte para logotipos SVG das universidades e faculdades \u00e9 o seu respectivo artigo da Wikipedia.",
+ "lang_computerLoad": "Carregar imagem do computador local ",
+ "lang_or": "ou",
+ "lang_upload": "Enviar",
+ "lang_urlLoad": "Carregar imagem a partir de uma URL"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/cfg-finish.json b/lang/pt/templates/sysconfig/cfg-finish.json
new file mode 100644
index 00000000..fb3a55d5
--- /dev/null
+++ b/lang/pt/templates/sysconfig/cfg-finish.json
@@ -0,0 +1,4 @@
+{
+ "lang_configurationActive": "Ativar configura\u00e7\u00e3o",
+ "lang_configurationSuccess": "A configura\u00e7\u00e3o foi criada com sucesso."
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/cfg-start.json b/lang/pt/templates/sysconfig/cfg-start.json
new file mode 100644
index 00000000..7b980f3c
--- /dev/null
+++ b/lang/pt/templates/sysconfig/cfg-start.json
@@ -0,0 +1,7 @@
+{
+ "lang_configuration": "Configura\u00e7\u00e3o",
+ "lang_configurationChoose": "Por favor, selecione qual os m\u00f3dulos ser\u00e3o usados \u200b\u200bpara esta configura\u00e7\u00e3o.",
+ "lang_name": "Nome",
+ "lang_new": "Nova",
+ "lang_next": "Pr\u00f3ximo"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/custom-filelist.json b/lang/pt/templates/sysconfig/custom-filelist.json
new file mode 100644
index 00000000..fc42bed6
--- /dev/null
+++ b/lang/pt/templates/sysconfig/custom-filelist.json
@@ -0,0 +1,3 @@
+{
+ "lang_back": "Voltar"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/custom-fileselect.json b/lang/pt/templates/sysconfig/custom-fileselect.json
new file mode 100644
index 00000000..01512cbb
--- /dev/null
+++ b/lang/pt/templates/sysconfig/custom-fileselect.json
@@ -0,0 +1,5 @@
+{
+ "lang_checkFileContent": "Aqui voc\u00ea tem a possibilidade de verificar o conte\u00fado do arquivo novamente.",
+ "lang_moduleName": "Nome do M\u00f3dulo",
+ "lang_next": "Pr\u00f3ximo"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/custom-upload.json b/lang/pt/templates/sysconfig/custom-upload.json
new file mode 100644
index 00000000..db1cd58f
--- /dev/null
+++ b/lang/pt/templates/sysconfig/custom-upload.json
@@ -0,0 +1,7 @@
+{
+ "lang_customModuleInfo1": "Sobre um m\u00f3dulo personalizado, \u00e9 poss\u00edvel adicionar arquivos arbitr\u00e1rios para um sistema Linux que \u00e9 inicializado clientes. Para isso, um arquivo pode ser carregado atrav\u00e9s de uma estrutura do sistema de arquivos que \u00e9 extra\u00eddo desta forma 1:1 no Linux inicializado.",
+ "lang_customModuleInfo2": "Exemplo: Se o arquivo enviado for etc\/examplo.conf, este arquivo estar\u00e1 localizado em \/etc\/examplo.conf para um cliente inicializado.",
+ "lang_file": "Arquivo",
+ "lang_supportedFiles": "Formatos de Arquivos Suportados",
+ "lang_upload": "Carregar"
+} \ No newline at end of file
diff --git a/lang/pt/templates/sysconfig/start.json b/lang/pt/templates/sysconfig/start.json
new file mode 100644
index 00000000..7cca8df0
--- /dev/null
+++ b/lang/pt/templates/sysconfig/start.json
@@ -0,0 +1,4 @@
+{
+ "lang_add": "Adicionar",
+ "lang_moduleChoose": "Por favor, selecione qual tipo de m\u00f3dulo de configura\u00e7\u00e3o que voc\u00ea deseja criar."
+} \ No newline at end of file
diff --git a/lang/pt/templates/systemstatus/_page.json b/lang/pt/templates/systemstatus/_page.json
new file mode 100644
index 00000000..d1cd9451
--- /dev/null
+++ b/lang/pt/templates/systemstatus/_page.json
@@ -0,0 +1,8 @@
+{
+ "lang_addressConfiguration": "Configura\u00e7\u00e3o do Endere\u00e7o",
+ "lang_iAmSure": "Sim, eu tenho certeza",
+ "lang_maintenance": "Manuten\u00e7\u00e3o",
+ "lang_services": "Servi\u00e7os",
+ "lang_space": "Espa\u00e7o",
+ "lang_system": "Sistema"
+} \ No newline at end of file
diff --git a/lang/pt/templates/systemstatus/addresses.json b/lang/pt/templates/systemstatus/addresses.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/pt/templates/systemstatus/addresses.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/pt/templates/systemstatus/diskstat.json b/lang/pt/templates/systemstatus/diskstat.json
new file mode 100644
index 00000000..555b38aa
--- /dev/null
+++ b/lang/pt/templates/systemstatus/diskstat.json
@@ -0,0 +1,6 @@
+{
+ "lang_capacity": "Capacidade",
+ "lang_systemPartition": "Parti\u00e7\u00e3o do Sistema",
+ "lang_vmStore": "Armazenamento da VM",
+ "lang_vmStoreError": "Erro ao determinar o espa\u00e7o em disco dispon\u00edvel no local da VM. Por favor, verifique a configura\u00e7\u00e3o."
+} \ No newline at end of file
diff --git a/lang/pt/templates/systemstatus/services.json b/lang/pt/templates/systemstatus/services.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/lang/pt/templates/systemstatus/services.json
@@ -0,0 +1 @@
+{}
diff --git a/lang/pt/templates/systemstatus/systeminfo.json b/lang/pt/templates/systemstatus/systeminfo.json
new file mode 100644
index 00000000..75fdcca3
--- /dev/null
+++ b/lang/pt/templates/systemstatus/systeminfo.json
@@ -0,0 +1,15 @@
+{
+ "lang_attention": "Aten\u00e7\u00e3o!",
+ "lang_average": "M\u00e9dia",
+ "lang_cpuLoad": "Carga da CPU",
+ "lang_free": "Livre",
+ "lang_logicCPUs": "CPUs L\u00f3gicas",
+ "lang_notDetermined": "N\u00e3o foi poss\u00edvel determinar",
+ "lang_occupied": "Ocupado",
+ "lang_onlyOS": "Apenas SO",
+ "lang_ramUsage": "Uso da RAM",
+ "lang_swapUsage": "Uso do swap",
+ "lang_swapWarning": "Swap de mem\u00f3ria est\u00e1 sendo usado. Isso pode ser uma indica\u00e7\u00e3o de que o servidor de sat\u00e9lite n\u00e3o tem mem\u00f3ria f\u00edsica suficiente dispon\u00edvel. No caso de problemas de desempenho ou instabilidade do servidor voc\u00ea deve considerar equipar o servidor com mais mem\u00f3ria RAM.",
+ "lang_total": "Total",
+ "lang_uptimeOS": "Tempo de Atividade do SO"
+} \ No newline at end of file
diff --git a/lang/pt/templates/translation/_page.json b/lang/pt/templates/translation/_page.json
new file mode 100644
index 00000000..af575a4d
--- /dev/null
+++ b/lang/pt/templates/translation/_page.json
@@ -0,0 +1,8 @@
+{
+ "lang_adminInfo": "Nesta se\u00e7\u00e3o \u00e9 poss\u00edvel alterar as TAGs de JSON que cont\u00e9m os textos traduzidos utilizados no site. Para fazer isto, selecione um template abaixo para modificar suas respectivas TAGs. Alternativamente, clique no link abaixo para alterar as mensagens do site.",
+ "lang_editMessages": "Editar Mensagens",
+ "lang_english": "Ingl\u00eas",
+ "lang_german": "Alem\u00e3o",
+ "lang_langAdministration": "Administra\u00e7\u00e3o da L\u00edngua",
+ "lang_portuguese": "Portugu\u00eas"
+} \ No newline at end of file
diff --git a/lang/pt/templates/translation/messages.json b/lang/pt/templates/translation/messages.json
new file mode 100644
index 00000000..cb5fc59b
--- /dev/null
+++ b/lang/pt/templates/translation/messages.json
@@ -0,0 +1,17 @@
+{
+ "lang_back": "Voltar",
+ "lang_deleteTAG": "Excluir",
+ "lang_englishJSON": "JSON Ingl\u00eas",
+ "lang_englishTAG": "Mensagem em Ingl\u00eas",
+ "lang_germanJSON": "JSON Alem\u00e3o",
+ "lang_germanTAG": "Mensagem em Alem\u00e3o",
+ "lang_messages": "Mensagens",
+ "lang_messagesHardcoded": "Mensagens Hardcoded",
+ "lang_newTAG": "Nova TAG",
+ "lang_newTag": "Nova Mensagem",
+ "lang_portugueseJSON": "JSON Portugu\u00eas",
+ "lang_portugueseTAG": "Mensagem em Portugu\u00eas",
+ "lang_save": "Salvar",
+ "lang_templateHint": "Dica: linhas amarelas indicam que uma tradu\u00e7\u00e3o est\u00e1 faltando e linhas vermelhas indicam que uma tag n\u00e3o \u00e9 utilizada pelo template.",
+ "lang_templateMessagesHelp": "Aqui \u00e9 poss\u00edvel alterar as mensagens exibidas no site."
+} \ No newline at end of file
diff --git a/lang/pt/templates/translation/template.json b/lang/pt/templates/translation/template.json
new file mode 100644
index 00000000..008da819
--- /dev/null
+++ b/lang/pt/templates/translation/template.json
@@ -0,0 +1,15 @@
+{
+ "lang_back": "Voltar",
+ "lang_createTag": "Criar TAG",
+ "lang_deleteTAG": "Excluir",
+ "lang_englishJSON": "JSON Ingl\u00eas",
+ "lang_englishTAG": "TAG em Ingl\u00eas",
+ "lang_germanJSON": "JSON Alem\u00e3o",
+ "lang_germanTAG": "TAG em Alem\u00e3o",
+ "lang_newTAG": "Nova TAG",
+ "lang_portugueseJSON": "JSON Portugu\u00eas",
+ "lang_portugueseTAG": "TAG em Portugu\u00eas",
+ "lang_save": "Salvar",
+ "lang_templateAdminHelp": "",
+ "lang_templateHint": "Dica: linhas amarelas indicam que uma tradu\u00e7\u00e3o est\u00e1 faltando e linhas vermelhas indicam que uma tag n\u00e3o \u00e9 utilizada pelo template."
+} \ No newline at end of file
diff --git a/lang/pt/templates/vmstore/mount.json b/lang/pt/templates/vmstore/mount.json
new file mode 100644
index 00000000..0a103374
--- /dev/null
+++ b/lang/pt/templates/vmstore/mount.json
@@ -0,0 +1,5 @@
+{
+ "lang_back": "Voltar",
+ "lang_configure": "configurar",
+ "lang_vmLocationConfiguration": "Localiza\u00e7\u00e3o da VM \u00e9 configurada"
+} \ No newline at end of file
diff --git a/modules/adduser.inc.php b/modules/adduser.inc.php
index 19fa5425..db1b6f27 100644
--- a/modules/adduser.inc.php
+++ b/modules/adduser.inc.php
@@ -47,9 +47,11 @@ class Page_AddUser extends Page
if (Database::queryFirst('SELECT userid FROM user LIMIT 1') !== false) {
Message::addError('adduser-disabled');
} else {
- Render::setTitle('Benutzer anlegen');
+
+ Render::setTitle(Dictionary::translate('lang_createUser'));
Render::addTemplate('page-adduser', $_POST);
}
+
}
}
diff --git a/modules/baseconfig.inc.php b/modules/baseconfig.inc.php
index 7d586ef3..7c8aaa4d 100644
--- a/modules/baseconfig.inc.php
+++ b/modules/baseconfig.inc.php
@@ -66,7 +66,7 @@ class Page_BaseConfig extends Page
{
if (!User::hasPermission('superadmin')) {
Message::addError('no-permission');
- return;
+ Util::redirect('?do=Main');
}
// Build left joins for specific settings
$joins = '';
@@ -75,7 +75,7 @@ class Page_BaseConfig extends Page
}
// List global config option
$settings = array();
- $res = Database::simpleQuery('SELECT cat_setting.name AS category_name, setting.setting, setting.defaultvalue, setting.permissions, setting.description, tbl.value
+ $res = Database::simpleQuery('SELECT cat_setting.' . LANG . ' AS category_name, setting.setting, setting.defaultvalue, setting.permissions, setting.' . LANG . ' AS description, tbl.value
FROM setting
INNER JOIN cat_setting USING (catid)
LEFT JOIN setting_global AS tbl USING (setting)
diff --git a/modules/minilinux.inc.php b/modules/minilinux.inc.php
index 8080b76d..36a097b5 100644
--- a/modules/minilinux.inc.php
+++ b/modules/minilinux.inc.php
@@ -25,7 +25,7 @@ class Page_MiniLinux extends Page
$data = Property::getVersionCheckInformation();
if (!is_array($data) || !isset($data['systems'])) {
echo Render::parse('messagebox-error', array(
- 'message' => 'Fehler beim Abrufen der Liste: ' . $data
+ 'message' => 'Failed to retrieve the list: ' . $data
));
return;
}
diff --git a/modules/news.inc.php b/modules/news.inc.php
index c8f102c0..d0aa32ea 100644
--- a/modules/news.inc.php
+++ b/modules/news.inc.php
@@ -30,7 +30,7 @@ class Page_News extends Page
// only admins should be able to edit news
if (!User::hasPermission('superadmin')) {
Message::addError('no-permission');
- return;
+ Util::redirect('?do=Main');
}
// check which action we need to do
@@ -85,14 +85,12 @@ class Page_News extends Page
if ($row['newsid'] == $this->newsId) $row['active'] = "active";
$lines[] = $row;
}
- // render each entry
$paginate->render('page-news', array(
'token' => Session::get('token'),
'latestDate' => ($this->newsDate ? date('d.m.Y H:i', $this->newsDate) : '--'),
'latestContent' => $this->newsContent,
'latestTitle' => $this->newsTitle,
- 'list' => $lines
- ));
+ 'list' => $lines ));
}
/**
diff --git a/modules/serversetup.inc.php b/modules/serversetup.inc.php
index 527c0940..b13fc90d 100644
--- a/modules/serversetup.inc.php
+++ b/modules/serversetup.inc.php
@@ -39,7 +39,7 @@ class Page_ServerSetup extends Page
protected function doRender()
{
- Render::setTitle('Serverseitige Konfiguration');
+ Render::setTitle(Dictionary::translate('lang_serverConfiguration'));
Render::addTemplate('serversetup/ipaddress', array(
'ips' => $this->taskStatus['data']['addresses']
diff --git a/modules/session.inc.php b/modules/session.inc.php
index aa7719ab..97cd51d9 100644
--- a/modules/session.inc.php
+++ b/modules/session.inc.php
@@ -34,7 +34,7 @@ class Page_Session extends Page
protected function doRender()
{
if ($_REQUEST['action'] === 'login') {
- Render::setTitle('Anmelden');
+ Render::setTitle(Dictionary::translate('lang_login'));
Render::addTemplate('page-login');
return;
}
diff --git a/modules/sysconfig.inc.php b/modules/sysconfig.inc.php
index 8be001e6..f873fe9e 100644
--- a/modules/sysconfig.inc.php
+++ b/modules/sysconfig.inc.php
@@ -96,7 +96,7 @@ class Page_SysConfig extends Page
*/
protected function doRender()
{
- Render::setTitle('Lokalisierung');
+ Render::setTitle(Dictionary::translate('lang_location'));
$action = Request::any('action', 'list');
switch ($action) {
@@ -199,7 +199,7 @@ class Page_SysConfig extends Page
// render the template
- Render::addDialog('Inhalt von "' . $row['title'] . '"', false, 'sysconfig/custom-filelist', array(
+ Render::addDialog(Dictionary::translate('lang_contentOf') . $row['title'] . '"', false, 'sysconfig/custom-filelist', array(
'files' => $list,
));
}
diff --git a/modules/sysconfig/addconfig.inc.php b/modules/sysconfig/addconfig.inc.php
index 29c84f4a..1e2e870a 100644
--- a/modules/sysconfig/addconfig.inc.php
+++ b/modules/sysconfig/addconfig.inc.php
@@ -40,7 +40,7 @@ abstract class AddConfig_Base
} elseif (isset($status['statusCode'])) {
$error = $status['statusCode'];
} else {
- $error = 'Unbekannter Taskmanager-Fehler'; // TODO: No text
+ $error = Dictionary::translate('lang_unknwonTaskManager'); // TODO: No text
}
Message::addError('task-error', $error);
Util::redirect('?do=SysConfig');
@@ -125,7 +125,7 @@ class AddConfig_Start extends AddConfig_Base
if (empty($row['filepath']) || !file_exists($row['filepath'])) $row['missing'] = true;
$mods[$row['moduletype']]['modules'][] = $row;
}
- Render::addDialog('Konfiguration zusammenstellen', false, 'sysconfig/cfg-start', array(
+ Render::addDialog(Dictionary::translate("lang_configurationCompilation"), false, 'sysconfig/cfg-start', array(
'step' => 'AddConfig_Finish',
'groups' => array_values($mods)
));
@@ -195,7 +195,7 @@ class AddConfig_Finish extends AddConfig_Base
'moduleid' => $moduleid
));
}
- Render::addDialog('Konfiguration zusammenstellen', false, 'sysconfig/cfg-finish', array(
+ Render::addDialog(Dictionary::translate('lang_configurationCompilation'), false, 'sysconfig/cfg-finish', array(
'configid' => $confid
));
}
diff --git a/modules/sysconfig/addmodule.inc.php b/modules/sysconfig/addmodule.inc.php
index 5af43c20..1191570d 100644
--- a/modules/sysconfig/addmodule.inc.php
+++ b/modules/sysconfig/addmodule.inc.php
@@ -40,7 +40,7 @@ abstract class AddModule_Base
} elseif (isset($status['statusCode'])) {
$error = $status['statusCode'];
} else {
- $error = 'Unbekannter Taskmanager-Fehler'; // TODO: No text
+ $error = Dictionary::translate('lang_unknwonTaskManager'); // TODO: No text
}
Message::addError('task-error', $error);
Util::redirect('?do=SysConfig');
@@ -115,7 +115,7 @@ class AddModule_Start extends AddModule_Base
$order[] = $module['sortOrder'];
}
array_multisort($order, SORT_ASC, $title, SORT_ASC, $mods);
- Render::addDialog('Modul hinzufügen', false, 'sysconfig/start', array('modules' => array_values($mods)));
+ Render::addDialog(Dictionary::translate('lang_moduleAdd'), false, 'sysconfig/start', array('modules' => array_values($mods)));
}
}
diff --git a/modules/sysconfig/addmodule_ad.inc.php b/modules/sysconfig/addmodule_ad.inc.php
index 60d8d88d..a85c5d06 100644
--- a/modules/sysconfig/addmodule_ad.inc.php
+++ b/modules/sysconfig/addmodule_ad.inc.php
@@ -4,10 +4,8 @@
* Wizard for setting up active directory integration for authentication.
*/
-Page_SysConfig::addModule('AD_AUTH', 'AdModule_Start', 'Active Directory Authentifizierung',
- 'Mit diesem Modul ist die Anmeldung an den Client PCs mit den Benutzerkonten eines Active Directory'
- . ' möglich. Je nach Konfiguration ist auch die Nutzung eines Benutzerverzeichnisses auf dem Client möglich.',
- 'Authentifizierung', true
+Page_SysConfig::addModule('AD_AUTH', 'AdModule_Start', Dictionary::translate('lang_adAuthentication'),
+ Dictionary::translate('lang_adModule'), Dictionary::translate('lang_authentication'), true
);
class AdModule_Start extends AddModule_Base
@@ -15,7 +13,9 @@ class AdModule_Start extends AddModule_Base
protected function renderInternal()
{
- Render::addDialog('Active Directory Authentifizierung', false, 'sysconfig/ad-start', array(
+ Session::set('ad_check', false);
+ Session::save();
+ Render::addDialog(Dictionary::translate('lang_adAuthentication'), false, 'sysconfig/ad-start', array(
'step' => 'AdModule_CheckConnection',
'server' => Request::post('server'),
'searchbase' => Request::post('searchbase'),
@@ -60,7 +60,7 @@ class AdModule_CheckConnection extends AddModule_Base
protected function renderInternal()
{
- Render::addDialog('Active Directory Authentifizierung', false, 'sysconfig/ad-checkconnection',
+ Render::addDialog(Dictionary::translate('lang_adAuthentication'), false, 'sysconfig/ad-checkconnection',
array_merge($this->taskIds, array(
'server' => Request::post('server'),
'searchbase' => Request::post('searchbase'),
@@ -101,7 +101,7 @@ class AdModule_Finish extends AddModule_Base
protected function renderInternal()
{
- Render::addDialog('Active Directory Authentifizierung', false, 'sysconfig/ad-finish',
+ Render::addDialog(Dictionary::translate('lang_adAuthentication'), false, 'sysconfig/ad-finish',
$this->taskIds
);
}
diff --git a/modules/sysconfig/addmodule_branding.inc.php b/modules/sysconfig/addmodule_branding.inc.php
index 6515a850..de176230 100644
--- a/modules/sysconfig/addmodule_branding.inc.php
+++ b/modules/sysconfig/addmodule_branding.inc.php
@@ -4,8 +4,7 @@
* Wizard for including a branding logo.
*/
-Page_SysConfig::addModule('BRANDING', 'Branding_Start', 'Logo der Einrichtung', 'Dieses Modul dient dem Hinzufügen eines Logos der Hochschule/Universität, welches'
- . ' dann z.B. auf dem Anmeldebildschirm angezeigt wird.', 'Branding', false
+Page_SysConfig::addModule('BRANDING', 'Branding_Start', Dictionary::translate('lang_institutionLogo'), Dictionary::translate('lang_institutionLogo'), 'Branding', false
);
class Branding_Start extends AddModule_Base
@@ -13,7 +12,7 @@ class Branding_Start extends AddModule_Base
protected function renderInternal()
{
- Render::addDialog('Einrichtungsspezifisches Logo', false, 'sysconfig/branding-start', array(
+ Render::addDialog(Dictionary::translate('lang_specificLogo'), false, 'sysconfig/branding-start', array(
'step' => 'Branding_ProcessFile',
));
}
@@ -76,7 +75,7 @@ class Branding_ProcessFile extends AddModule_Base
$png = base64_encode(file_get_contents($this->task['data']['pngFile']));
if (filesize($this->svgFile) < 1000000)
$svg = base64_encode(file_get_contents($this->svgFile));
- Render::addDialog('Einrichtungsspezifisches Logo', false, 'sysconfig/branding-check', array(
+ Render::addDialog(Dictionary::translate('lang_specificLogo'), false, 'sysconfig/branding-check', array(
'png' => $png,
'svg' => $svg,
'error' => $this->task['data']['error'],
diff --git a/modules/sysconfig/addmodule_custom.inc.php b/modules/sysconfig/addmodule_custom.inc.php
index 5673be2c..561049ca 100644
--- a/modules/sysconfig/addmodule_custom.inc.php
+++ b/modules/sysconfig/addmodule_custom.inc.php
@@ -6,12 +6,8 @@
* fancy is happening.
*/
-Page_SysConfig::addModule('custom', 'CustomModule_UploadForm', 'Erweitertes Modul',
- 'Mit einem Erweiterten Modul ist es möglich, beliebige Dateien zum Grundsystem hinzuzufügen.'
- . ' Nutzen Sie dieses Modul, um z.B. spezielle Konfigurationsdateien auf den Client PCs zu'
- . ' verwenden, die sich nicht mit einem der anderen Wizards erstellen lässt.'
- . ' Das Hinzufügen eines Erweiterten Moduls erfordert in der Regel zumindest grundlegende'
- . ' Systemkenntnisse im Linuxbereich.', 'Generisch', false, 100
+Page_SysConfig::addModule('custom', 'CustomModule_UploadForm', Dictionary::translate('lang_generic'),
+ Dictionary::translate('lang_addCustomModuleInfo'), Dictionary::translate('lang_generic'), false, 100
);
class CustomModule_UploadForm extends AddModule_Base
@@ -20,7 +16,7 @@ class CustomModule_UploadForm extends AddModule_Base
protected function renderInternal()
{
Session::set('mod_temp', false);
- Render::addDialog('Eigenes Modul hinzufügen', false, 'sysconfig/custom-upload', array(
+ Render::addDialog(Dictionary::translate('lang_addCustomModule'), false, 'sysconfig/custom-upload', array(
'step' => 'CustomModule_ProcessUpload'
));
}
@@ -92,7 +88,7 @@ class CustomModule_ProcessUpload extends AddModule_Base
$list[] = $file;
}
}
- Render::addDialog('Eigenes Modul hinzufügen', false, 'sysconfig/custom-fileselect', array(
+ Render::addDialog(Dictionary::translate('lang_addCustomModule'), false, 'sysconfig/custom-fileselect', array(
'step' => 'CustomModule_CompressModule',
'files' => $list,
));
diff --git a/modules/syslog.inc.php b/modules/syslog.inc.php
index acd6638d..8d591876 100644
--- a/modules/syslog.inc.php
+++ b/modules/syslog.inc.php
@@ -8,6 +8,7 @@ class Page_SysLog extends Page
User::load();
if (!User::isLoggedIn()) {
+ Message::addError('no-permission');
Util::redirect('?do=Main');
}
}
diff --git a/modules/systemstatus.inc.php b/modules/systemstatus.inc.php
index 8f3d8322..8bc68d66 100644
--- a/modules/systemstatus.inc.php
+++ b/modules/systemstatus.inc.php
@@ -148,7 +148,7 @@ class Page_SystemStatus extends Page
'uptime' => '???'
);
if (preg_match('/^(\d+)\D/', $uptime, $out)) {
- $data['uptime'] = floor($out[1] / 86400) . ' Tag(e), ' . floor(($out[1] % 86400) / 3600) . ' Stunde(n)'; // TODO: i18n
+ $data['uptime'] = floor($out[1] / 86400) . ' ' . Dictionary::translate('lang_days') . ', ' . floor(($out[1] % 86400) / 3600) . ' ' . Dictionary::translate('lang_hours'); // TODO: i18n
}
if (preg_match('/\bMemTotal:\s+(\d+)\s.*\bMemFree:\s+(\d+)\s.*\bBuffers:\s+(\d+)\s.*\bCached:\s+(\d+)\s.*\bSwapTotal:\s+(\d+)\s.*\bSwapFree:\s+(\d+)\s/s', $memInfo, $out)) {
$data['memTotal'] = Util::readableFileSize($out[1] * 1024);
diff --git a/modules/translation.inc.php b/modules/translation.inc.php
new file mode 100644
index 00000000..57a0f51f
--- /dev/null
+++ b/modules/translation.inc.php
@@ -0,0 +1,428 @@
+<?php
+
+class Page_Translation extends Page
+{
+
+ /**
+ * The pages where you can administrate the website translations
+ * @var string|boolean holds the target template
+ * @var string|boolean used to choose which page to load
+ * @var string|boolean used check if there should be an update
+ * @var string|boolean used check if there should be a deletion
+ * @var array|boolean holds the tags of the selected template
+ */
+ private $template = false;
+ private $page = false;
+ private $update = false;
+ private $delete = false;
+ private $tags = false;
+
+ protected function doPreprocess()
+ {
+ User::load();
+
+ if (!User::hasPermission('superadmin')) {
+ Message::addError('no-permission');
+ Util::redirect('?do=Main');
+ }
+
+ $this->template = Request::get('template');
+ $this->page = Request::get('page');
+ $this->delete = Request::get('delete');
+ $this->update = Request::post('update');
+ }
+
+ protected function doRender()
+ {
+ //calls the update function
+ if ($this->update)
+ $this->updateJson();
+ //calls the tag deletion function
+ if ($this->delete && $this->template)
+ $this->deleteTag($this->template, $this->delete);
+
+ //load the page accordingly to the link
+ switch ($this->page) {
+ case 'messages':
+ //renders the message edition page
+ Render::addTemplate('translation/messages', array(
+ 'msgs' => $this->initMsg(false),
+ 'msgsHC' => $this->initMsg(true)
+ ));
+ break;
+ case 'templates':
+ $this->template = Util::safePath($this->template);
+ if ($this->template === false) {
+ Message::addError('invalid-path');
+ Util::redirect('?do=Translation');
+ }
+ //renders the tag edition page
+ if ($this->templateAnalysis($this->template)) {
+ Render::addTemplate('translation/template', array(
+ 'template' => 'templates/' . $this->template,
+ 'tags' => $this->tags
+ ));
+ break;
+ }
+ default:
+ //renders the template selection page
+ Render::addTemplate('translation/_page', array(
+ 'table' => $this->initTable(),
+ ));
+ }
+ }
+
+ /**
+ * Load the main table with all the website's templates and it's informations
+ * @return array with the templates' information
+ */
+ private function initTable()
+ {
+ $table = array();
+
+ //loads every template
+ $files = $this->listTemplates();
+ //loads every json from each language
+ $de = $this->listJson('de/templates/');
+ $en = $this->listJson('en/templates/');
+ $pt = $this->listJson('pt/templates/');
+
+ //checks the JSON tags from every language
+ foreach ($files as $key => $value) {
+ // Don't list templates without lang tags
+ $tmp = $this->checkJson($de[$key], 'de');
+ if ($tmp === false) // TODO: Pretty solution
+ continue;
+ $table[] = array(
+ 'template' => $value,
+ 'link' => $key,
+ 'de' => $tmp,
+ 'en' => $this->checkJson($en[$key], 'en'),
+ 'pt' => $this->checkJson($pt[$key], 'pt')
+ );
+ }
+ sort($table);
+ return $table;
+ }
+
+ /**
+ * Finds and returns all the website's templates
+ * @return array
+ */
+ private function listTemplates()
+ {
+ $files = array();
+ $dir = 'templates/';
+ $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
+ foreach ($objects as $name => $object) {
+ if (substr($name, -5) === '.html') {
+ $key = substr($name, strlen($dir), -5);
+ $files[$key] = substr($name, strlen($dir));
+ }
+ }
+ return $files;
+ }
+
+ /**
+ * Finds and returns all the JSON files from a selected language
+ * @param string the selected language (abbreviated)
+ * @return array all the JSON files from the language
+ */
+ private function listJson($lang)
+ {
+ $json = array();
+ $dir = 'lang/' . $lang;
+ $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
+ foreach ($objects as $name => $object) {
+ if (substr($name, -5) === '.json') {
+ $key = str_replace($dir, '', $name);
+ $key = substr($key, 0, -5);
+ $json[$key] = $key;
+ }
+ }
+ return $json;
+ }
+
+ /**
+ * Finds and returns all PHP files of slxadmin
+ * @return array of all php files
+ */
+ private function listPhp()
+ {
+ $php = array();
+ $dir = '.';
+ $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
+ foreach ($objects as $name => $object) {
+ if (substr($name, -4) === '.php') {
+ $php[] = $name;
+ }
+ }
+ return $php;
+ }
+
+ /**
+ * Checks the JSON tags from a template
+ * @param string the template's path
+ * @param string the selected language
+ * @return string|boolean the information about the JSON tags, false if template has no lang-tags
+ */
+ private function checkJson($path, $lang)
+ {
+ //if there was not a valid template's path
+ if (!$path) {
+ return "JSON file is missing";
+ }
+ //loads a template and find all its tags
+ $htmlTemplate = @file_get_contents("templates/$path.html");
+ if (preg_match_all('/{{lang_(.*?)}}/s', $htmlTemplate, $matches) == 0)
+ return false;
+ $htmlCount = count(array_unique($matches[1]));
+
+ //initialize the count variables
+ $matchCount = 0;
+ $unusedCount = 0;
+
+ //loads the JSON tags and count the matches
+ $json = Dictionary::getArrayTemplate($path, $lang);
+ foreach ($json as $key => $value) {
+ if ($key != 'lang') {
+ if (!in_array(preg_replace('/^lang_/', '', $key), $matches[1])) {
+ $unusedCount++;
+ } else if ($value != '') {
+ $matchCount++;
+ }
+ }
+ }
+ $diff = $htmlCount - $matchCount;
+
+ //build the return string
+ $str = "";
+ if ($diff == 0 && $unusedCount == 0)
+ $str .= "OK";
+ if ($diff > 0)
+ $str .= $diff . " JSON tag(s) are missing";
+ if ($diff > 0 && $unusedCount > 0)
+ $str .= "<br>";
+ if ($unusedCount > 0)
+ $str .= $unusedCount . " JSON tag(s) are not being used";
+ return $str;
+ }
+
+ /**
+ * Builds the template page with the tags from its template and its JSON file
+ * @param string the template's path
+ * @param string the selected language
+ * @return string the information about the JSON tags
+ */
+ private function templateAnalysis($path)
+ {
+ $path = "templates/$path";
+ $templateFile = "$path.html";
+ //checks if the template is valid
+ if (!file_exists($templateFile)) {
+ Message::addError('invalid-template', $templateFile);
+ return false;
+ }
+
+ //finds every mustache tag within the html template
+ $htmlTemplate = file_get_contents($templateFile);
+ preg_match_all('/{{(lang_.*?)}}/s', $htmlTemplate, $matches);
+ $tags = array_flip($matches[1]);
+
+ //finds every JSON tag withing the JSON language files
+ $langArray = Dictionary::getLanguages();
+ $json = array();
+ foreach ($langArray as $lang) {
+ $jsonTags = Dictionary::getArray($path, $lang);
+ if (!is_array($jsonTags))
+ continue;
+ foreach (array_keys($jsonTags) as $key) {
+ if (substr($key, 5) === 'lang_')
+ $json[$key] = 123;
+ }
+ }
+ //remove unused tag
+ unset($json['lang']);
+ //merges the arrays to keep the unique tags
+ $test = array_merge($json, $tags);
+ //loads the content of every JSON tag from the specified language
+ foreach (array_keys($test) as $tag) {
+ $this->tags[] = array(
+ 'tag' => $tag,
+ 'de' => $this->getJsonTag($path, $tag, 'de/'),
+ 'en' => $this->getJsonTag($path, $tag, 'en/'),
+ 'pt' => $this->getJsonTag($path, $tag, 'pt/'),
+ 'class' => $this->getTagColor($path, $tag)
+ );
+ }
+ //print_r($this->tags);
+
+ return true;
+ }
+
+ /**
+ * Loads the content of a JSON tag
+ * @param string the JSON's path
+ * @param string the selected tag
+ * @param string the specified language
+ * @return string the tag's content
+ */
+ private function getJsonTag($path, $tag, $lang)
+ {
+ $json = Dictionary::getArray($path, $lang);
+ if (is_array($json) && isset($json[$tag])) {
+ return $json[$tag];
+ }
+ return '';
+ }
+
+ /**
+ * Change the color of the table line according to the tag status
+ * @param string the JSON's path
+ * @param string the selected tag
+ * @return string the css class of the line
+ */
+ private function getTagColor($path, $tag)
+ {
+ //return danger in case the tag is not found in the template
+ $htmlTemplate = file_get_contents($path . '.html');
+ if (strpos($htmlTemplate, '{{' . $tag . '}}') === false)
+ return 'danger';
+
+ //return warning in case at least one of the tag's values is empty
+ $langArray = Dictionary::getLanguages();
+ foreach ($langArray as $lang) {
+ if (($json = Dictionary::getArray($path, $lang))) {
+ if (!isset($json[$tag]) || $json[$tag] == '')
+ return 'warning';
+ }
+ }
+ //if it's ok don't change the class
+ return '';
+ }
+
+ /**
+ * Updates a JSON file with it's new tags or/and tags values
+ */
+ private function updateJson()
+ {
+ $langArray = Dictionary::getLanguages();
+ foreach ($langArray as $lang) {
+ $json[$lang] = array();
+ }
+
+ //find the tag requests to change the file
+ foreach ($_REQUEST as $key => $value) {
+ $str = explode('#', $key, 3);
+ if (count($str) !== 3)
+ continue;
+ $pre = $str[0];
+ $lang = $str[1];
+ $tag = $str[2];
+ if ($pre !== 'lang')
+ continue;
+ if (!isset($json[$lang])) {
+ Message::addWarning('i18n-invalid-lang', $lang);
+ continue;
+ }
+ if (empty($tag)) {
+ Message::addWarning('i18n-empty-tag');
+ continue;
+ }
+ if ($tag !== 'newtag') {
+ $json[$lang][$tag] = $value;
+ } else {
+ $json[$lang][$_REQUEST['newtag']] = $value;
+ }
+ }
+
+ // JSON_PRETTY_PRINT is only available starting with php 5.4.0.... Use upgradephp's json_encode
+ require_once('inc/up_json_encode.php');
+
+ //saves the new values on the file
+ foreach ($json as $key => $array) {
+ $path = Util::safePath('lang/' . $key . '/' . Request::post('path') . '.json');
+ if ($path === false) {
+ Message::addError('invalid-path');
+ Util::redirect('?do=Translation');
+ }
+ ksort($array); // Sort by key, so the diff on the output is cleaner
+ error_log("Converting " . print_r($array, true));
+ $json = up_json_encode($array, JSON_PRETTY_PRINT); // Also for better diffability of the json files, we pretty print
+ error_log("Result: $json");
+ //exits the function in case the action was unsuccessful
+ if (@file_put_contents($path, $json) === false) {
+ Message::addError('invalid-template');
+ return;
+ }
+ }
+ Message::addSuccess('updated-tags');
+ }
+
+ /**
+ * Load the main table with all the website's messages or hardcoded messages
+ * @var boolean choose between hardcoded and non-hardcoded messages
+ * @return array with the selected messages
+ */
+ private function initMsg($isHardcoded)
+ {
+ $msgs = array();
+ // Get all php files, so we can find all strings that need to be translated
+ $php = $this->listPhp();
+ $tags = array();
+ //chooses the path and regex
+ if ($isHardcoded) {
+ $path = 'messages-hardcoded';
+ $expr = '/Dictionary\s*::\s*translate\s*\(\s*[\'"](.*?)[\'"]\s*[\)\,]/i';
+ } else {
+ $path = 'messages';
+ $expr = '/Message\s*::\s*add\w+\s*\(\s*[\'"](.*?)[\'"]\s*[\)\,]/i';
+ }
+ // Now find all tags in all php files. Only works for literal usage, not something like $foo = 'bar'; Dictionary::translate($foo);
+ foreach ($php as $file) {
+ $content = @file_get_contents($file);
+ if ($content === false || preg_match_all($expr, $content, $out) < 1)
+ continue;
+ foreach ($out[1] as $id) {
+ if (!isset($tags[$id]))
+ $tags[$id] = 0; // TODO: Display usage count next to it, even better would be list of php files it appears in, so a translator can get context
+ $tags[$id]++;
+ }
+ }
+ ksort($tags);
+ foreach ($tags as $tag => $usageCount) {
+ $msgs[] = array(
+ 'tag' => $tag,
+ 'de' => $this->getJsonTag($path, $tag, 'de/'), // TODO: Hardcoded language list, use Dictionary::getLanguages()
+ 'en' => $this->getJsonTag($path, $tag, 'en/'),
+ 'pt' => $this->getJsonTag($path, $tag, 'pt/')
+ );
+ }
+ return $msgs;
+ }
+
+ /**
+ * Delete a specific JSON tag from a JSON files
+ * @var string the JSON's file path
+ * @var the JSON tag to be deleted
+ * @return boolean if the action was not successful
+ */
+ private function deleteTag($path, $tag)
+ {
+ //delete the tag from every language file
+ $langArray = Dictionary::getLanguages();
+ foreach ($langArray as $lang) {
+ $json = Dictionary::getArrayTemplate($path, $lang);
+ unset($json[$tag]);
+ unset($json['lang']);
+ $result = file_put_contents('lang/' . $lang . '/' . $path . '.json', json_encode($json));
+ //add warning and exit in case the action was unsuccessful
+ if ($result === false) {
+ Message::addWarning('unsuccessful-action');
+ return false;
+ }
+ }
+ Message::addSuccess('deleted-tag');
+ }
+
+}
diff --git a/templates/dialog-generic.html b/templates/dialog-generic.html
index 929400a5..e2325ee9 100644
--- a/templates/dialog-generic.html
+++ b/templates/dialog-generic.html
@@ -8,8 +8,8 @@
{{{body}}}
</div>
<div class="modal-footer">
- {{#next}}<a class="btn btn-primary" href="{{next}}">Weiter &raquo;</a>{{/next}}
+ {{#next}}<a class="btn btn-primary" href="{{next}}">{{lang_next}} &raquo;</a>{{/next}}
</div>
</div>
</div>
-</div> \ No newline at end of file
+</div>
diff --git a/templates/main-menu-login.html b/templates/main-menu-login.html
new file mode 100644
index 00000000..81aef288
--- /dev/null
+++ b/templates/main-menu-login.html
@@ -0,0 +1,47 @@
+<!-- Fixed navbar -->
+<div class="navbar navbar-default navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="?do=Main">OpenSLX Admin</a>
+ </div>
+ <div class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li><a href="?do=SysLog">{{lang_clientLog}}</a></li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{lang_settings}}<b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li class="dropdown-header">{{lang_client}}</li>
+ <li><a href="?do=SysConfig">{{lang_localization}}</a></li>
+ <li><a href="?do=MiniLinux">bwLehrpool Mini-Linux</a></li>
+ <li><a href="?do=BaseConfig">{{lang_configurationVariables}}</a></li>
+ <li><a href="?do=Translation">{{lang_administration}}</a></li>
+ <li class="divider"></li>
+ <li class="dropdown-header">{{lang_server}}</li>
+ <li><a href="?do=ServerSetup">{{lang_configurationBasic}}</a></li>
+ <li><a href="?do=VmStore">{{lang_vmLocation}}</a></li>
+ </ul>
+ </li>
+ <li><a href="?do=News">{{lang_news}}</a></li>
+ <li><a href="?do=SystemStatus">Status</a></li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown"><img src="lang/{{lang}}/flag.png"><b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li class="dropdown-header">{{lang_language}}</li>
+ <li><a href="?lang=de&amp;url={{url}}"><img src="lang/de/flag.png"> Deutsch</a></li>
+ <li><a href="?lang=en&amp;url={{url}}"><img src="lang/en/flag.png"> English</a></li>
+ <li><a href="?lang=pt&amp;url={{url}}"><img src="lang/pt/flag.png"> Português</a></li>
+ </ul>
+ </li>
+ </ul>
+ <ul class="nav navbar-nav navbar-right">
+ <li><a href="?do=Session&amp;action=login">{{lang_login}}</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+
diff --git a/templates/main-menu-logout.html b/templates/main-menu-logout.html
new file mode 100644
index 00000000..d5671fef
--- /dev/null
+++ b/templates/main-menu-logout.html
@@ -0,0 +1,47 @@
+<!-- Fixed navbar -->
+<div class="navbar navbar-default navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="?do=Main">OpenSLX Admin</a>
+ </div>
+ <div class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li><a href="?do=SysLog">{{lang_clientLog}}</a></li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{lang_settings}}<b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li class="dropdown-header">{{lang_client}}</li>
+ <li><a href="?do=SysConfig">{{lang_localization}}</a></li>
+ <li><a href="?do=MiniLinux">bwLehrpool Mini-Linux</a></li>
+ <li><a href="?do=BaseConfig">{{lang_configurationVariables}}</a></li>
+ <li><a href="?do=Translation">{{lang_administration}}</a></li>
+ <li class="divider"></li>
+ <li class="dropdown-header">{{lang_server}}</li>
+ <li><a href="?do=ServerSetup">{{lang_configurationBasic}}</a></li>
+ <li><a href="?do=VmStore">{{lang_vmLocation}}</a></li>
+ </ul>
+ </li>
+ <li><a href="?do=News">{{lang_news}}</a></li>
+ <li><a href="?do=SystemStatus">Status</a></li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown"><img src="lang/{{lang}}/flag.png"><b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li class="dropdown-header">{{lang_language}}</li>
+ <li><a href="?lang=de&amp;url={{url}}"><img src="lang/de/flag.png"> Deutsch</a></li>
+ <li><a href="?lang=en&amp;url={{url}}"><img src="lang/en/flag.png"> English</a></li>
+ <li><a href="?lang=pt&amp;url={{url}}"><img src="lang/pt/flag.png"> Português</a></li>
+ </ul>
+ </li>
+ </ul>
+ <ul class="nav navbar-nav navbar-right">
+ <li><a href="?do=Session&amp;action=logout&amp;token={{{token}}}"><b>{{user}}</b> ({{lang_logout}})</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+
diff --git a/templates/main-menu.html b/templates/main-menu.html
deleted file mode 100644
index 34b18579..00000000
--- a/templates/main-menu.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!-- Fixed navbar -->
-<div class="navbar navbar-default navbar-fixed-top">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="?do=Main">OpenSLX Admin</a>
- </div>
- <div class="navbar-collapse collapse">
- <ul class="nav navbar-nav">
- <li><a href="?do=SysLog">Client Logs</a></li>
- <li class="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown">Einstellungen<b class="caret"></b></a>
- <ul class="dropdown-menu">
- <li class="dropdown-header">Client</li>
- <li><a href="?do=SysConfig">Lokalisierung</a></li>
- <li><a href="?do=MiniLinux">bwLehrpool Mini-Linux</a></li>
- <li><a href="?do=BaseConfig">KonfigurationsVariablen</a></li>
- <li class="divider"></li>
- <li class="dropdown-header">Server</li>
- <li><a href="?do=ServerSetup">Grundkonfiguration</a></li>
- <li><a href="?do=VmStore">VM Speicherort</a></li>
- </ul>
- </li>
- <li><a href="?do=News">News</a></li>
- <li><a href="?do=SystemStatus">Status</a></li>
- </ul>
- <ul class="nav navbar-nav navbar-right">
- {{{loginPanel}}}
- </ul>
- </div>
- </div>
-</div>
-
diff --git a/templates/menu-login.html b/templates/menu-login.html
deleted file mode 100644
index 89b22adf..00000000
--- a/templates/menu-login.html
+++ /dev/null
@@ -1 +0,0 @@
-<li><a href="?do=Session&amp;action=login">Anmelden</a></li>
diff --git a/templates/menu-logout.html b/templates/menu-logout.html
deleted file mode 100644
index 17e53985..00000000
--- a/templates/menu-logout.html
+++ /dev/null
@@ -1 +0,0 @@
-<li><a href="?do=Session&amp;action=logout&amp;token={{{token}}}"><b>{{user}}</b> (abmelden)</a></li>
diff --git a/templates/minilinux/filelist.html b/templates/minilinux/filelist.html
index 6c9871b8..a46b6a99 100644
--- a/templates/minilinux/filelist.html
+++ b/templates/minilinux/filelist.html
@@ -6,13 +6,12 @@
<div class="panel-body" id="download-{{id}}">
{{#systemChanged}}
<p>
- Mindestens eine Komponente von <b>{{title}}</b> kann aktualisiert werden. Für einen reibungslosen Betrieb
- wird empfohlen, alle Komponenten auf dem aktuellen Stand zu halten.
+ {{lang_canUpdate1}} <b>{{title}}</b> {{lang_canUpdate2}}
</p>
- <p><span class="btn btn-primary" onclick="slxUpdateAll(this, 'download-{{id}}')">Aktualisieren</span></p>
+ <p><span class="btn btn-primary" onclick="slxUpdateAll(this, 'download-{{id}}')">{{lang_update}}</span></p>
{{/systemChanged}}
{{^systemChanged}}
- <p>Das System ist auf dem aktuellen Stand.</p>
+ <p>{{lang_systemUpdated}}</p>
{{/systemChanged}}
<ul class="list-group">
{{#files}}
@@ -20,11 +19,11 @@
<div class="row">
<div class="col-sm-2">{{name}}</div>
<div class="col-xs-2">
- {{^fileChanged}}<span class="glyphicon glyphicon-ok"></span> <b>Aktuell</b>{{/fileChanged}}
- {{#fileChanged}}<span class="glyphicon glyphicon-exclamation-sign"></span> <b>Veraltet</b>{{/fileChanged}}
+ {{^fileChanged}}<span class="glyphicon glyphicon-ok"></span> <b>{{lang_actual}}</b>{{/fileChanged}}
+ {{#fileChanged}}<span class="glyphicon glyphicon-exclamation-sign"></span> <b>{{lang_outdated}}</b>{{/fileChanged}}
</div>
<div class="col-xs-2">
- {{#fileChanged}}<span class="btn btn-primary btn-xs update-button" onclick="slxUpdate('{{uid}}', '{{id}}', '{{name}}')">Aktualisieren</span>{{/fileChanged}}
+ {{#fileChanged}}<span class="btn btn-primary btn-xs update-button" onclick="slxUpdate('{{uid}}', '{{id}}', '{{name}}')">{{lang_update}}</span>{{/fileChanged}}
</div>
</div>
{{{download}}}
@@ -35,7 +34,7 @@
</div>
{{/systems}}
{{^systems}}
- <div class="row well well-sm">Keine Konfigurationspakete gefunden!</div>
+ <div class="row well well-sm">{{lang_configurationPackageNotFound}}</div>
{{/systems}}
<script type="text/javascript">
diff --git a/templates/page-adduser.html b/templates/page-adduser.html
index cd317457..015dac06 100644
--- a/templates/page-adduser.html
+++ b/templates/page-adduser.html
@@ -1,28 +1,28 @@
<div class="container">
<form class="form-adduser" action="?do=AddUser" method="post">
- <h2 class="form-signin-heading">Benutzer anlegen</h2>
+ <h2 class="form-signin-heading">{{lang_createUser}}</h2>
<div class="row">
- <div class="col-md-4">Benutzerkennung</div>
- <div class="col-md-4"><input type="text" name="user" value="{{user}}" class="form-control" placeholder="Benutzerkennung" autofocus></div>
+ <div class="col-md-4">{{lang_username}}</div>
+ <div class="col-md-4"><input type="text" name="user" value="{{user}}" class="form-control" placeholder="{{lang_username}}" autofocus></div>
</div>
<div class="row">
- <div class="col-md-4">Passwort</div>
- <div class="col-md-4"><input type="password" name="pass1" class="form-control" placeholder="Passwort"></div>
- <div class="col-md-4"><input type="password" name="pass2" class="form-control" placeholder="Wiederholen"></div>
+ <div class="col-md-4">{{lang_password}}</div>
+ <div class="col-md-4"><input type="password" name="pass1" class="form-control" placeholder="{{lang_password}}"></div>
+ <div class="col-md-4"><input type="password" name="pass2" class="form-control" placeholder="{{lang_confirmation}}"></div>
</div>
<div class="row">
- <div class="col-md-4">Vollständiger Name</div>
- <div class="col-md-4"><input type="text" name="fullname" value="{{fullname}}" class="form-control" placeholder="Max Mustermann"></div>
+ <div class="col-md-4">{{lang_fullName}}</div>
+ <div class="col-md-4"><input type="text" name="fullname" value="{{fullname}}" class="form-control" placeholder="{{lang_fullName}}"></div>
</div>
<div class="row">
- <div class="col-md-4">Telefon</div>
- <div class="col-md-4"><input type="text" name="phone" value="{{phone}}" class="form-control" placeholder="Durchwahl"></div>
+ <div class="col-md-4">{{lang_telephone}}</div>
+ <div class="col-md-4"><input type="text" name="phone" value="{{phone}}" class="form-control" placeholder="{{lang_telephone}}"></div>
</div>
<div class="row">
<div class="col-md-4">E-Mail</div>
- <div class="col-md-4"><input type="text" name="email" value="{{email}}" class="form-control" placeholder="spam@aol.com"></div>
+ <div class="col-md-4"><input type="text" name="email" value="{{email}}" class="form-control" placeholder="E-Mail"></div>
</div>
- <button class="btn btn-lg btn-primary btn-block" type="submit">Benutzer anlegen</button>
+ <button class="btn btn-lg btn-primary btn-block" type="submit">{{lang_createUser}}</button>
<input type="hidden" name="action" value="adduser">
</form>
</div>
diff --git a/templates/page-baseconfig.html b/templates/page-baseconfig.html
index e8511fb2..ad51fd2f 100644
--- a/templates/page-baseconfig.html
+++ b/templates/page-baseconfig.html
@@ -1,5 +1,5 @@
<div class="container">
- <h1>Basiskonfiguration</h1>
+ <h1>{{lang_basicConfiguration}}</h1>
<form action="?do=BaseConfig" method="post">
{{#categories}}
<div class="panel panel-default">
@@ -21,7 +21,7 @@
{{/big}}
</div>
<div class="col-md-2">
- <a class="btn btn-default" data-toggle="modal" data-target="#help-{{setting}}">Hilfe</a>
+ <a class="btn btn-default" data-toggle="modal" data-target="#help-{{setting}}">{{lang_help}}</a>
</div>
</div>
</div>
@@ -30,7 +30,7 @@
<div class="modal-content">
<div class="modal-header">{{setting}}</div>
<div class="modal-body">{{{description}}}</div>
- <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">Schließen</a></div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
</div>
</div>
</div>
@@ -39,8 +39,8 @@
</div>
{{/categories}}
<input type="hidden" name="token" value="{{token}}">
- <button class="btn btn-lg btn-primary" type="submit">Speichern</button>
- <button class="btn btn-lg btn-primary" type="reset">Zurücksetzen</button>
+ <button class="btn btn-lg btn-primary" type="submit">{{lang_save}}</button>
+ <button class="btn btn-lg btn-primary" type="reset">{{lang_reset}}</button>
<a class="btn btn-lg btn-primary" href="api.php?do=getconfig">Download</a>
</form>
</div>
diff --git a/templates/page-login.html b/templates/page-login.html
index 9696e31d..7b9f5df7 100644
--- a/templates/page-login.html
+++ b/templates/page-login.html
@@ -1,13 +1,13 @@
<div class="container">
<form class="form-signin" action="?do=Session" method="post">
- <h2 class="form-signin-heading">Anmeldung</h2>
- <input type="text" name="user" class="form-control" placeholder="Benutzerkennung" autofocus>
- <input type="password" name="pass" class="form-control" placeholder="Passwort">
+ <h2 class="form-signin-heading">{{lang_enter}}</h2>
+ <input type="text" name="user" class="form-control" placeholder="{{lang_username}}" autofocus>
+ <input type="password" name="pass" class="form-control" placeholder="{{lang_password}}">
<label class="checkbox">
- <input type="checkbox" name="remember" value="remember-me"> Angemeldet bleiben
+ <input type="checkbox" name="remember" value="remember-me"> {{lang_rememberID}}
</label>
- <button class="btn btn-lg btn-primary btn-block" type="submit">Anmelden</button>
- <a class="btn btn-lg btn-primary btn-block" href="?do=AddUser">Registrieren</a>
+ <button class="btn btn-lg btn-primary btn-block" type="submit">{{lang_login}}</button>
+ <a class="btn btn-lg btn-primary btn-block" href="?do=AddUser">{{lang_register}}</a>
<input type="hidden" name="action" value="login">
</form>
</div>
diff --git a/templates/page-main-guest.html b/templates/page-main-guest.html
index 8867ccf8..09fc59b3 100644
--- a/templates/page-main-guest.html
+++ b/templates/page-main-guest.html
@@ -1,5 +1,5 @@
<div class="jumbotron">
- <h1>Willkommen</h1>
- <p>Dies ist das Administrations-Interface der lokalen bwLehrpool-Installation. Bitte authentifizieren Sie sich, um Einstellungen vorzunehmen.</p>
- <p><a href="?do=Session&amp;action=login" class="btn btn-primary btn-lg">Anmelden &raquo;</a></p>
+ <h1>{{lang_welcome}}</h1>
+ <p>{{lang_introGuest}}</p>
+ <p><a href="?do=Session&amp;action=login" class="btn btn-primary btn-lg">{{lang_login}} &raquo;</a></p>
</div>
diff --git a/templates/page-main.html b/templates/page-main.html
index 519d3abd..40ea8176 100644
--- a/templates/page-main.html
+++ b/templates/page-main.html
@@ -1,30 +1,30 @@
<div class="jumbotron">
- <h1>Willkommen, {{user}}</h1>
- <p>Dies ist die bwLehrpool Konfigurationsoberfläche.</p>
+ <h1>{{lang_welcome}}, {{user}}</h1>
+ <p>{{lang_intro}}</p>
</div>
<ul class="list-group">
{{#vmstore}}
<li class="list-group-item list-group-item-info">
- Es ist noch kein Speicherort für die Virtuellen Maschinen festgelegt.
- <a class="btn btn-sm btn-primary" href="?do=VmStore">Konfigurieren &raquo;</a>
+ {{lang_vmLocationNotSet}}
+ <a class="btn btn-sm btn-primary" href="?do=VmStore">{{lang_configure}} &raquo;</a>
</li>
{{/vmstore}}
{{#ipxe}}
<li class="list-group-item list-group-item-info">
- Das Bootmenü ist veraltet oder wurde noch nicht generiert.
- <a class="btn btn-sm btn-primary" href="?do=ServerSetup">Konfigurieren &raquo;</a>
+ {{lang_bootMenuWarning}}
+ <a class="btn btn-sm btn-primary" href="?do=ServerSetup">{{lang_configure}} &raquo;</a>
</li>
{{/ipxe}}
{{#minilinux}}
<li class="list-group-item list-group-item-info">
- Wichtige Dateien der MiniLinux-Installation fehlen.
+ {{lang_minilinuxMissing}}
<a class="btn btn-sm btn-primary" href="?do=MiniLinux">MiniLinux &raquo;</a>
</li>
{{/minilinux}}
{{#sysconfig}}
<li class="list-group-item list-group-item-info">
- Es wurde noch keine Systemkonfiguration ausgewählt.
- <a class="btn btn-sm btn-primary" href="?do=SysConfig">Systemkonfiguration &raquo;</a>
+ {{lang_systemConfigurationNotChosen}}
+ <a class="btn btn-sm btn-primary" href="?do=SysConfig">{{lang_systemConfiguration}} &raquo;</a>
</li>
{{/sysconfig}}
-</ul> \ No newline at end of file
+</ul>
diff --git a/templates/page-minilinux.html b/templates/page-minilinux.html
index c1a4ebd6..1cb9d9dd 100644
--- a/templates/page-minilinux.html
+++ b/templates/page-minilinux.html
@@ -1,15 +1,15 @@
<div class="container" id="systemlist">
- <div class="panel panel-default">Liste wird abgerufen...</div>
+ <div class="panel panel-default">{{lang_listObtained}}</div>
<script type="text/javascript">
var slx_check = setInterval(function() {
if (typeof $ === 'undefined') return;
clearInterval(slx_check);
$('#systemlist').load('{{{listurl}}}', function( response, status, xhr ) {
if ( status === "error" ) {
- var msg = "Fehler beim Abruf: ";
+ var msg = "{{lang_errorGetting}}";
$( "#systemlist" ).html( msg + xhr.status + " " + xhr.statusText );
}
})
}, 100);
</script>
-</div> \ No newline at end of file
+</div>
diff --git a/templates/page-news.html b/templates/page-news.html
index c9a2ccb3..78d1d85a 100644
--- a/templates/page-news.html
+++ b/templates/page-news.html
@@ -1,22 +1,21 @@
<div class="container">
- <p>Hier haben Sie die Möglichkeit, die von bwLehrpool-Clients angezeigten News zu editieren.</p>
+ <p>{{lang_newsIntro}}</p>
<div class="panel panel-default">
<div class="panel-heading">
- Aktive News
+ {{lang_activeNews}}
</div>
<div class="panel-body">
<form action="?do=News&amp;action=save" method="post">
<div class="form-group">
- <label for="news-title-id">Titel</label>
- <input type="text" name="news-title" id ="news-title-id" class="form-control" placeholder="Willkommen!" value="{{latestTitle}}">
+ <label for="news-title-id">{{lang_title}}</label>
+ <input type="text" name="news-title" id ="news-title-id" class="form-control" placeholder="{{welcome}}" value="{{latestTitle}}">
</div>
<div class="form-group">
- <label for="news-content-id">Inhalt</label>
- <textarea name="news-content" id ="news-content-id" class="form-control" rows="5" cols="30" placeholder="Willkommen beim bwLehrpool-System!">{{latestContent}}</textarea>
+ <label for="news-content-id">{{lang_content}}</label>
+ <textarea name="news-content" id ="news-content-id" class="form-control" rows="5" cols="30" placeholder="">{{latestContent}}</textarea>
</div>
- <p>Letzte Aktualisierung: {{latestDate}}</p>
- <button class="btn btn-primary btn-sm" type="submit"><span class="glyphicon glyphicon-save"></span> Speichern</button>
- <a class="btn btn-primary btn-sm" href="?do=news&amp;action=clear"><span class="glyphicon glyphicon-trash"></span> Leeren</a>
+ <p>{{lang_latestUpdate}}: {{latestDate}}</p>
+ <button class="btn btn-primary btn-sm" type="submit">{{lang_save}}</button>
<input type="hidden" name="token" value="{{token}}">
</form>
</div>
@@ -24,7 +23,7 @@
<div class="panel panel-default">
<div class="panel-heading">
- Alte News
+ {{lang_newsOld}}
</div>
<div class="panel-body">
<div class="table-responsive">
@@ -33,9 +32,9 @@
<table class="table table-stripped table-condensed">
<thead>
<tr>
- <th>Datum</th>
- <th>Titel</th>
- <th>Inhalt</th>
+ <th>{{lang_date}}</th>
+ <th>{{lang_title}}</th>
+ <th>{{lang_content}}</th>
<th></th>
</tr>
</thead>
@@ -46,8 +45,8 @@
<td class="slx-ellipsis">{{title}}</td>
<td class="slx-ellipsis">{{content}}</td>
<td>
- <a class="btn btn-primary btn-xs" href="?do=news&amp;newsid={{newsid}}&amp;action=show"><span class="glyphicon glyphicon-share-alt"></span> Verwenden</a>
- <button class="btn btn-danger btn-xs" type="submit" name="newsid" value="{{newsid}}"><span class="glyphicon glyphicon-remove"></span> Löschen</button>
+ <a class="btn btn-primary btn-xs" href="?do=news&amp;newsid={{newsid}}&amp;action=show"><span class="glyphicon glyphicon-share-alt"></span> {{lang_show}}</a>
+ <button class="btn btn-danger btn-xs" type="submit" name="newsid" value="{{newsid}}"><span class="glyphicon glyphicon-remove"></span> {{lang_delete}}</button>
</td>
</tr>
{{/list}}
diff --git a/templates/page-remote-tgz-list.html b/templates/page-remote-tgz-list.html
index 8ea80673..1cf2ee84 100644
--- a/templates/page-remote-tgz-list.html
+++ b/templates/page-remote-tgz-list.html
@@ -1,7 +1,7 @@
<ol class="breadcrumb">
- <li><a href="?do=Main">Start</a></li>
- <li><a href="?do=SysConfig">SystemKonfiguration</a></li>
- <li class="active">Zentral verfügbare Konfigurationen</li>
+ <li><a href="?do=Main">Home</a></li>
+ <li><a href="?do=SysConfig">{{lang_systemConfiguration}}</a></li>
+ <li class="active">{{lang_centralConfiguration}}</li>
</ol>
<div class="container">
{{#files}}
@@ -11,6 +11,6 @@
</div>
{{/files}}
{{^files}}
- <div class="row well well-sm">Keine Konfigurationspakete gefunden!</div>
+ <div class="row well well-sm">{{lang_configurationPackageNotFound}}</div>
{{/files}}
</div>
diff --git a/templates/page-syslog.html b/templates/page-syslog.html
index 90f301a4..b7064619 100644
--- a/templates/page-syslog.html
+++ b/templates/page-syslog.html
@@ -1,44 +1,42 @@
<div class="container">
- <h1>Client Log</h1>
+ <h1>{{lang_clientLog}}</h1>
<form method="post" action="?do=SysLog">
<input type="hidden" name="token" value="{{token}}">
<div class="input-group">
- <span class="input-group-addon">Filter</span>
- <input id="filterstring" type="text" placeholder="event-id" value="{{filter}}" name="filter" data-role="tagsinput" />
+ <span class="input-group-addon">{{lang_filter}}</span>
+ <input id="filterstring" type="text" placeholder="id" value="{{filter}}" name="filter" data-role="tagsinput" />
<span class="input-group-addon">
- <input type="checkbox" name="not" {{#not}}checked="checked"{{/not}}> not
+ <input type="checkbox" name="not" {{#not}}checked="checked"{{/not}}> {{lang_not}}
</span>
<span class="input-group-btn">
- <button class="btn btn-default" type="submit">Los</button>
+ <button class="btn btn-default" type="submit">{{lang_go}}</button>
</span>
</div>
</form>
{{{pagenav}}}
- <div class="table-responsive">
- <table class="table table-striped table-condensed">
- <thead>
- <th></th>
- <th>Wann</th>
- <th>Client</th>
- <th>Ereignis</th>
- <th>Details</th>
- </thead>
- <tbody>
- {{#list}}
- <tr>
- <td><span class="glyphicon glyphicon-off" title="{{logtypeid}}" onclick="$('#filterstring').tagsinput('add', '{{logtypeid}}')"></span></td>
- <td class="text-right" nowrap="nowrap">{{date}}</td>
- <td>{{clientip}}</td>
- <td>{{description}}</td>
- <td>{{#extra}}<a class="btn btn-default btn-xs pull-left" data-toggle="collapse" data-target="#extra{{logid}}">&raquo;</a>{{/extra}}</td>
- </tr>
- <tr class="collapse" id="extra{{logid}}">
- <td colspan="5"><pre>{{extra}}</pre></td>
- </tr>
- {{/list}}
- </tbody>
- </table>
- </div>
+ <table class="table table-striped table-condensed">
+ <thead>
+ <th></th>
+ <th>{{lang_when}}</th>
+ <th>{{lang_client}}</th>
+ <th>{{lang_event}}</th>
+ <th>{{lang_details}}</th>
+ </thead>
+ <tbody>
+ {{#list}}
+ <tr>
+ <td><span class="glyphicon glyphicon-off" title="{{logtypeid}}" onclick="$('#filterstring').tagsinput('add', '{{logtypeid}}')"></span></td>
+ <td class="text-right" nowrap="nowrap">{{date}}</td>
+ <td>{{clientip}}</td>
+ <td>{{description}}</td>
+ <td>{{#extra}}<a class="btn btn-default btn-xs pull-left" data-toggle="collapse" data-target="#extra{{logid}}">&raquo;</a>{{/extra}}</td>
+ </tr>
+ <tr class="collapse" id="extra{{logid}}">
+ <td colspan="5"><pre>{{extra}}</pre></td>
+ </tr>
+ {{/list}}
+ </tbody>
+ </table>
{{{pagenav}}}
</div>
diff --git a/templates/page-vmstore.html b/templates/page-vmstore.html
index 1dde2734..3772c2b6 100644
--- a/templates/page-vmstore.html
+++ b/templates/page-vmstore.html
@@ -4,16 +4,16 @@
<input type="hidden" name="action" value="setstore">
<div class="panel panel-default">
<div class="panel-heading">
- VM Speicherort <a class="btn btn-default" data-toggle="modal" data-target="#help-store"><span class="glyphicon glyphicon-question-sign"></span></a>
+ {{lang_vmLocation}} <a class="btn btn-default" data-toggle="modal" data-target="#help-store"><span class="glyphicon glyphicon-question-sign"></span></a>
</div>
<div class="panel-body slx-md-width">
- <p>Bitte wählen Sie, wo die Images der Virtuellen Maschinen gespeichert werden sollen.</p>
+ <p>{{lang_vmLocationChoose}}</p>
<div class="panel panel-default">
<div class="panel-heading">
- <input type="radio" name="storetype" value="internal" {{pre-internal}}> Intern
+ <input type="radio" name="storetype" value="internal" {{pre-internal}}> {{lang_intern}}
</div>
<div class="panel-body">
- Keine Weitere Konfiguration notwendig
+ {{lang_noAdditionalInformation}}
</div>
</div>
<div class="panel panel-default">
@@ -33,32 +33,32 @@
<label for="cifsaddr">UNC-Pfad</label>
<input type="text" class="form-control" name="cifsaddr" value="{{cifsaddr}}" placeholder="\\samba.server.example.com\bwlp" id="cifsaddr">
<br>
- <label for="cifsuser">Lese/Schreib-Zugangsdaten</label>
+ <label for="cifsuser">{{lang_readWrite}}</label>
<div class="input-group">
<span class="input-group-addon slx-ga">
- Benutzername
+ {{lang_username}}
</span>
- <input type="text" class="form-control" name="cifsuser" value="{{cifsuser}}" placeholder="Benutzername" id="cifsuser">
+ <input type="text" class="form-control" name="cifsuser" value="{{cifsuser}}" placeholder="{{lang_username}}" id="cifsuser">
<span class="input-group-addon">
- Passwort
+ {{lang_password}}
</span>
- <input type="text" class="form-control" name="cifspasswd" value="{{cifspasswd}}" placeholder="Passwort">
+ <input type="text" class="form-control" name="cifspasswd" value="{{cifspasswd}}" placeholder="{{lang_password}}">
</div>
<br>
- <label for="cifsuserro">Nur-Lese-Zugangsdaten</label>
+ <label for="cifsuserro">{{lang_readOnly}}</label>
<div class="input-group">
<span class="input-group-addon slx-ga">
- Benutzername
+ {{lang_username}}
</span>
- <input type="text" class="form-control" name="cifsuserro" value="{{cifsuserro}}" placeholder="Benutzername" id="cifsuserro">
+ <input type="text" class="form-control" name="cifsuserro" value="{{cifsuserro}}" placeholder="{{lang_username}}" id="cifsuserro">
<span class="input-group-addon">
- Passwort
+ {{lang_password}}
</span>
- <input type="text" class="form-control" name="cifspasswdro" value="{{cifspasswdro}}" placeholder="Passwort">
+ <input type="text" class="form-control" name="cifspasswdro" value="{{cifspasswdro}}" placeholder="{{lang_password}}">
</div>
</div>
</div>
- <button class="btn btn-primary" type="submit">Speichern</button>
+ <button class="btn btn-primary" type="submit">{{lang_save}}</button>
</div>
</div>
</form>
@@ -67,27 +67,19 @@
<div class="modal fade" id="help-store" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
- <div class="modal-header">VM Speicherort</div>
+ <div class="modal-header">{{lang_vmLocation}}</div>
<div class="modal-body">
<p>
- Für Testzwecke können die VMs direkt auf dem Satellitenserver gespeichert werden. Sofern Sie
- jedoch die ausgelieferte Satelliten-vmdk betreiben bedenken Sie bitte, dass Sie dann nur ca. 100GB
- Speicher zur Verfügung haben.
+ {{lang_vmLocationHelp1}}
</p>
<p>
- Im Produktivbetrieb bietet es sich an, hierfür einen performanten Netzwerkspeicher zu benutzen.
- Dieser Netzwerkspeicher kann per NFS oder CIFS/SMB eingebunden werden. In jedem Fall muss sichergestellt
- werden, dass der Satellitenserver zum Hinzufügen neuer Virtueller Maschinen Schreibzugriff auf
- diesen Netzwerkspeicher hat. Bei der Nutzung von NFSv3 kann dies IP-Basiert eingerichtet werden,
- für die Nutzung von CIFS/SMB können Sie Zugangsdaten angaben, die zum Schreiben berechtigen.
+ {{lang_vmLocationHelp2}}
</p>
<p>
- Die bwLehrpool-Clients brauchen lediglich Lesezugriff auf den Netzwerkspeicher (und sollten aus
- Sicherheitsgründen auch wirklich nur lesen können). Bei CIFS/SMB erreichen Sie dies am einfachsten,
- indem Sie passwortlosen Gastzugriff mit Leserechten auf die Freigabe erlauben.
+ {{lang_vmLocationHelp3}}
</p>
</div>
- <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">Schließen</a></div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
</div>
</div>
</div>
diff --git a/templates/serversetup/ipaddress.html b/templates/serversetup/ipaddress.html
index 013c6785..acfbb408 100644
--- a/templates/serversetup/ipaddress.html
+++ b/templates/serversetup/ipaddress.html
@@ -1,12 +1,11 @@
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
- Boot-Adresse des Servers
+ {{lang_bootAddress}}
</div>
<div class="panel-body">
<p>
- Bitte wählen Sie die primäre IP-Adresse des Servers aus. Dies ist für einige Dienste und Funktionen notwendig,
- z.B. wenn Sie Authentifizierung über Active Directory nutzen wollen.
+ {{lang_chooseIP}}
</p>
<form method="post" action="?do=ServerSetup">
<input type="hidden" name="action" value="ip">
@@ -17,18 +16,21 @@
<td>{{ip}}</td>
{{#default}}
<td>
- <span class="btn btn-success btn-xs"><span class="glyphicon glyphicon-ok"></span> Aktiv</span>
+ <span class="btn btn-success btn-xs"><span class="glyphicon glyphicon-ok"></span> {{lang_active}}</span>
</td>
{{/default}}
{{^default}}
<td>
- <button class="btn btn-primary btn-xs" name="ip" value="{{ip}}"><span class="glyphicon glyphicon-flag"></span> Setzen</button>
+ <button class="btn btn-primary btn-xs" name="ip" value="{{ip}}"><span class="glyphicon glyphicon-flag"></span> {{lang_set}}</button>
</td>
{{/default}}
</tr>
{{/ips}}
</table>
+ <p>
+ {{lang_bootHint}}
+ </p>
</form>
</div>
</div>
-</div> \ No newline at end of file
+</div>
diff --git a/templates/serversetup/ipxe.html b/templates/serversetup/ipxe.html
index 90e6b734..772777d1 100644
--- a/templates/serversetup/ipxe.html
+++ b/templates/serversetup/ipxe.html
@@ -4,37 +4,37 @@
<input type="hidden" name="token" value="{{token}}">
<div class="panel panel-default">
<div class="panel-heading">
- Bootmenü
+ {{lang_bootMenu}}
</div>
<div class="panel-body">
<p>
- Hier können Anpassungen am Erscheinungsbild des Bootmenüs vorgenommen werden.
+ {{lang_bootInfo}}
</p>
<br>
<div class="form-group">
- <strong>Standard-Bootverhalten</strong>
+ <strong>{{lang_bootBehavior}}</strong>
<label class="radio"><input type="radio" name="defaultentry" value="net" {{active-net}}> bwLehrpool</label>
- <label class="radio"><input type="radio" name="defaultentry" value="hdd" {{active-hdd}}> Lokale HDD</label>
+ <label class="radio"><input type="radio" name="defaultentry" value="hdd" {{active-hdd}}> {{lang_localHDD}}</label>
<label class="radio"><input type="radio" name="defaultentry" value="custom" {{active-custom}}> &quot;my-entry&quot;</label>
</div>
<div class="form-group">
- <strong>Anzeigedauer des Menüs</strong>
+ <strong>{{lang_menuDisplayTime}}</strong>
<div class="input-group form-narrow">
<input type="text" class="form-control" name="timeout" value="{{timeout}}" pattern="\d+">
- <span class="input-group-addon">Sekunden</span>
+ <span class="input-group-addon">{{lang_seconds}}</span>
</div>
</div>
<div class="form-group">
- <strong>Benutzerdefinierter Menüzusatz</strong> <a class="btn btn-default btn-xs" data-toggle="modal" data-target="#help-custom"><span class="glyphicon glyphicon-question-sign"></span></a>
+ <strong>{{lang_menuCustom}}</strong> <a class="btn btn-default btn-xs" data-toggle="modal" data-target="#help-custom"><span class="glyphicon glyphicon-question-sign"></span></a>
<textarea class="form-control" name="custom">{{custom}}</textarea>
</div>
</div>
<div class="panel-footer">
- <button class="btn btn-primary" name="action" value="ipxe">Bootmenü erzeugen</button>
+ <button class="btn btn-primary" name="action" value="ipxe">{{lang_bootMenuCreate}}</button>
</div>
</div>
</form>
@@ -43,26 +43,20 @@
<div class="modal fade" id="help-custom" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
- <div class="modal-header">Benutzerdefinierter Menüzusatz</div>
+ <div class="modal-header">{{lang_menuCustom}}</div>
<div class="modal-body">
- Hier haben Sie die Möglichkeit, eigenen Menü-Code zum angezeigten PXE-Menü hinzuzufügen,
- um z.B. auf weitere PXE-Server zu verweisen. Das Format entspricht dem syslinux Menüformat.
- <br>Bespiele:
+ {{lang_menuCustomHint1}}
+ <br>{{lang_example}}:
<pre>LABEL my-entry
- MENU LABEL ^Mein Eintrag
+ MENU LABEL ^My Entry
KERNEL http://1.2.3.4/kernel
INITRD http://1.2.3.4/initramfs-stage31
APPEND custom=option
IPAPPEND 3</pre>
- <pre>LABEL weiterleitung
- MENU LABEL Anderer ^Server
- KERNEL pxechn.c32
- APPEND 1.2.3.4::pxelinux.0</pre>
- Sie können ein oder mehrere Einträge erzeugen. Wenn Sie einen Eintrag erzeugen möchten, der
- automatisch gestartet wird, wenn der Benutzer keine Auswahl tätigt, vergeben Sie als LABEL <strong>my-entry</strong>
- und wählen Sie als <strong>Standard-Bootverhalten</strong> ebenfalls <strong>my-entry</strong>.
+ {{lang_menuCustomHint2}} LABEL <strong>my-entry</strong>
+ {{lang_menuCustomHint3}}
</div>
- <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">Schließen</a></div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
</div>
</div>
</div>
diff --git a/templates/sysconfig/_page.html b/templates/sysconfig/_page.html
index 84f98408..af0d598a 100644
--- a/templates/sysconfig/_page.html
+++ b/templates/sysconfig/_page.html
@@ -1,7 +1,7 @@
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
- Verfügbare Systemkonfigurationen
+ {{lang_availableSystem}}
<a class="btn btn-default" data-toggle="modal" data-target="#help-config"><span class="glyphicon glyphicon-question-sign"></span></a>
</div>
<div class="panel-body">
@@ -16,42 +16,41 @@
{{^current}}
<button class="btn btn-primary btn-xs" name="activate" value="{{configid}}">
<span class="glyphicon glyphicon-flag"></span>
- Aktivieren
+ {{lang_activate}}
</button>
{{/current}}
{{#current}}
<span class="btn btn-success btn-xs">
<span class="glyphicon glyphicon-ok"></span>
- Aktiv
+ {{lang_active}}
</span>
{{/current}}
</td>
<td>
- <button class="btn btn-danger btn-xs" name="del" value="{{configid}}"><span class="glyphicon glyphicon-trash"></span> Löschen</button>
+ <button class="btn btn-danger btn-xs" name="del" value="{{configid}}"><span class="glyphicon glyphicon-trash"></span> {{lang_delete}}</button>
</td>
</tr>
{{/configs}}
</table>
{{^configs}}
<div class="alert alert-warning">
- Keine Systemkonfigurationen gefunden.
- <br>Erstellen Sie eine neue Konfiguration aus den unten aufgeführten Konfigurationsmodulen.
+ {{lang_systemConfigurationNotFound}}
</div>
{{^modules}}
<div class="alert alert-danger">
- Bevor Sie eine Systemkonfiguration erstellen können, müssen Sie zunächst ein Konfigurationsmodul erzeugen.
+ {{lang_systemConfigurationAlert}}
</div>
{{/modules}}
{{/configs}}
</form>
</div>
<div class="panel-footer">
- <a class="btn btn-primary" href="?do=SysConfig&amp;action=addconfig">Neue Konfiguration</a>
+ <a class="btn btn-primary" href="?do=SysConfig&amp;action=addconfig">{{lang_newConfiguration}}</a>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
- Verfügbare Konfigurationsmodule
+ {{lang_availableModules}}
<a class="btn btn-default" data-toggle="modal" data-target="#help-module"><span class="glyphicon glyphicon-question-sign"></span></a>
</div>
<div class="panel-body">
@@ -63,22 +62,22 @@
<tr>
<td>{{module}}</td>
<td>
- <button class="btn btn-default btn-xs" name="list" value="{{moduleid}}"><span class="glyphicon glyphicon-eye-open"></span> Ansehen</button>
+ <button class="btn btn-default btn-xs" name="list" value="{{moduleid}}"><span class="glyphicon glyphicon-eye-open"></span> {{lang_show}}</button>
<!-- a class="btn btn-default btn-xs"><span class="glyphicon glyphicon-edit"></span> Bearbeiten</a -->
</td>
<td>
- <button class="btn btn-danger btn-xs" name="del" value="{{moduleid}}"><span class="glyphicon glyphicon-trash"></span> Löschen</button>
+ <button class="btn btn-danger btn-xs" name="del" value="{{moduleid}}"><span class="glyphicon glyphicon-trash"></span> {{lang_delete}}</button>
</td>
</tr>
{{/modules}}
</table>
{{^modules}}
- <div class="alert alert-warning">Keine Konfigurationsmodule gefunden!</div>
+ <div class="alert alert-warning">{{lang_configurationModuleNotFound}}</div>
{{/modules}}
</form>
</div>
<div class="panel-footer">
- <a class="btn btn-primary" href="?do=SysConfig&amp;action=addmodule">Neues Modul</a>
+ <a class="btn btn-primary" href="?do=SysConfig&amp;action=addmodule">{{lang_newModule}}</a>
</div>
</div>
</div>
@@ -86,15 +85,11 @@
<div class="modal fade" id="help-config" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
- <div class="modal-header">Systemkonfiguration</div>
+ <div class="modal-header">{{lang_systemConfiguration}}</div>
<div class="modal-body">
- Über eine Systemkonfiguration wird die grundlegende Lokalisierung des bwLehrpool-Systems
- durchgeführt. Dazu gehören Aspekte wie das Authentifizierungsverfahren für Benutzer
- (z.B. Active Directory, LDAP), Druckerkonfiguration, Home-Verzeichnisse, etc.<br>
- Eine Systemkonfiguration setzt sich aus einem oder mehreren Konfigurationsmodulen zusammen,
- welche im unteren Bereich dieser Seite verwaltet werden können.
+ {{lang_helpSystemConfiguration}}
</div>
- <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">Schließen</a></div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
</div>
</div>
</div>
@@ -102,13 +97,11 @@
<div class="modal fade" id="help-module" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
- <div class="modal-header">Konfigurationsmodule</div>
+ <div class="modal-header">{{lang_moduleConfiguration}}</div>
<div class="modal-body">
- Konfigurationsmodule sind die Bausteine, aus denen eine Systemkonfiguration erstellt wird.
- Hier lassen sich sowohl generische Module durch einen Wizard anlegen, als auch komplett eigene
- Module erstellen (fortgeschritten, Linuxkenntnisse erforderlich).
+ {{lang_helpModuleConfiguration}}
</div>
- <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">Schließen</a></div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
</div>
</div>
</div>
diff --git a/templates/sysconfig/ad-checkconnection.html b/templates/sysconfig/ad-checkconnection.html
index 3a2c7a42..e321dc6e 100644
--- a/templates/sysconfig/ad-checkconnection.html
+++ b/templates/sysconfig/ad-checkconnection.html
@@ -1,5 +1,5 @@
<p>
- Die Verbindung zum angegebenen AD-Server wird nun überprüft. Bitte haben Sie einen Moment Geduld.
+ {{lang_connectionWait}}
</p>
<div id="zeug">
@@ -14,7 +14,7 @@
<input name="binddn" value="{{binddn}}" type="hidden">
<input name="bindpw" value="{{bindpw}}" type="hidden">
<input name="home" value="{{home}}" type="hidden">
- <button type="submit" class="btn btn-primary">&laquo; Zurück</button>
+ <button type="submit" class="btn btn-primary">&laquo; {{lang_back}}</button>
</form>
</div>
<div class="pull-right">
@@ -25,7 +25,7 @@
<input name="binddn" value="{{binddn}}" type="hidden">
<input name="bindpw" value="{{bindpw}}" type="hidden">
<input name="home" value="{{home}}" type="hidden">
- <button id="nextbutton" type="submit" class="btn btn-primary">Überspringen &raquo;</button>
+ <button id="nextbutton" type="submit" class="btn btn-primary">{{lang_skip}} &raquo;</button>
</form>
</div>
<script type="text/javascript">
diff --git a/templates/sysconfig/ad-finish.html b/templates/sysconfig/ad-finish.html
index a0199728..61564b38 100644
--- a/templates/sysconfig/ad-finish.html
+++ b/templates/sysconfig/ad-finish.html
@@ -1,16 +1,16 @@
<p>
- Der AD-Proxy wird nun konfiguriert und gestartet...
+ {{lang_adStarted}}
</p>
<div id="zeug">
- <div data-tm-id="{{tm-config}}" data-tm-log="error" data-tm-callback="ldapCb">Modul erzeugen</div>
+ <div data-tm-id="{{tm-config}}" data-tm-log="error" data-tm-callback="ldapCb">{{lang_generateModule}}</div>
</div>
<br>
<div id="back" class="pull-left" style="display:none">
- <a href="?do=SysConfig&amp;action=addmodule&amp;step=AdModule_Start" class="btn btn-primary">Assistent neustarten</a>
+ <a href="?do=SysConfig&amp;action=addmodule&amp;step=AdModule_Start" class="btn btn-primary">{{lang_restartWizard}}</a>
</div>
<div id="finish" class="pull-right" style="display:none">
- <a href="?do=SysConfig" class="btn btn-primary">Zur Systemkonfiguration</a>
+ <a href="?do=SysConfig" class="btn btn-primary">{{lang_to}} {{lang_systemConfiguration}}</a>
</div>
<script type="text/javascript">
function ldapCb(task)
diff --git a/templates/sysconfig/ad-start.html b/templates/sysconfig/ad-start.html
index d4fdbdb7..c3606825 100644
--- a/templates/sysconfig/ad-start.html
+++ b/templates/sysconfig/ad-start.html
@@ -1,46 +1,41 @@
<p>
- Zum Einrichten der Benutzerauthentifizierung über ein Active Directory wird neben der Adresse
- des anzusprechenden Servers ein dedizierter Benutzer im AD benötigt, über welchen das AD angesprochen wird.
+ {{lang_adText1}}
<br>
- Dieser Benutzer benötigt keine besonderen Rechte, Sie können diesem Benutzer zur Sicherheit auch die
- Rechte zum Anmelden entziehen. Der Benutzer muss lediglich ausreichende Berechtigungen haben, um einen
- LDAP-Bind am AD durchzuführen, und nach Benutzern zu suchen.
+ {{lang_adText2}}
<br>
- Im Folgenden muss der <strong>Distinguished Name</strong> des Benutzers angegeben werden. Diesen können Sie ermitteln,
- indem Sie das Kommandozeilenprogramm <strong>dsquery</strong> auf einem Domain Controller wie folgt aufrufen:
+ {{lang_adText3}}
</p>
-<pre>dsquery user -name &quot;Benutzername&quot;</pre>
+<pre>dsquery user -name &quot;Username&quot;</pre>
<p>
- Nach Eingabe aller benötigten Daten wird im nächsten Schritt überprüft, ob die Kommunikation mit
- dem AD möglich ist.
+ {{lang_adText4}}
</p>
<form role="form" method="post" action="?do=SysConfig&amp;action=addmodule&amp;step={{step}}">
<input type="hidden" name="token" value="{{token}}">
<div class="input-group">
- <span class="input-group-addon slx-ga">Server</span>
+ <span class="input-group-addon slx-ga">Server </span>
<input tabindex="1" name="server" value="{{server}}" type="text" class="form-control" placeholder="dc0.institution.example.com">
<span class="input-group-btn">
<a class="btn btn-default"><span class="glyphicon glyphicon-question-sign"></span></a>
</span>
</div>
<div class="input-group">
- <span class="input-group-addon slx-ga">Suchbasis</span>
+ <span class="input-group-addon slx-ga">{{lang_searchBase}}</span>
<input tabindex="2" name="searchbase" value="{{searchbase}}" type="text" class="form-control" placeholder="dc=windows,dc=hs-beispiel,dc=de">
<span class="input-group-btn">
<a class="btn btn-default"><span class="glyphicon glyphicon-question-sign"></span></a>
</span>
</div>
<div class="input-group">
- <span class="input-group-addon slx-ga">Bind DN</span>
+ <span class="input-group-addon slx-ga">{{lang_bindDN}}</span>
<input tabindex="3" name="binddn" value="{{binddn}}" type="text" class="form-control" placeholder="CN=bwlehrpool user,OU=Benutzer,OU=Gruppe XYZ,DC=windows,DC=hs-beispiel,DC=de">
<span class="input-group-btn">
<a class="btn btn-default"><span class="glyphicon glyphicon-question-sign"></span></a>
</span>
</div>
<div class="input-group">
- <span class="input-group-addon slx-ga">Passwort</span>
- <input tabindex="4" name="bindpw" value="{{bindpw}}" type="text" class="form-control" placeholder="Paswort von 'bwlehrpool user'">
+ <span class="input-group-addon slx-ga">{{lang_password}}</span>
+ <input tabindex="4" name="bindpw" value="{{bindpw}}" type="text" class="form-control" placeholder="{{lang_password}}">
<span class="input-group-btn">
<a class="btn btn-default"><span class="glyphicon glyphicon-question-sign"></span></a>
</span>
@@ -55,27 +50,24 @@
</div>
<br>
<div class="pull-right">
- <button type="submit" class="btn btn-primary">Weiter &raquo;</button>
+ <button type="submit" class="btn btn-primary">{{lang_next}} &raquo;</button>
</div>
</form>
<div class="modal fade" id="help-home" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
- <div class="modal-header">Benutzerverzeichnis</div>
+ <div class="modal-header">{{lang_userDirectory}}</div>
<div class="modal-body">
<p>
- <b>Optionale Angabe</b>: Wenn die Clients für die Benutzer ein eigenes Verzeichnis
- (Homeverzeichnis, Benutzerverzeichnis) von einem Server einbinden sollen, geben Sie
- bitte hier das Format in <b>UNC-Notation</b> an, also z.B. <pre>\\fileserv.uni.example.com\users\%s</pre>
- <b>%s</b> ist dabei ein Platzhalter für den Login-Namen des Benutzers.
+ {{lang_userDirectoryInfo1}} <pre>\\fileserv.uni.example.com\users\%s</pre>
+ {{lang_userDirectoryInfo2}}
</p>
<p>
- Das Verzeichnis wird mit den gleichen Zugangsdaten eingebunden, die der Benutzer beim Login angibt.
- (D.h. kein Kerberos Support o.ä.)
+ {{lang_userDirectoryInfo3}}
</p>
</div>
- <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">Schließen</a></div>
+ <div class="modal-footer"><a class="btn btn-primary" data-dismiss="modal">{{lang_close}}</a></div>
</div>
</div>
</div>
diff --git a/templates/sysconfig/branding-check.html b/templates/sysconfig/branding-check.html
index 93be4f2d..52c70cd0 100644
--- a/templates/sysconfig/branding-check.html
+++ b/templates/sysconfig/branding-check.html
@@ -1,9 +1,5 @@
<p>
- Unten sehen Sie zur Kontrolle noch einmal das ausgewählte Logo. Sollten Sie das Logo
- nicht sehen können, prüfen Sie bitte, ob Sie ein valides SVG-Bild verwendet haben.
- Alternativ ist es möglich, dass beim Verarbeiten des Bildes ein Fehler auftrat. Sie
- können daher das Modul trotzdem speichern und testen, ob das Logo im bwLehrpool-System
- angezeigt wird.
+ {{lang_brandingInfo}}
</p>
<div class="pull-left">
{{#svg}}
@@ -21,9 +17,9 @@
<form role="form" enctype="multipart/form-data" method="post" action="?do=SysConfig&amp;action=addmodule&amp;step={{step}}">
<input type="hidden" name="token" value="{{token}}">
<div class="form-group">
- <label for="title-id">Titel</label>
+ <label for="title-id">{{lang_title}}</label>
<input type="text" name="title" id ="title-id" class="form-control" placeholder="Name des Moduls">
</div>
- <button type="submit" class="btn btn-primary">Speichern</button>
+ <button type="submit" class="btn btn-primary">{{lang_save}}</button>
</form>
</div>
diff --git a/templates/sysconfig/branding-start.html b/templates/sysconfig/branding-start.html
index d26a5dee..7b22a3fd 100644
--- a/templates/sysconfig/branding-start.html
+++ b/templates/sysconfig/branding-start.html
@@ -1,19 +1,17 @@
<p>
- Für beste Ergebnisse sollten Sie ihr Einrichtungslogo im SVG Format hochladen.
- das SVG-Format ist ein Vektorgrafikformat, was zum Skalieren vorteilhaft ist.
- Eine Gute Quelle für SVG-Logos von Unis und Hochschulen ist ihr jeweiliger Wikipedia-Artikel.
+ {{lang_branding}}
</p>
<form role="form" enctype="multipart/form-data" method="post" action="?do=SysConfig&amp;action=addmodule&amp;step={{step}}">
<input type="hidden" name="token" value="{{token}}">
<div class="form-group">
- <label for="input-url">Bild von URL laden</label>
+ <label for="input-url">{{lang_urlLoad}}</label>
<input class="form-control" type="text" name="url" id="input-url">
</div>
- oder
+ {{lang_or}}
<div class="form-group">
- <label for="input-file">Bild von lokalem Rechner hochladen</label>
+ <label for="input-file">{{lang_computerLoad}}</label>
<input class="form-control" type="file" name="file" id="input-file">
</div>
- <button type="submit" class="btn btn-primary">Hochladen</button>
+ <button type="submit" class="btn btn-primary">{{lang_upload}}</button>
</form>
diff --git a/templates/sysconfig/cfg-finish.html b/templates/sysconfig/cfg-finish.html
index 2bf63420..a6e51996 100644
--- a/templates/sysconfig/cfg-finish.html
+++ b/templates/sysconfig/cfg-finish.html
@@ -1,5 +1,5 @@
<p>
- Die Konfiguration wurde erfolgreich erstellt.
+ {{lang_configurationSuccess}}
</p>
<form role="form" method="post" action="?do=SysConfig">
@@ -7,6 +7,6 @@
<input type="hidden" name="action" value="config">
<input type="hidden" name="activate" value="{{configid}}">
<div class="pull-left">
- <button type="submit" class="btn btn-primary">Konfiguration aktivieren</button>
+ <button type="submit" class="btn btn-primary">{{lang_configurationActive}}</button>
</div>
</form>
diff --git a/templates/sysconfig/cfg-start.html b/templates/sysconfig/cfg-start.html
index 7d092337..44119dd3 100644
--- a/templates/sysconfig/cfg-start.html
+++ b/templates/sysconfig/cfg-start.html
@@ -1,11 +1,11 @@
<form role="form" method="post" action="?do=SysConfig&amp;action=addconfig&amp;step={{step}}">
<input type="hidden" name="token" value="{{token}}">
<div class="input-group">
- <span class="input-group-addon">Name</span>
- <input type="text" name="title" class="form-control" placeholder="Meine Konfiguration" autofocus="autofocus">
+ <span class="input-group-addon">{{lang_name}}</span>
+ <input type="text" name="title" class="form-control" placeholder="{{lang_configuration}}" autofocus="autofocus">
</div>
<hr>
- <p>Bitte wählen Sie, welche Module für diese Konfiguration verwendet werden sollen.</p>
+ <p>{{lang_configurationChoose}}</p>
{{#groups}}
<div class="panel panel-default">
<div class="slx-litehead">{{group}}</div>
@@ -27,12 +27,12 @@
</div>
{{/modules}}
{{^modules}}
- <a class="btn btn-primary btn-xs" href="?do=SysConfig&amp;action=addmodule&amp;step={{startClass}}">Neu..</a>
+ <a class="btn btn-primary btn-xs" href="?do=SysConfig&amp;action=addmodule&amp;step={{startClass}}">{{lang_new}}..</a>
{{/modules}}
</div>
</div>
{{/groups}}
<div class="pull-right">
- <button type="submit" class="btn btn-primary">Weiter &raquo;</button>
+ <button type="submit" class="btn btn-primary">{{lang_next}} &raquo;</button>
</div>
</form>
diff --git a/templates/sysconfig/custom-filelist.html b/templates/sysconfig/custom-filelist.html
index 3d2a079b..3ad241dd 100644
--- a/templates/sysconfig/custom-filelist.html
+++ b/templates/sysconfig/custom-filelist.html
@@ -13,4 +13,4 @@
</tr>
{{/files}}
</table>
-<a class="btn btn-primary btn-sm" href="?do=SysConfig">Zurück &laquo;</a>
+<a class="btn btn-primary btn-sm" href="?do=SysConfig">{{lang_back}} &laquo;</a>
diff --git a/templates/sysconfig/custom-fileselect.html b/templates/sysconfig/custom-fileselect.html
index 21537c49..de99c2f9 100644
--- a/templates/sysconfig/custom-fileselect.html
+++ b/templates/sysconfig/custom-fileselect.html
@@ -2,11 +2,11 @@
<input type="hidden" name="modid" value="{{modid}}">
<input type="hidden" name="token" value="{{token}}">
<div class="input-group">
- <span class="input-group-addon">Modulname</span>
+ <span class="input-group-addon">{{lang_moduleName}}</span>
<input type="text" name="title" class="form-control" placeholder="Mein Konfigurationsmodul" autofocus="autofocus">
</div>
<hr>
- <p>Hier haben Sie die Möglichkeit, den Inhalt des Archivs noch einmal zu überprüfen.</p>
+ <p>{{lang_checkFileContent}}</p>
<table class="table table-bordered table-condensed">
{{#files}}
<tr>
@@ -21,6 +21,6 @@
{{/files}}
</table>
<div class="pull-right">
- <button type="submit" class="btn btn-primary">Weiter &raquo;</button>
+ <button type="submit" class="btn btn-primary">{{lang_next}} &raquo;</button>
</div>
</form>
diff --git a/templates/sysconfig/custom-upload.html b/templates/sysconfig/custom-upload.html
index 1f312009..9ab71eaa 100644
--- a/templates/sysconfig/custom-upload.html
+++ b/templates/sysconfig/custom-upload.html
@@ -1,17 +1,13 @@
-<p>Über ein benutzerdefiniertes Modul ist es möglich, beliebige Dateien
- zum Linux-Grundsystem, das auf den Clients gebootet wird, hinzuzufügen.
- Dazu kann ein Archiv mit einer Dateisystemstruktur hochgeladen werden, die
- in dieser Form 1:1 in das gebootete Linux extrahiert wird.</p>
+<p>{{lang_customModuleInfo1}}</p>
-<p>Beispiel: Enthält das hochgeladene Archiv eine Datei <strong>etc/beispiel.conf</strong>,
- so wird auf einem gebooteten Client diese Datei als <strong>/etc/beispiel.conf</strong> zu finden sein.</p>
+<p>{{lang_customModuleInfo2}}</p>
<form role="form" enctype="multipart/form-data" method="post" action="?do=SysConfig&amp;action=addmodule&amp;step={{step}}">
<input type="hidden" name="token" value="{{token}}">
<div class="input-group">
- <span class="input-group-addon">Archiv</span>
+ <span class="input-group-addon">{{lang_file}}</span>
<input class="form-control" type="file" name="modulefile">
</div>
- <p class="help-block">Unterstützte Archivformate: .tar.gz, .tar.bz2, .zip</p>
- <button type="submit" class="btn btn-primary">Hochladen</button>
-</form> \ No newline at end of file
+ <p class="help-block">{{lang_supportedFiles}}: .tar.gz, .tar.bz2, .zip</p>
+ <button type="submit" class="btn btn-primary">{{lang_upload}}</button>
+</form>
diff --git a/templates/sysconfig/start.html b/templates/sysconfig/start.html
index 68777329..f03444aa 100644
--- a/templates/sysconfig/start.html
+++ b/templates/sysconfig/start.html
@@ -1,9 +1,9 @@
-<p>Bitte wählen Sie aus, welche Art Konfigurationsmodul Sie erstellen möchten.</p>
+<p>{{lang_moduleChoose}}</p>
{{#modules}}
<div class="panel panel-default">
<div class="panel-heading">
- {{title}} <a href="?do=SysConfig&amp;action=addmodule&amp;step={{startClass}}" class="pull-right btn btn-primary btn-xs"><span class="glyphicon glyphicon-plus"></span> Hinzufügen</a>
+ {{title}} <a href="?do=SysConfig&amp;action=addmodule&amp;step={{startClass}}" class="pull-right btn btn-primary btn-xs"><span class="glyphicon glyphicon-plus"></span> {{lang_add}}</a>
</div>
<div class="panel-body">
{{description}}
diff --git a/templates/systemstatus/_page.html b/templates/systemstatus/_page.html
index fca087d1..9c50bb93 100644
--- a/templates/systemstatus/_page.html
+++ b/templates/systemstatus/_page.html
@@ -9,7 +9,7 @@
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
- Speicherplatz
+ {{lang_space}}
</div>
<div class="panel-body" id="diskstat">
<span class="glyphicon glyphicon-refresh slx-rotation"></span>
@@ -20,7 +20,7 @@
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
- Dienste
+ {{lang_services}}
</div>
<div class="panel-body" id="services">
<span class="glyphicon glyphicon-refresh slx-rotation"></span>
@@ -36,7 +36,7 @@
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
- Adresskonfiguration
+ {{lang_addressConfiguration}}
</div>
<div class="panel-body" id="addresses">
<span class="glyphicon glyphicon-refresh slx-rotation"></span>
@@ -47,7 +47,7 @@
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
- System
+ {{lang_system}}
</div>
<div class="panel-body" id="systeminfo">
<span class="glyphicon glyphicon-refresh slx-rotation"></span>
@@ -62,14 +62,14 @@
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
- Wartung
+ {{lang_maintenance}}
</div>
<div class="panel-body">
<form class="form-adduser" action="?do=SystemStatus" method="post">
<input type="hidden" name="token" value="{{token}}">
<input type="hidden" name="action" value="reboot">
<div>Server Reboot</div>
- <label><input type="checkbox" name="confirm" value="yep"> Ja, ich bin sicher</label>
+ <label><input type="checkbox" name="confirm" value="yep"> {{lang_iAmSure}}</label>
<button class="btn btn-warning btn-xs" type="submit">Reboot</button>
</form>
</div>
diff --git a/templates/systemstatus/diskstat.html b/templates/systemstatus/diskstat.html
index 02487c0d..71ad7b9a 100644
--- a/templates/systemstatus/diskstat.html
+++ b/templates/systemstatus/diskstat.html
@@ -1,21 +1,21 @@
<div class="slx-storechart">
{{#system}}
- <b>Systempartition</b>
+ <b>{{lang_systemPartition}}</b>
<div id="circles-system"></div>
- Kapazität: {{size}}
+ {{lang_capacity}}: {{size}}
{{/system}}
{{^system}}
- <b>Fehler beim Ermitteln des verfügbaren Speichers auf der Systempartition!</b>
+ <b>{{lan_availableMemoryError}}</b>
{{/system}}
</div>
<div class="slx-storechart">
{{#store}}
- <b>VM-Speicher</b>
+ <b>{{lang_vmStore}}</b>
<div id="circles-store"></div>
- Kapazität: {{size}}
+ {{lang_capacity}}: {{size}}
{{/store}}
{{^store}}
- <b>Fehler beim Ermitteln des verfügbaren Speicherplatzes am VM-Speicherort. Bitte überprüfen Sie die Konfiguration.</b>
+ <b>{{lang_vmStoreError}}</b>
{{/store}}
</div>
<div class="clearfix"></div>
@@ -49,4 +49,4 @@
textClass: 'circles-text'
});
{{/system}}
-</script> \ No newline at end of file
+</script>
diff --git a/templates/systemstatus/systeminfo.html b/templates/systemstatus/systeminfo.html
index 78cdd43e..11076d52 100644
--- a/templates/systemstatus/systeminfo.html
+++ b/templates/systemstatus/systeminfo.html
@@ -1,41 +1,41 @@
<div>
- OS Uptime: {{uptime}}
+ {{lang_uptimeOS}}: {{uptime}}
</div>
<div class="slx-storechart">
- <b>CPU-Last</b>
+ <b>{{lang_cpuLoad}}</b>
{{#cpuLoadOk}}
<div id="circles-cpuload"></div>
- <div>Durchschnitt: {{cpuLoad}}%</div>
- <div>Nur OS: {{cpuSystem}}%</div>
- <div>Logische CPUs: {{cpuCount}}</div>
+ <div>{{lang_average}}: {{cpuLoad}}%</div>
+ <div>{{lang_onlyOS}}: {{cpuSystem}}%</div>
+ <div>{{lang_logicCPUs}}: {{cpuCount}}</div>
{{/cpuLoadOk}}
{{^cpuLoadOk}}
- Konnte nicht ermittelt werden
+ {{lang_notDetermined}}
{{/cpuLoadOk}}
</div>
<div class="slx-storechart">
- <b>RAM-Nutzung</b>
+ <b>{{lang_ramUsage}}</b>
{{#memTotal}}
<div id="circles-mem"></div>
- <div>Gesamt: {{memTotal}}</div>
- <div>Frei: {{memFree}}</div>
+ <div>{{lang_total}}: {{memTotal}}</div>
+ <div>{{lang_free}}: {{memFree}}</div>
{{/memTotal}}
{{^memTotal}}
- Konnte nicht ermittelt werden
+ {{lang_notDetermined}}
{{/memTotal}}
</div>
<div class="slx-storechart">
- <b>swap-Nutzung</b>
+ <b>{{lang_swapUsage}}</b>
{{#memTotal}}
<div id="circles-swap"></div>
- <div>Gesamt: {{swapTotal}}</div>
- <div>Belegt: {{swapUsed}}</div>
+ <div>{{lang_total}}: {{swapTotal}}</div>
+ <div>{{lang_occupied}}: {{swapUsed}}</div>
{{/memTotal}}
{{^memTotal}}
- Konnte nicht ermittelt werden
+ {{lang_notDetermined}}
{{/memTotal}}
</div>
@@ -43,8 +43,7 @@
{{#swapWarning}}
<div>
- <b>Achtung!</b> Es wird swap-Speicher genutzt. Dies kann ein Hinweis darauf sein, dass dem Satelliten-Server zu wenig physikalischer Speicher zur Verfügung steht. Im Falle von
- Performance-Problemen oder Instabilität des Servers sollten Sie erwägen, den Server mit mehr RAM auszustatten.
+ <b>{{lang_attention}}</b> {{lang_swapWarning}}
</div>
{{/swapWarning}}
@@ -89,4 +88,4 @@
textClass: 'circles-text'
});
{{/memTotal}}
-</script> \ No newline at end of file
+</script>
diff --git a/templates/translation/_page.html b/templates/translation/_page.html
new file mode 100644
index 00000000..8e5e4bab
--- /dev/null
+++ b/templates/translation/_page.html
@@ -0,0 +1,40 @@
+<div class="container">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ {{lang_langAdministration}}
+ </div>
+ <div class="panel-body">
+ <p>{{lang_adminInfo}}</p>
+ </div>
+ <ul class="list-group">
+ <a href="?do=Translation&page=messages" class="list-group-item active">{{lang_editMessages}}</a>
+ </ul>
+ </div>
+ <div class="panel panel-default">
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>Template</th>
+ <th style='text-align:center;'>{{lang_german}}</th>
+ <th style='text-align:center;'>{{lang_english}}</th>
+ <th style='text-align:center;'>{{lang_portuguese}}</th>
+ <tr>
+ </thead>
+ <tbody>
+ {{#table}}
+ <tr onclick="goTo('{{link}}');">
+ <td>{{template}}</td>
+ <td style='width:230px;text-align:center;'>{{{de}}}</td>
+ <td style='width:230px;text-align:center;'>{{{en}}}</td>
+ <td style='width:230px;text-align:center;'>{{{pt}}}</td>
+ </tr>
+ {{/table}}
+ </tbody>
+ </table>
+ </div>
+</div>
+<script>
+function goTo(link){
+ window.location.href = "?do=Translation&page=templates&template=" + link;
+}
+</script>
diff --git a/templates/translation/messages.html b/templates/translation/messages.html
new file mode 100644
index 00000000..c065c7f7
--- /dev/null
+++ b/templates/translation/messages.html
@@ -0,0 +1,107 @@
+<div class="container">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ {{lang_messages}}
+ </div>
+ <div class="panel-body">
+ <p>{{lang_templateMessagesHelp}}</p>
+ <div class="alert alert-info">
+ {{lang_templateHint}}
+ </div>
+ </div>
+ <form action="?do=Translation" method="post">
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>{{lang_messages}}</th>
+ <th style='text-align:center;width:260px;'>{{lang_germanJSON}}</th>
+ <th style='text-align:center;width:260px;'>{{lang_englishJSON}}</th>
+ <th style='text-align:center;width:260px;'>{{lang_portugueseJSON}}</th>
+ <th style='width:100px;text-align:center;'></th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#msgs}}
+ <tr>
+ <td>{{tag}}</td>
+ <td style='width:250px;text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_germanTAG}}" value="{{de}}" name="lang#de#{{tag}}">
+ </td>
+ <td style='width:250px;text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_englishTAG}}" value="{{en}}" name="lang#en#{{tag}}">
+ </td>
+ <td style='width:250px;text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_portugueseTAG}}" value="{{pt}}" name="lang#pt#{{tag}}">
+ </td>
+ <td style='text-align:center;'>
+ <a class="btn btn-danger btn-xs" href="?do=Translation&template=messages&delete={{tag}}"><span class="glyphicon glyphicon-remove"></span> {{lang_deleteTAG}}</a>
+ </td>
+ </tr>
+ {{/msgs}}
+ <tr id="newTag">
+ </tr>
+ </tbody>
+ </table>
+ <div class="panel-body">
+ <a class="btn btn-primary" href='?do=Translation' >{{lang_back}}</a>
+ <button class="btn btn-primary" type="button" onclick="addTag(false);" >{{lang_newTag}}</button>
+ <input type="hidden" name="update" value="true">
+ <input type="hidden" name="path" value="messages">
+ <input type="hidden" name="token" value="{{token}}">
+ <input type="submit" class="btn btn-primary" value="{{lang_save}}">
+ </form>
+ </div>
+ <form action="?do=Translation" method="post">
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>{{lang_messagesHardcoded}}</th>
+ <th style='text-align:center;width:260px;'>{{lang_germanJSON}}</th>
+ <th style='text-align:center;width:260px;'>{{lang_englishJSON}}</th>
+ <th style='text-align:center;width:260px;'>{{lang_portugueseJSON}}</th>
+ <th style='width:100px;text-align:center;'></th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#msgsHC}}
+ <tr>
+ <td>{{tag}}</td>
+ <td style='width:250px;text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_germanTAG}}" value="{{de}}" name="lang#de#{{tag}}">
+ </td>
+ <td style='width:250px;text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_englishTAG}}" value="{{en}}" name="lang#en#{{tag}}">
+ </td>
+ <td style='width:250px;text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_portugueseTAG}}" value="{{pt}}" name="lang#pt#{{tag}}">
+ </td>
+ <td style='text-align:center;'>
+ <a class="btn btn-danger btn-xs" href="?do=Translation&template=messages-hardcoded&delete={{tag}}"><span class="glyphicon glyphicon-remove"></span> {{lang_deleteTAG}}</a>
+ </td>
+ </tr>
+ {{/msgsHC}}
+ <tr id="newTagCoded">
+ </tr>
+ </tbody>
+ </table>
+ <div class="panel-body">
+ <a class="btn btn-primary" href='?do=Translation' >{{lang_back}}</a>
+ <button class="btn btn-primary" type="button" onclick="addTag(true);" >{{lang_newTag}}</button>
+ <input type="hidden" name="update" value="true">
+ <input type="hidden" name="path" value="messages-hardcoded">
+ <input type="hidden" name="token" value="{{token}}">
+ <input type="submit" class="btn btn-primary" value="{{lang_save}}">
+ </form>
+ </div>
+ </div>
+</div>
+<script>
+function addTag(isHardcoded){
+ var target;
+ if(isHardcoded)
+ target = document.getElementById('newTagCoded');
+ else
+ target = document.getElementById('newTag');
+ target.innerHTML = "<td> <input type='text' class='form-control' placeholder='{{lang_newTAG}}' name='newtag'> </td> <td style='width:250px;text-align:center;'> <input type='text' class='form-control' placeholder='{{lang_germanTAG}}' name='lang#de#newtag'> </td> <td style='width:250px;text-align:center;'> <input type='text' class='form-control' placeholder='{{lang_englishTAG}}' name='lang#en#newtag'> </td> <td style='width:250px;text-align:center;'> <input type='text' class='form-control' placeholder='{{lang_portugueseTAG}}' name='lang#pt#newtag'> </td>";
+}
+</script>
diff --git a/templates/translation/template.html b/templates/translation/template.html
new file mode 100644
index 00000000..11d4e4e7
--- /dev/null
+++ b/templates/translation/template.html
@@ -0,0 +1,59 @@
+<div class="container">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ {{template}}
+ </div>
+ <div class="panel-body">
+ <p>{{lang_templateAdminHelp}}</p>
+ <div class="alert alert-info">
+ {{lang_templateHint}}
+ </div>
+ <form action="?do=Translation" method="post">
+ <table class="table table-hover">
+ <thead>
+ <tr>
+ <th>Mustache Tag</th>
+ <th style='width:250px;text-align:center;'>{{lang_germanJSON}}</th>
+ <th style='width:250px;text-align:center;'>{{lang_englishJSON}}</th>
+ <th style='width:250px;text-align:center;'>{{lang_portugueseJSON}}</th>
+ <th style='width:100px;text-align:center;'></th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#tags}}
+ <tr class="{{class}}" id="{{tag}}">
+ <td>{{tag}}</td>
+ <td style='text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_germanTAG}}" value="{{de}}" name="lang#de#{{tag}}">
+ </td>
+ <td style='text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_englishTAG}}" value="{{en}}" name="lang#en#{{tag}}">
+ </td>
+ <td style='text-align:center;'>
+ <input type="text" class="form-control" placeholder="{{lang_portugueseTAG}}" value="{{pt}}" name="lang#pt#{{tag}}">
+ </td>
+ <td style='text-align:center;'>
+ <a class="btn btn-danger btn-xs" href="?do=Translation&template={{template}}&delete={{tag}}"><span class="glyphicon glyphicon-remove"></span> {{lang_deleteTAG}}</a>
+ </td>
+ </tr>
+ {{/tags}}
+ <tr id="newTag">
+ </tr>
+ </tbody>
+ </table>
+ <a class="btn btn-primary" href='?do=Translation' >{{lang_back}}</a>
+ <button class="btn btn-primary" type="button" onclick="addTag(true);" >{{lang_createTag}}</button>
+ <input type="hidden" name="update" value="true">
+ <input type="hidden" name="path" value="{{template}}">
+ <input type="hidden" name="token" value="{{token}}">
+ <input type="submit" class="btn btn-primary" value="{{lang_save}}">
+ </form>
+ </div>
+ </div>
+</div>
+<script>
+function addTag(){
+ var target = document.getElementById('newTag');
+ target.innerHTML = "<td> <input type='text' class='form-control' placeholder='{{lang_newTAG}}' name='newtag'> </td> <td style='width:250px;text-align:center;'> <input type='text' class='form-control' placeholder='{{lang_germanTAG}}' name='lang#de#newtag'> </td> <td style='width:250px;text-align:center;'> <input type='text' class='form-control' placeholder='{{lang_englishTAG}}' name='lang#en#newtag'> </td> <td style='width:250px;text-align:center;'> <input type='text' class='form-control' placeholder='{{lang_portugueseTAG}}' name='lang#pt#newtag'> </td><td></td>";
+}
+</script>
diff --git a/templates/vmstore/mount.html b/templates/vmstore/mount.html
index d781d061..e1893e00 100644
--- a/templates/vmstore/mount.html
+++ b/templates/vmstore/mount.html
@@ -2,15 +2,15 @@
<div class="panel panel-default">
<div class="panel-heading">
- VM Speicherort wird konfiguriert
+ {{lang_vmLocationConfiguration}}
</div>
<div class="panel-body">
- <div data-tm-id="{{task}}" data-tm-log="messages" data-tm-callback="mountCb">Konfigurieren</div>
+ <div data-tm-id="{{task}}" data-tm-log="messages" data-tm-callback="mountCb">{{lang_configure}}</div>
<br>
<div id="finish" class="pull-right" style="display:none">
- <a href="?do=VmStore" class="btn btn-primary">Zurück</a>
+ <a href="?do=VmStore" class="btn btn-primary">{{lang_back}}</a>
</div>
<script type="text/javascript">
function mountCb(task)
@@ -25,4 +25,4 @@
</div>
</div>
-</div> \ No newline at end of file
+</div>