summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2016-05-11 19:00:30 +0200
committerSimon Rettberg2016-05-11 19:00:30 +0200
commit1cc1c2ed092c46eb35893c1d85accb24cf43d7f9 (patch)
tree95c1302f4a1ae441e174a1dca64133e2873f8297
parentAdd PhpStorm prefs (diff)
downloadslx-admin-1cc1c2ed092c46eb35893c1d85accb24cf43d7f9.tar.gz
slx-admin-1cc1c2ed092c46eb35893c1d85accb24cf43d7f9.tar.xz
slx-admin-1cc1c2ed092c46eb35893c1d85accb24cf43d7f9.zip
Still working in modularization cleanup and refinement
-rw-r--r--Mustache/Engine.php2
-rw-r--r--inc/database.inc.php1
-rw-r--r--inc/message.inc.php4
-rw-r--r--inc/module.inc.php5
-rw-r--r--inc/property.inc.php1
-rw-r--r--inc/render.inc.php52
-rw-r--r--inc/request.inc.php5
-rw-r--r--inc/session.inc.php1
-rw-r--r--inc/taskmanagercallback.inc.php8
-rw-r--r--inc/up_json_encode.php4
-rw-r--r--inc/validator.inc.php1
-rw-r--r--index.php84
-rw-r--r--modules-available/baseconfig/lang/de/template-tags.json2
-rw-r--r--modules-available/baseconfig/lang/en/template-tags.json2
-rw-r--r--modules-available/baseconfig/lang/pt/template-tags.json2
-rw-r--r--modules-available/main/lang/de/global-tags.json7
-rw-r--r--modules-available/main/lang/de/template-tags.json1
-rw-r--r--modules-available/main/lang/en/global-tags.json7
-rw-r--r--modules-available/main/lang/en/template-tags.json1
-rw-r--r--modules-available/main/lang/pt/global-tags.json4
-rw-r--r--modules-available/main/lang/pt/template-tags.json1
-rw-r--r--modules-available/main/templates/php-errors.html12
-rw-r--r--modules-available/sysconfig/addmodule.inc.php3
-rw-r--r--modules-available/sysconfig/addmodule_adauth.inc.php12
-rw-r--r--modules-available/sysconfig/inc/configmodule.inc.php (renamed from inc/configmodule.inc.php)2
-rw-r--r--modules-available/sysconfig/inc/configmodule/adauth.inc.php (renamed from inc/configmodule/adauth.inc.php)9
-rw-r--r--modules-available/sysconfig/inc/configmodule/branding.inc.php (renamed from inc/configmodule/branding.inc.php)7
-rw-r--r--modules-available/sysconfig/inc/configmodule/customodule.inc.php (renamed from inc/configmodule/customodule.inc.php)7
-rw-r--r--modules-available/sysconfig/inc/configmodule/ldapauth.inc.php (renamed from inc/configmodule/ldapauth.inc.php)9
-rw-r--r--modules-available/sysconfig/inc/configmodule/sshconfig.inc.php (renamed from inc/configmodule/sshconfig.inc.php)6
-rw-r--r--modules-available/sysconfig/inc/configtgz.inc.php (renamed from inc/configtgz.inc.php)0
-rw-r--r--modules-available/sysconfig/lang/de/config-module.json (renamed from lang/de/config-module.json)0
-rw-r--r--modules-available/sysconfig/lang/en/config-module.json (renamed from lang/en/config-module.json)0
-rw-r--r--modules-available/sysconfig/lang/pt/config-module.json (renamed from lang/pt/config-module.json)0
-rw-r--r--modules-available/sysconfig/page.inc.php12
-rw-r--r--modules-available/translation/lang/de/template-tags.json6
-rw-r--r--modules-available/translation/lang/en/template-tags.json5
-rw-r--r--modules-available/translation/page.inc.php14
-rw-r--r--modules-available/translation/templates/custom-list.html38
-rw-r--r--modules-available/translation/templates/edit.html6
-rw-r--r--modules-available/translation/templates/message-list.html54
-rw-r--r--modules-available/translation/templates/string-list.html38
-rw-r--r--modules-available/translation/templates/template-list.html48
-rw-r--r--modules-available/usermanagement/lang/de/module.json3
-rw-r--r--style/default.css6
45 files changed, 308 insertions, 184 deletions
diff --git a/Mustache/Engine.php b/Mustache/Engine.php
index ca909bca..e1f6b8cf 100644
--- a/Mustache/Engine.php
+++ b/Mustache/Engine.php
@@ -444,6 +444,7 @@ class Mustache_Engine
} catch (InvalidArgumentException $e) {
// If the named partial cannot be found, return null.
}
+ return null;
}
/**
@@ -557,6 +558,7 @@ class Mustache_Engine
if ($this->cache) {
return sprintf('%s/%s.php', $this->cache, $this->getTemplateClassName($source));
}
+ return false;
}
/**
diff --git a/inc/database.inc.php b/inc/database.inc.php
index 735b2181..c3901453 100644
--- a/inc/database.inc.php
+++ b/inc/database.inc.php
@@ -113,6 +113,7 @@ class Database
return false;
Util::traceError("Database Error: \n" . $e->getMessage());
}
+ return false;
}
/**
diff --git a/inc/message.inc.php b/inc/message.inc.php
index d6a62f4e..15e89041 100644
--- a/inc/message.inc.php
+++ b/inc/message.inc.php
@@ -55,6 +55,7 @@ class Message
*/
public static function renderList()
{
+ self::$flushed = true;
if (empty(self::$list))
return;
// Ajax
@@ -75,11 +76,10 @@ class Message
foreach ($item['params'] as $index => $text) {
$message = str_replace('{{' . $index . '}}', '<b>' . htmlspecialchars($text) . '</b>', $message);
}
- Render::addTemplate('messagebox-' . $item['type'], array('message' => $message),'main');
+ Render::addTemplate('messagebox-' . $item['type'], array('message' => $message), 'main');
self::$alreadyDisplayed[] = $item;
}
self::$list = array();
- self::$flushed = true;
}
/**
diff --git a/inc/module.inc.php b/inc/module.inc.php
index 261c2990..894bc0f6 100644
--- a/inc/module.inc.php
+++ b/inc/module.inc.php
@@ -178,4 +178,9 @@ class Module
return Dictionary::getCategoryName($this->category);
}
+ public function getDir()
+ {
+ return 'modules/' . $this->name;
+ }
+
}
diff --git a/inc/property.inc.php b/inc/property.inc.php
index 0cb57f81..13e3c66d 100644
--- a/inc/property.inc.php
+++ b/inc/property.inc.php
@@ -66,6 +66,7 @@ class Property
EventLog::info('Server IP changed from ' . self::getServerIp() . ' to ' . $value . ($automatic ? ' (auto detected)' : ''));
self::set('server-ip', $value);
Event::serverIpChanged();
+ return true;
}
public static function getBootMenu()
diff --git a/inc/render.inc.php b/inc/render.inc.php
index e3a23f23..5fc5be92 100644
--- a/inc/render.inc.php
+++ b/inc/render.inc.php
@@ -18,7 +18,7 @@ class Render
private static $mustache = false;
private static $body = '';
private static $header = '';
- private static $dashboard = '';
+ private static $dashboard = false;
private static $footer = '';
private static $title = '';
private static $templateCache = array();
@@ -28,7 +28,16 @@ class Render
{
if (self::$mustache !== false)
Util::traceError('Called Render::init() twice!');
- self::$mustache = new Mustache_Engine;
+ $options = array();
+ $tmp = '/tmp/bwlp-cache';
+ $dir = is_dir($tmp);
+ if (!$dir) {
+ @mkdir($tmp, 0755, false);
+ }
+ if (($dir || is_dir($tmp)) && is_writable($tmp)) {
+ $options['cache'] = $tmp;
+ }
+ self::$mustache = new Mustache_Engine($options);
}
/**
@@ -40,7 +49,6 @@ class Render
$zip = isset($_SERVER['HTTP_ACCEPT_ENCODING']) && (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false);
if ($zip)
ob_start();
- $page = strtolower($_GET['do']);
echo
'<!DOCTYPE html>
<html>
@@ -63,7 +71,7 @@ class Render
' </head>
<body>
',
- self::$dashboard,
+ (self::$dashboard !== false ? self::parse('main-menu', self::$dashboard, 'main') : ''),
'<div class="main" id="mainpage"><div class="container-fluid">
',
self::$body
@@ -168,18 +176,20 @@ class Render
/**
* Parse template with given params and return; do not add to body
* @param string $template name of template, relative to templates/, without .html extension
+ * @param array $params tags to render into template
+ * @param string $module name of module to load template from; defaults to currently active module
* @return string Rendered template
*/
public static function parse($template, $params = false, $module = false)
{
+ if ($module === false) {
+ $module = Page::getModule()->getIdentifier();
+ }
// Load html snippet
- $html = self::getTemplate($template,$module);
+ $html = self::getTemplate($template, $module);
if ($html === false) {
return '<h3>Template ' . htmlspecialchars($template) . '</h3>' . nl2br(htmlspecialchars(print_r($params, true))) . '<hr>';
}
- if($module === false) {
- $module = Page::getModule()->getIdentifier();
- }
if (!is_array($params)) {
$params = array();
}
@@ -201,8 +211,10 @@ class Render
}
// Always add token to parameter list
$params['token'] = Session::get('token');
- // Likewise, add currently selected language (its two letter code) to params
- $params['current_lang'] = LANG;
+ if (defined('LANG')) {
+ // Likewise, add currently selected language (its two letter code) to params
+ $params['current_lang'] = LANG;
+ }
// Add desired password field type
$params['password_type'] = Property::getPasswordFieldType();
// Return rendered html
@@ -242,20 +254,18 @@ class Render
/**
* Private helper: Load the given template and return it
*/
- private static function getTemplate($template, $module = false)
+ private static function getTemplate($template, $module)
{
- if (isset(self::$templateCache[$template])) {
- return self::$templateCache[$template];
- }
- // Select current module
- if(!$module){
- $module = strtolower(empty($_REQUEST['do']) ? 'Main' : $_REQUEST['do']);
+ $id = "$template/$module";
+ if (isset(self::$templateCache[$id])) {
+ return self::$templateCache[$id];
}
// Load from disk
$data = @file_get_contents('modules/' . $module . '/templates/' . $template . '.html');
- if ($data === false)
- $data = '<b>Non-existent template ' . $template . ' requested!</b>';
- self::$templateCache[$template] = & $data;
+ if ($data === false) {
+ $data = '<b>Non-existent/unreadable template ' . $template . ' requested!</b>';
+ }
+ self::$templateCache[$id] =& $data;
return $data;
}
@@ -264,7 +274,7 @@ class Render
*/
public static function setDashboard($params)
{
- self::$dashboard = self::parse('main-menu', $params, 'main');
+ self::$dashboard = $params;
}
}
diff --git a/inc/request.inc.php b/inc/request.inc.php
index 604a2b0e..f46210af 100644
--- a/inc/request.inc.php
+++ b/inc/request.inc.php
@@ -5,11 +5,12 @@
*/
class Request
{
-
+
/**
- *
+ *
* @param string $key Key of field to get from $_GET
* @param string $default Value to return if $_GET does not contain $key
+ * @param string $type if the parameter exists, cast it to given type
* @return mixed Field from $_GET, or $default if not set
*/
public static function get($key, $default = false, $type = false)
diff --git a/inc/session.inc.php b/inc/session.inc.php
index a0f8ab4c..b4299e06 100644
--- a/inc/session.inc.php
+++ b/inc/session.inc.php
@@ -41,6 +41,7 @@ class Session
if (self::readSessionData()) return true;
// Loading session data failed
self::delete();
+ return false;
}
public static function get($key)
diff --git a/inc/taskmanagercallback.inc.php b/inc/taskmanagercallback.inc.php
index cec763fb..7d4e79f3 100644
--- a/inc/taskmanagercallback.inc.php
+++ b/inc/taskmanagercallback.inc.php
@@ -124,6 +124,10 @@ class TaskmanagerCallback
*/
public static function cbConfModCreated($task, $args)
{
+ $mod = Module::get('sysconfig');
+ if ($mod === false)
+ return;
+ $mod->activate();
if (Taskmanager::isFailed($task)) {
ConfigModule::generateFailed($task, $args);
} else {
@@ -139,6 +143,10 @@ class TaskmanagerCallback
*/
public static function cbConfTgzCreated($task, $args)
{
+ $mod = Module::get('sysconfig');
+ if ($mod === false)
+ return;
+ $mod->activate();
if (Taskmanager::isFailed($task)) {
ConfigTgz::generateFailed($task, $args);
} else {
diff --git a/inc/up_json_encode.php b/inc/up_json_encode.php
index c33cb012..0f5776c2 100644
--- a/inc/up_json_encode.php
+++ b/inc/up_json_encode.php
@@ -164,7 +164,7 @@ function up_json_encode($var, $options = 0, $_indent = "")
} elseif (is_float($var)) {
if (is_nan($var) || is_infinite($var)) {
${'.json_last_error'} = JSON_ERROR_INF_OR_NAN;
- return;
+ return false;
} else {
$json = "$var";
}
@@ -174,7 +174,7 @@ function up_json_encode($var, $options = 0, $_indent = "")
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;
+ return false;
}
#-- done
diff --git a/inc/validator.inc.php b/inc/validator.inc.php
index 6eac80f9..23debd2c 100644
--- a/inc/validator.inc.php
+++ b/inc/validator.inc.php
@@ -32,6 +32,7 @@ class Validator
default:
Util::traceError('Unknown validation method: ' . $data[0]);
}
+ return false; // make code inspector happy - doesn't know traceError doesn't return
}
/**
diff --git a/index.php b/index.php
index 8b27a9db..a6cfccf2 100644
--- a/index.php
+++ b/index.php
@@ -20,17 +20,17 @@ abstract class Page
protected function doPreprocess()
{
-
+
}
protected function doRender()
{
-
+
}
protected function doAjax()
{
-
+
}
public static function preprocess()
@@ -51,7 +51,7 @@ abstract class Page
{
self::$instance->doAjax();
}
-
+
public static function getModule()
{
return self::$module;
@@ -61,7 +61,7 @@ abstract class Page
* @var \Page
*/
private static $instance = false;
-
+
/**
* @var \Module
*/
@@ -83,9 +83,6 @@ abstract class Page
}
-// Error reporting (hopefully goind to stderr, not being printed on pages)
-error_reporting(E_ALL);
-
// Set variable if this is an ajax request
if ((isset($_REQUEST['async'])) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest')) {
define('AJAX', true);
@@ -95,15 +92,27 @@ if ((isset($_REQUEST['async'])) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
define('API', false);
// Autoload classes from ./inc which adhere to naming scheme <lowercasename>.inc.php
-function slxAutoloader($class)
-{
+spl_autoload_register(function ($class) {
$file = 'inc/' . preg_replace('/[^a-z0-9]/', '', mb_strtolower($class)) . '.inc.php';
if (!file_exists($file))
return;
require_once $file;
-}
+});
+
-spl_autoload_register('slxAutoloader');
+if (defined('CONFIG_DEBUG') && CONFIG_DEBUG) {
+ set_error_handler(function ($errno, $errstr, $errfile, $errline) {
+ global $SLX_ERRORS;
+ $SLX_ERRORS[] = array(
+ 'errno' => $errno,
+ 'errstr' => $errstr,
+ 'errfile' => $errfile,
+ 'errline' => $errline,
+ //'stack' => debug_backtrace(), // TODO
+ );
+ return false; // Return false so the default error handler will kick in after this
+ });
+}
// Now determine which module to run
Page::init();
@@ -134,16 +143,59 @@ if (AJAX) {
// Normal mode - preprocess first....
Page::preprocess();
-// Generate Main menu
-Dashboard::createMenu();
-
+// Render queued up messages at the top
Message::renderList();
// Render page. If the module wants to output anything, it will be done here...
Page::render();
+// We're still executing - generate Main menu
+Dashboard::createMenu();
+
if (defined('CONFIG_DEBUG') && CONFIG_DEBUG) {
- Message::addWarning('main.debug-mode');
+ if (empty($SLX_ERRORS)) {
+ Message::addWarning('main.debug-mode');
+ } else {
+ /**
+ * Map an error code into an Error word.
+ *
+ * @param int $code Error code to map
+ * @return array Array of error word.
+ */
+ function mapErrorCode($code)
+ {
+ switch ($code) {
+ case E_PARSE:
+ case E_ERROR:
+ case E_CORE_ERROR:
+ case E_COMPILE_ERROR:
+ case E_USER_ERROR:
+ return 'Fatal Error';
+ case E_WARNING:
+ case E_USER_WARNING:
+ case E_COMPILE_WARNING:
+ case E_RECOVERABLE_ERROR:
+ return 'Warning';
+ case E_NOTICE:
+ case E_USER_NOTICE:
+ return 'Notice';
+ case E_STRICT:
+ return 'Strict';
+ case E_DEPRECATED:
+ case E_USER_DEPRECATED:
+ return 'Deprecated';
+ default :
+ return '??Error';
+ }
+ }
+ $dir = preg_quote(dirname(__FILE__), '#');
+ foreach ($SLX_ERRORS as &$err) {
+ $err['errlevel'] = mapErrorCode($err['errno']);
+ $err['errfile'] = preg_replace('#^' . $dir . '#', '', $err['errfile']);
+ }
+ unset($err, $dir);
+ Render::addTemplate('php-errors', array('errors' => $SLX_ERRORS), 'main');
+ }
}
if (defined('CONFIG_FOOTER')) {
diff --git a/modules-available/baseconfig/lang/de/template-tags.json b/modules-available/baseconfig/lang/de/template-tags.json
index 0f4819b4..de2007d9 100644
--- a/modules-available/baseconfig/lang/de/template-tags.json
+++ b/modules-available/baseconfig/lang/de/template-tags.json
@@ -2,10 +2,8 @@
"lang_basicConfiguration": "Basiskonfiguration",
"lang_catUser": "Benutzerverwaltung",
"lang_clientRelatedConfig": "Die Optionen auf dieser Seite beziehen sich auf das Verhalten der bwLehrpool-Clients.",
- "lang_close": "Schlie\u00dfen",
"lang_create": "Schaffen",
"lang_delete": "L\u00f6schen",
- "lang_help": "Hilfe",
"lang_newUser": "Neuer Benutzer",
"lang_partitionMountPoint": "Mount Point",
"lang_reset": "Zur\u00fccksetzen",
diff --git a/modules-available/baseconfig/lang/en/template-tags.json b/modules-available/baseconfig/lang/en/template-tags.json
index 3609f6fa..369fa081 100644
--- a/modules-available/baseconfig/lang/en/template-tags.json
+++ b/modules-available/baseconfig/lang/en/template-tags.json
@@ -3,11 +3,9 @@
"lang_catPartition": "Partition Managment",
"lang_catUser": "User Managment",
"lang_clientRelatedConfig": "The options on this page are related to the bwLehrpool client machines.",
- "lang_close": "Close",
"lang_confirm": "Would you like to save the settings on [ \/srv\/openslx\/www\/boot\/config ] ?",
"lang_create": "Create",
"lang_delete": "Delete",
- "lang_help": "Help",
"lang_helpId": "Partition Id",
"lang_helpMountPoint": "Must be a directory: \/example\/directory\/",
"lang_helpOptions": "Currently, only option 'bootable' is available",
diff --git a/modules-available/baseconfig/lang/pt/template-tags.json b/modules-available/baseconfig/lang/pt/template-tags.json
index 1ab41b16..f6037d65 100644
--- a/modules-available/baseconfig/lang/pt/template-tags.json
+++ b/modules-available/baseconfig/lang/pt/template-tags.json
@@ -2,11 +2,9 @@
"lang_basicConfiguration": "Configura\u00e7\u00e3o B\u00e1sica",
"lang_catPartition": "Gerenciamento de Parti\u00e7\u00f5es",
"lang_catUser": "Gerenciamente de Usu\u00e1rios",
- "lang_close": "Fechar",
"lang_confirm": "Voc\u00ea deseja salvar configura\u00e7\u00f5es em [ \/srv\/openslx\/www\/boot\/default\/config ] ?",
"lang_create": "Criar",
"lang_delete": "Deletar",
- "lang_help": "Ajuda",
"lang_helpId": "Id da parti\u00e7\u00e3o",
"lang_helpMountPoint": "Precisa ser um diret\u00f3rio: \/exemplo\/diret\u00f3rio\/",
"lang_helpOptions": "Atualmente, apenas a op\u00e7\u00e3o 'bootable' est\u00e1 dispon\u00edvel",
diff --git a/modules-available/main/lang/de/global-tags.json b/modules-available/main/lang/de/global-tags.json
index c36347fe..39236fd4 100644
--- a/modules-available/main/lang/de/global-tags.json
+++ b/modules-available/main/lang/de/global-tags.json
@@ -1,4 +1,11 @@
{
+ "lang_back": "Zur\u00fcck",
+ "lang_cancel": "Abbrechen",
+ "lang_close": "Schlie\u00dfen",
+ "lang_delete": "L\u00f6schen",
+ "lang_hint": "Hinweis",
+ "lang_next": "Weiter",
+ "lang_save": "Speichern",
"lang_today": "Heute",
"lang_yesterday": "Gestern"
} \ No newline at end of file
diff --git a/modules-available/main/lang/de/template-tags.json b/modules-available/main/lang/de/template-tags.json
index e9b829e8..8a3120d3 100644
--- a/modules-available/main/lang/de/template-tags.json
+++ b/modules-available/main/lang/de/template-tags.json
@@ -10,7 +10,6 @@
"lang_logout": "Abmelden",
"lang_minilinuxMissing": "Wichtige Dateien der MiniLinux-Installation fehlen.",
"lang_needsSetup": "Einrichtung unvollst\u00e4ndig",
- "lang_next": "Weiter",
"lang_noExistingAccount": "Es existiert noch kein Administrator-Zugang f\u00fcr diesen Satelliten-Server.",
"lang_numerOfImagesMarkedForDeletion": "Zur L\u00f6schung markierte Abbilder",
"lang_register": "Registrieren",
diff --git a/modules-available/main/lang/en/global-tags.json b/modules-available/main/lang/en/global-tags.json
index f5fbed61..10581ae2 100644
--- a/modules-available/main/lang/en/global-tags.json
+++ b/modules-available/main/lang/en/global-tags.json
@@ -1,4 +1,11 @@
{
+ "lang_back": "Back",
+ "lang_cancel": "Cancel",
+ "lang_close": "Close",
+ "lang_delete": "Delete",
+ "lang_hint": "Hint",
+ "lang_next": "Next",
+ "lang_save": "Save",
"lang_today": "Today",
"lang_yesterday": "Yesterday"
} \ No newline at end of file
diff --git a/modules-available/main/lang/en/template-tags.json b/modules-available/main/lang/en/template-tags.json
index 3483bcfe..aeebc998 100644
--- a/modules-available/main/lang/en/template-tags.json
+++ b/modules-available/main/lang/en/template-tags.json
@@ -10,7 +10,6 @@
"lang_logout": "Logout",
"lang_minilinuxMissing": "Important files from the mini Linux installation are missing.",
"lang_needsSetup": "Setup incomplete",
- "lang_next": "Next",
"lang_noExistingAccount": "No account has been created yet. Sign up to become the administrator.",
"lang_numerOfImagesMarkedForDeletion": "Images marked for deletion",
"lang_register": "Register",
diff --git a/modules-available/main/lang/pt/global-tags.json b/modules-available/main/lang/pt/global-tags.json
new file mode 100644
index 00000000..7c1311ec
--- /dev/null
+++ b/modules-available/main/lang/pt/global-tags.json
@@ -0,0 +1,4 @@
+{
+ "lang_close": "Fechar",
+ "lang_next": "Pr\u00f3ximo"
+} \ No newline at end of file
diff --git a/modules-available/main/lang/pt/template-tags.json b/modules-available/main/lang/pt/template-tags.json
index d9acf58b..79e0184e 100644
--- a/modules-available/main/lang/pt/template-tags.json
+++ b/modules-available/main/lang/pt/template-tags.json
@@ -5,7 +5,6 @@
"lang_login": "Entrar",
"lang_logout": "Sair",
"lang_needsSetup": "Instala\u00e7\u00e3o incompleta",
- "lang_next": "Pr\u00f3ximo",
"lang_noExistingAccount": "Nenhuma conta foi criada ainda. Registre-se para se tornar administrador.",
"lang_register": "Registrar",
"lang_translations": "Tradu\u00e7\u00f5es",
diff --git a/modules-available/main/templates/php-errors.html b/modules-available/main/templates/php-errors.html
new file mode 100644
index 00000000..a9932039
--- /dev/null
+++ b/modules-available/main/templates/php-errors.html
@@ -0,0 +1,12 @@
+<div class="alert alert-warning">
+ <div class="slx-bold">
+ <span class="glyphicon glyphicon-warning" aria-hidden="true"></span>
+ {{lang_warningDebug}}
+ </div>
+ <hr>
+ {{#errors}}
+ <div>
+ <b>{{errlevel}}</b>: {{errstr}}&ensp;–&ensp;{{errfile}}&thinsp;:&thinsp;{{errline}}
+ </div>
+ {{/errors}}
+</div>
diff --git a/modules-available/sysconfig/addmodule.inc.php b/modules-available/sysconfig/addmodule.inc.php
index 913a37c1..30ca1d2c 100644
--- a/modules-available/sysconfig/addmodule.inc.php
+++ b/modules-available/sysconfig/addmodule.inc.php
@@ -100,8 +100,9 @@ abstract class AddModule_Base
if (self::$instance === false) {
Util::traceError('No step instance yet');
}
- if (self::$instance->edit !== false)
+ if (self::$instance->edit !== false) {
Message::addInfo('replacing-module', self::$instance->edit->title());
+ }
self::$instance->renderInternal();
}
diff --git a/modules-available/sysconfig/addmodule_adauth.inc.php b/modules-available/sysconfig/addmodule_adauth.inc.php
index cb7bfb4e..1e76f108 100644
--- a/modules-available/sysconfig/addmodule_adauth.inc.php
+++ b/modules-available/sysconfig/addmodule_adauth.inc.php
@@ -25,7 +25,7 @@ class AdAuth_Start extends AddModule_Base
$data['server'] = $out[1];
}
$data['step'] = 'AdAuth_CheckConnection';
- Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad-start', $data);
+ Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad-start', $data);
}
}
@@ -88,7 +88,7 @@ class AdAuth_CheckConnection extends AddModule_Base
} else {
$data['next'] = 'AdAuth_CheckCredentials';
}
- Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad_ldap-checkconnection', $data);
+ Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad_ldap-checkconnection', $data);
}
}
@@ -165,7 +165,7 @@ class AdAuth_SelfSearch extends AddModule_Base
} else {
$data['next'] = 'AdAuth_CheckCredentials';
}
- Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad-selfsearch',
+ Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad-selfsearch',
array_merge($this->taskIds, $data));
}
@@ -218,7 +218,7 @@ class AdAuth_HomeAttrCheck extends AddModule_Base
protected function renderInternal()
{
- Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad-selfsearch', array_merge($this->taskIds, array(
+ Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad-selfsearch', array_merge($this->taskIds, array(
'edit' => Request::post('edit'),
'title' => Request::post('title'),
'server' => Request::post('server'),
@@ -289,7 +289,7 @@ class AdAuth_CheckCredentials extends AddModule_Base
protected function renderInternal()
{
- Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad_ldap-checkcredentials', array_merge($this->taskIds, array(
+ Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad_ldap-checkcredentials', array_merge($this->taskIds, array(
'edit' => Request::post('edit'),
'title' => Request::post('title'),
'server' => Request::post('server') . ':' . Request::post('port'),
@@ -407,7 +407,7 @@ class AdAuth_Finish extends AddModule_Base
protected function renderInternal()
{
- Render::addDialog(Dictionary::translate('config-module', 'adAuth_title'), false, 'ad-finish', $this->taskIds);
+ Render::addDialog(Dictionary::translateFile('config-module', 'adAuth_title'), false, 'ad-finish', $this->taskIds);
}
}
diff --git a/inc/configmodule.inc.php b/modules-available/sysconfig/inc/configmodule.inc.php
index 909136ee..7b92ff89 100644
--- a/inc/configmodule.inc.php
+++ b/modules-available/sysconfig/inc/configmodule.inc.php
@@ -28,7 +28,7 @@ abstract class ConfigModule
if (self::$moduleTypes !== false)
return;
self::$moduleTypes = array();
- foreach (glob('inc/configmodule/*.inc.php') as $file) {
+ foreach (glob(dirname(__FILE__) . '/configmodule/*.inc.php', GLOB_NOSORT) as $file) {
require_once $file;
}
}
diff --git a/inc/configmodule/adauth.inc.php b/modules-available/sysconfig/inc/configmodule/adauth.inc.php
index efc8afd7..a03be43c 100644
--- a/inc/configmodule/adauth.inc.php
+++ b/modules-available/sysconfig/inc/configmodule/adauth.inc.php
@@ -1,16 +1,17 @@
<?php
ConfigModule::registerModule(
- 'AdAuth', // ID
- Dictionary::translate('config-module', 'adAuth_title'), // Title
- Dictionary::translate('config-module', 'adAuth_description'), // Description
- Dictionary::translate('config-module', 'group_authentication'), // Group
+ ConfigModule_AdAuth::MODID, // ID
+ Dictionary::translateFile('config-module', 'adAuth_title'), // Title
+ Dictionary::translateFile('config-module', 'adAuth_description'), // Description
+ Dictionary::translateFile('config-module', 'group_authentication'), // Group
true // Only one per config?
);
class ConfigModule_AdAuth extends ConfigModule
{
+ const MODID = 'AdAuth';
const VERSION = 1;
private static $REQUIRED_FIELDS = array('server', 'searchbase', 'binddn');
diff --git a/inc/configmodule/branding.inc.php b/modules-available/sysconfig/inc/configmodule/branding.inc.php
index b2f28c2f..479b406c 100644
--- a/inc/configmodule/branding.inc.php
+++ b/modules-available/sysconfig/inc/configmodule/branding.inc.php
@@ -2,9 +2,9 @@
ConfigModule::registerModule(
ConfigModule_Branding::MODID, // ID
- Dictionary::translate('config-module', 'branding_title'), // Title
- Dictionary::translate('config-module', 'branding_description'), // Description
- Dictionary::translate('config-module', 'group_branding'), // Group
+ Dictionary::translateFile('config-module', 'branding_title'), // Title
+ Dictionary::translateFile('config-module', 'branding_description'), // Description
+ Dictionary::translateFile('config-module', 'group_branding'), // Group
true // Only one per config?
);
@@ -45,6 +45,7 @@ class ConfigModule_Branding extends ConfigModule
if ($key !== 'tmpFile' || !is_string($value) || !file_exists($value))
return false;
$this->tmpFile = $value;
+ return true;
}
public function getData($key)
diff --git a/inc/configmodule/customodule.inc.php b/modules-available/sysconfig/inc/configmodule/customodule.inc.php
index 31796e9c..09b621cc 100644
--- a/inc/configmodule/customodule.inc.php
+++ b/modules-available/sysconfig/inc/configmodule/customodule.inc.php
@@ -2,9 +2,9 @@
ConfigModule::registerModule(
ConfigModule_CustomModule::MODID, // ID
- Dictionary::translate('config-module', 'custom_title'), // Title
- Dictionary::translate('config-module', 'custom_description'), // Description
- Dictionary::translate('config-module', 'group_generic'), // Group
+ Dictionary::translateFile('config-module', 'custom_title'), // Title
+ Dictionary::translateFile('config-module', 'custom_description'), // Description
+ Dictionary::translateFile('config-module', 'group_generic'), // Group
false, // Only one per config?
100 // Sort order
);
@@ -45,6 +45,7 @@ class ConfigModule_CustomModule extends ConfigModule
if ($key !== 'tmpFile' || !file_exists($value))
return false;
$this->tmpFile = $value;
+ return true;
}
public function getData($key)
diff --git a/inc/configmodule/ldapauth.inc.php b/modules-available/sysconfig/inc/configmodule/ldapauth.inc.php
index 67b1997a..0f386033 100644
--- a/inc/configmodule/ldapauth.inc.php
+++ b/modules-available/sysconfig/inc/configmodule/ldapauth.inc.php
@@ -1,16 +1,17 @@
<?php
ConfigModule::registerModule(
- 'LdapAuth', // ID
- Dictionary::translate('config-module', 'ldapAuth_title'), // Title
- Dictionary::translate('config-module', 'ldapAuth_description'), // Description
- Dictionary::translate('config-module', 'group_authentication'), // Group
+ ConfigModule_LdapAuth::MODID, // ID
+ Dictionary::translateFile('config-module', 'ldapAuth_title'), // Title
+ Dictionary::translateFile('config-module', 'ldapAuth_description'), // Description
+ Dictionary::translateFile('config-module', 'group_authentication'), // Group
true // Only one per config?
);
class ConfigModule_LdapAuth extends ConfigModule
{
+ const MODID = 'LdapAuth';
const VERSION = 1;
private static $REQUIRED_FIELDS = array('server', 'searchbase');
diff --git a/inc/configmodule/sshconfig.inc.php b/modules-available/sysconfig/inc/configmodule/sshconfig.inc.php
index 853acf6a..b1d58153 100644
--- a/inc/configmodule/sshconfig.inc.php
+++ b/modules-available/sysconfig/inc/configmodule/sshconfig.inc.php
@@ -2,9 +2,9 @@
ConfigModule::registerModule(
ConfigModule_SshConfig::MODID, // ID
- Dictionary::translate('config-module', 'sshconfig_title'), // Title
- Dictionary::translate('config-module', 'sshconfig_description'), // Description
- Dictionary::translate('config-module', 'group_sshconfig'), // Group
+ Dictionary::translateFile('config-module', 'sshconfig_title'), // Title
+ Dictionary::translateFile('config-module', 'sshconfig_description'), // Description
+ Dictionary::translateFile('config-module', 'group_sshconfig'), // Group
true // Only one per config?
);
diff --git a/inc/configtgz.inc.php b/modules-available/sysconfig/inc/configtgz.inc.php
index b51d2787..b51d2787 100644
--- a/inc/configtgz.inc.php
+++ b/modules-available/sysconfig/inc/configtgz.inc.php
diff --git a/lang/de/config-module.json b/modules-available/sysconfig/lang/de/config-module.json
index 4e178b65..4e178b65 100644
--- a/lang/de/config-module.json
+++ b/modules-available/sysconfig/lang/de/config-module.json
diff --git a/lang/en/config-module.json b/modules-available/sysconfig/lang/en/config-module.json
index efe6f697..efe6f697 100644
--- a/lang/en/config-module.json
+++ b/modules-available/sysconfig/lang/en/config-module.json
diff --git a/lang/pt/config-module.json b/modules-available/sysconfig/lang/pt/config-module.json
index c44dc44f..c44dc44f 100644
--- a/lang/pt/config-module.json
+++ b/modules-available/sysconfig/lang/pt/config-module.json
diff --git a/modules-available/sysconfig/page.inc.php b/modules-available/sysconfig/page.inc.php
index d4fe4a37..3f14a95d 100644
--- a/modules-available/sysconfig/page.inc.php
+++ b/modules-available/sysconfig/page.inc.php
@@ -54,8 +54,8 @@ class Page_SysConfig extends Page
$action = Request::any('action', 'list');
// Load all addmodule classes, as they populate the $moduleTypes array
- require_once 'modules/sysconfig/addmodule.inc.php';
- foreach (glob('modules/sysconfig/addmodule_*.inc.php') as $file) {
+ require_once Page::getModule()->getDir() . '/addmodule.inc.php';
+ foreach (glob(Page::getModule()->getDir() . '/addmodule_*.inc.php') as $file) {
require_once $file;
}
@@ -375,10 +375,10 @@ class Page_SysConfig extends Page
private function initAddModule()
{
ConfigModule::loadDb();
- require_once 'modules/sysconfig/addmodule.inc.php';
- $step = Request::any('step', 'AddModule_Start');
+ require_once Page::getModule()->getDir() . '/addmodule.inc.php';
+ $step = Request::any('step', 'AddModule_Start', 'string');
if (!class_exists($step) && preg_match('/^([a-zA-Z0-9]+)_/', $step, $out)) {
- require_once 'modules/sysconfig/addmodule_' . strtolower($out[1]) . '.inc.php';
+ require_once Page::getModule()->getDir() . '/addmodule_' . strtolower($out[1]) . '.inc.php';
}
AddModule_Base::setStep($step);
}
@@ -386,7 +386,7 @@ class Page_SysConfig extends Page
private function initAddConfig()
{
ConfigModule::loadDb();
- require_once 'modules/sysconfig/addconfig.inc.php';
+ require_once Page::getModule()->getDir() . '/addconfig.inc.php';
$step = Request::any('step', 0);
if ($step === 0)
$step = 'AddConfig_Start';
diff --git a/modules-available/translation/lang/de/template-tags.json b/modules-available/translation/lang/de/template-tags.json
index 9b4da6bd..83871e46 100644
--- a/modules-available/translation/lang/de/template-tags.json
+++ b/modules-available/translation/lang/de/template-tags.json
@@ -1,8 +1,6 @@
{
"lang_adminInfo": "Dies ist eine Liste aller Templates. Die \"Status\"-Spalte zeigt an, wenn f\u00fcr ein Template \u00fcbersetzungen fehlen, oder veraltete Tags definiert sind.",
- "lang_back": "Zur\u00fcck",
"lang_createTag": "Tag erstellen",
- "lang_deleteTAG": "L\u00f6schen",
"lang_editConfigModule": "Konfigurationsmodulbezeichnungsphrasen editieren",
"lang_editHardcoded": "Hardcoded-Texte bearbeiten",
"lang_editMessages": "Nachrichten bearbeiten",
@@ -11,7 +9,6 @@
"lang_editTemplates": "Template-Texte bearbeiten",
"lang_global": "Global",
"lang_globalTooltip": "Dieser Tag ist global verf\u00fcgbar und braucht normalerweise nicht explizit f\u00fcr dieses Modul \u00fcbersetzt zu werden",
- "lang_hint": "Hinweis",
"lang_langAdministration": "Templates",
"lang_mainHeading": "\u00dcbersetzungen verwalten",
"lang_messages": "Benachrichtigungen",
@@ -19,7 +16,6 @@
"lang_module": "Modul",
"lang_otherStrings": "Andere Texte",
"lang_sample": "Beispiel",
- "lang_save": "Speichern",
"lang_status": "Status",
"lang_tag": "Tag",
"lang_tags": "Tags",
@@ -29,5 +25,5 @@
"lang_translation": "\u00dcbersetzung",
"lang_translationHeading": "Verwalten der \u00dcbersetzungen",
"lang_unused": "Ungenutzt",
- "lang_unusedUnreliableHint": "Die Erkennung von ungenutzten Tags bezieht nur aktivierte Module mit ein. Es k\u00f6nnte sein, dass ein ungenutzt gemeldeter Tag in einem nicht aktivierten Modul verwendet wird."
+ "lang_unusedUnreliableHint": "Die Erkennung ungenutzter Tags bezieht nur aktivierte Module mit ein. Es k\u00f6nnte sein, dass ein ungenutzt gemeldeter Tag in einem nicht aktivierten Modul verwendet wird."
} \ No newline at end of file
diff --git a/modules-available/translation/lang/en/template-tags.json b/modules-available/translation/lang/en/template-tags.json
index 1b5e6dc8..75564bc3 100644
--- a/modules-available/translation/lang/en/template-tags.json
+++ b/modules-available/translation/lang/en/template-tags.json
@@ -1,8 +1,6 @@
{
"lang_adminInfo": "This is a list of all templates. The \"status\"-column tells if there are translations missing, or unused tags are defined.",
- "lang_back": "Back",
"lang_createTag": "Create TAG",
- "lang_deleteTAG": "Delete",
"lang_editConfigModule": "Edit config module strings",
"lang_editHardcoded": "Edit hardcoded strings",
"lang_editMessages": "Edit Messages",
@@ -11,7 +9,6 @@
"lang_editTemplates": "Edit template strings",
"lang_global": "Global",
"lang_globalTooltip": "This tag is global; usually there is no need to translate it explicitly for this module",
- "lang_hint": "Notice",
"lang_langAdministration": "Templates",
"lang_mainHeading": "Translation management",
"lang_messages": "Messages",
@@ -19,7 +16,6 @@
"lang_module": "Module",
"lang_otherStrings": "Other strings",
"lang_sample": "Sample",
- "lang_save": "Save",
"lang_status": "Status",
"lang_tag": "Tag",
"lang_tags": "Tags",
@@ -27,6 +23,7 @@
"lang_templateHint": "Hint: Yellow lines indicate a translation is missing and red lines indicate a tag is not being used by the template.",
"lang_templates": "Templates",
"lang_translation": "Translation",
+ "lang_translationHeading": "Manage translations",
"lang_unused": "Unused",
"lang_unusedUnreliableHint": "Detection of unused tags only includes currently activated modules. It's possible that a tag marked \"unused\" is actually refered to in a module not activated."
} \ No newline at end of file
diff --git a/modules-available/translation/page.inc.php b/modules-available/translation/page.inc.php
index f3474acd..1fc3a0fe 100644
--- a/modules-available/translation/page.inc.php
+++ b/modules-available/translation/page.inc.php
@@ -205,6 +205,7 @@ class Page_Translation extends Page
'module' => $this->module->getIdentifier(),
'moduleName' => $this->module->getDisplayName()
));
+ Render::openTag('div', array('class' => 'row'));
// Templates
$this->showModuleTemplates();
// Messages
@@ -213,6 +214,7 @@ class Page_Translation extends Page
$this->showModuleStrings();
// Module specific
$this->showModuleCustom();
+ Render::closeTag('div');
}
private function showModuleTemplates()
@@ -403,8 +405,13 @@ class Page_Translation extends Page
if ($module === false) {
$module = $this->module;
}
+ $allFiles = $this->getAllFiles('modules', '.php');
+ if ($module->getIdentifier() === 'main') {
+ $allFiles = array_merge($allFiles, $this->getAllFiles('apis', '.php'), $this->getAllFiles('inc', '.php'));
+ $allFiles[] = 'index.php';
+ }
$tags = $this->loadTagsFromPhp('/Message\s*::\s*add\w+\s*\(\s*[\'"](?<module>[^\'"\.]*)\.(?<tag>[^\'"]*)[\'"]\s*(?<data>\)|\,.*)/i',
- $this->getAllFiles('modules', '.php'));
+ $allFiles);
// Filter out tags that don't refer to this module
foreach (array_keys($tags) as $tag) {
// Figure out if this is a message from this module or not
@@ -869,6 +876,7 @@ class Page_Translation extends Page
}
Message::addError('invalid-section', $this->section);
$this->redirect(1);
+ return false;
}
/**
@@ -878,7 +886,7 @@ class Page_Translation extends Page
{
$this->ensureValidDestLanguage();
if ($this->module === false) {
- Message::addError('main.no-module-given');
+ Message::addError('no-module-given');
$this->redirect();
}
$file = $this->getJsonFile();
@@ -906,7 +914,7 @@ class Page_Translation extends Page
$translation = Request::post('new-text', array(), 'array');
foreach (Request::post('new-id', array(), 'array') as $k => $tag) {
- if (empty($translation[$k]))
+ if (empty($translation[$k]) || empty($tag))
continue;
$data[(string)$tag] = (string)$translation[$k];
}
diff --git a/modules-available/translation/templates/custom-list.html b/modules-available/translation/templates/custom-list.html
index 42ee98ad..ee9463f0 100644
--- a/modules-available/translation/templates/custom-list.html
+++ b/modules-available/translation/templates/custom-list.html
@@ -1,21 +1,23 @@
-<div class="panel panel-default">
- <div class="panel-heading">
- {{subsection}}
- </div>
- <div class="panel-body">
- <div class="row">
- <div class="col-sm-6">
- {{#langs}}
- <a href="?do=Translation&amp;module={{module}}&amp;section=custom&amp;subsection={{subsection}}&amp;destlang={{cc}}">{{name}} &raquo;</a>
- <ul>
- <li>{{lang_missing}}: {{missing}}</li>
- <li>{{lang_unused}}: {{unused}}</li>
- </ul>
- {{/langs}}
- </div>
- <div class="col-sm-6">
- {{lang_tags}}: {{tagcount}}
+<div class="col-lg-6">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ {{subsection}}
+ </div>
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-6">
+ {{#langs}}
+ <a href="?do=Translation&amp;module={{module}}&amp;section=custom&amp;subsection={{subsection}}&amp;destlang={{cc}}">{{name}} &raquo;</a>
+ <ul>
+ <li>{{lang_missing}}: {{missing}}</li>
+ <li>{{lang_unused}}: {{unused}}</li>
+ </ul>
+ {{/langs}}
+ </div>
+ <div class="col-sm-6">
+ {{lang_tags}}: {{tagcount}}
+ </div>
</div>
</div>
</div>
-</div>
+</div> \ No newline at end of file
diff --git a/modules-available/translation/templates/edit.html b/modules-available/translation/templates/edit.html
index af176c03..082e2cb5 100644
--- a/modules-available/translation/templates/edit.html
+++ b/modules-available/translation/templates/edit.html
@@ -14,7 +14,7 @@
<input type="hidden" name="subsection" value="{{subsection}}">
<input type="hidden" name="token" value="{{token}}">
<a class="btn btn-primary" href='?do=Translation' >{{lang_back}}</a>
- <button class="btn btn-primary" type="button" onclick="addTag()" >{{lang_createTag}}</button>
+ <button class="btn btn-primary" type="button" onclick="slxAddTag()" >{{lang_createTag}}</button>
<button type="submit" class="btn btn-primary" name="update" value="true">{{lang_save}}</button>
<div class="row">
<div class="col-xs-4 col-sm-3">{{lang_tag}}</div>
@@ -54,7 +54,7 @@
<div class="col-xs-2 col-sm-2 col-lg-1">
<button type="button" class="btn btn-danger btn-xs" onclick="slxDelTag({{tagid}})" tabindex="-1">
<span class="glyphicon glyphicon-remove"></span>
- <span class="hidden-xs">{{lang_deleteTAG}}</span>
+ <span class="hidden-xs">{{lang_delete}}</span>
</button>
</div>
</div>
@@ -81,7 +81,7 @@
' <div class="hidden-xs col-sm-4">' +
' </div>' +
' <div class="col-xs-2 col-sm-1">' +
- ' <button type="button" class="btn btn-danger btn-xs" onclick="slxDelNew(' + slxNewTagCounter + ')"><span class="glyphicon glyphicon-remove"></span> {{lang_deleteTAG}}</button>' +
+ ' <button type="button" class="btn btn-danger btn-xs" onclick="slxDelNew(' + slxNewTagCounter + ')" tabindex="-1"><span class="glyphicon glyphicon-remove"></span> {{lang_delete}}</button>' +
' </div>' +
'</div>'
);
diff --git a/modules-available/translation/templates/message-list.html b/modules-available/translation/templates/message-list.html
index 06cb4964..7e611a05 100644
--- a/modules-available/translation/templates/message-list.html
+++ b/modules-available/translation/templates/message-list.html
@@ -1,30 +1,32 @@
-<div class="panel panel-default">
- <div class="panel-heading">
- {{lang_messages}}
- </div>
- <div class="panel-body">
- <div class="row">
- <div class="col-sm-6">
- {{#langs}}
- <a href="?do=Translation&amp;module={{module}}&amp;section=messages&amp;destlang={{cc}}">{{name}} &raquo;</a>
- <ul>
- <li>{{lang_missing}}: {{missing}}</li>
- <li>{{lang_unused}}: {{unused}}</li>
- </ul>
- {{/langs}}
- </div>
- <div class="col-sm-6">
- <div>{{lang_messages}}: {{messagecount}}</div>
- <ul>
- {{#files}}
- <li>{{file}}</li>
- {{/files}}
- </ul>
- <div>
- <span class="label label-info">{{lang_hint}}</span>
- {{lang_unusedUnreliableHint}}
+<div class="col-lg-6">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ {{lang_messages}}
+ </div>
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-6">
+ {{#langs}}
+ <a href="?do=Translation&amp;module={{module}}&amp;section=messages&amp;destlang={{cc}}">{{name}} &raquo;</a>
+ <ul>
+ <li>{{lang_missing}}: {{missing}}</li>
+ <li>{{lang_unused}}: {{unused}}</li>
+ </ul>
+ {{/langs}}
</div>
+ <div class="col-sm-6 slx-textpreview-200">
+ <div>{{lang_messages}}: {{messagecount}}</div>
+ <ul>
+ {{#files}}
+ <li>{{file}}</li>
+ {{/files}}
+ </ul>
+ </div>
+ </div>
+ <div>
+ <span class="label label-info">{{lang_hint}}</span>
+ {{lang_unusedUnreliableHint}}
</div>
</div>
</div>
-</div>
+</div> \ No newline at end of file
diff --git a/modules-available/translation/templates/string-list.html b/modules-available/translation/templates/string-list.html
index f1301494..064e0ccf 100644
--- a/modules-available/translation/templates/string-list.html
+++ b/modules-available/translation/templates/string-list.html
@@ -1,21 +1,23 @@
-<div class="panel panel-default">
- <div class="panel-heading">
- {{lang_otherStrings}}
- </div>
- <div class="panel-body">
- <div class="row">
- <div class="col-sm-6">
- {{#langs}}
- <a href="?do=Translation&amp;module={{module}}&amp;section=module&amp;destlang={{cc}}">{{name}} &raquo;</a>
- <ul>
- <li>{{lang_missing}}: {{missing}}</li>
- <li>{{lang_unused}}: {{unused}}</li>
- </ul>
- {{/langs}}
- </div>
- <div class="col-sm-6">
- {{lang_tags}}: {{tagcount}}
+<div class="col-lg-6">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ {{lang_otherStrings}}
+ </div>
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-6">
+ {{#langs}}
+ <a href="?do=Translation&amp;module={{module}}&amp;section=module&amp;destlang={{cc}}">{{name}} &raquo;</a>
+ <ul>
+ <li>{{lang_missing}}: {{missing}}</li>
+ <li>{{lang_unused}}: {{unused}}</li>
+ </ul>
+ {{/langs}}
+ </div>
+ <div class="col-sm-6">
+ {{lang_tags}}: {{tagcount}}
+ </div>
</div>
</div>
</div>
-</div>
+</div> \ No newline at end of file
diff --git a/modules-available/translation/templates/template-list.html b/modules-available/translation/templates/template-list.html
index 5d3689ad..2de7c2f8 100644
--- a/modules-available/translation/templates/template-list.html
+++ b/modules-available/translation/templates/template-list.html
@@ -1,26 +1,28 @@
-<div class="panel panel-default">
- <div class="panel-heading">
- {{lang_templates}}
- </div>
- <div class="panel-body">
- <div class="row">
- <div class="col-sm-6">
- {{#langs}}
- <a href="?do=Translation&amp;module={{module}}&amp;section=template&amp;destlang={{cc}}">{{name}} &raquo;</a>
- <ul>
- <li>{{lang_missing}}: {{missing}}</li>
- <li>{{lang_unused}}: {{unused}}</li>
- </ul>
- {{/langs}}
- </div>
- <div class="col-sm-6">
- {{lang_tags}}: {{tagcount}}
- <ul>
- {{#templates}}
- <li>{{template}}</li>
- {{/templates}}
- </ul>
+<div class="col-lg-6">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ {{lang_templates}}
+ </div>
+ <div class="panel-body">
+ <div class="row">
+ <div class="col-sm-6">
+ {{#langs}}
+ <a href="?do=Translation&amp;module={{module}}&amp;section=template&amp;destlang={{cc}}">{{name}} &raquo;</a>
+ <ul>
+ <li>{{lang_missing}}: {{missing}}</li>
+ <li>{{lang_unused}}: {{unused}}</li>
+ </ul>
+ {{/langs}}
+ </div>
+ <div class="col-sm-6">
+ {{lang_tags}}: {{tagcount}}
+ <ul>
+ {{#templates}}
+ <li>{{template}}</li>
+ {{/templates}}
+ </ul>
+ </div>
</div>
</div>
</div>
-</div>
+</div> \ No newline at end of file
diff --git a/modules-available/usermanagement/lang/de/module.json b/modules-available/usermanagement/lang/de/module.json
new file mode 100644
index 00000000..49d72a69
--- /dev/null
+++ b/modules-available/usermanagement/lang/de/module.json
@@ -0,0 +1,3 @@
+{
+ "module_name": "Benutzerverwaltung"
+} \ No newline at end of file
diff --git a/style/default.css b/style/default.css
index 12c67918..74997381 100644
--- a/style/default.css
+++ b/style/default.css
@@ -257,12 +257,16 @@ input[readonly] {
margin: 3px;
}
-.slx-textpreview {
+.slx-textpreview, .slx-textpreview-200 {
max-height: 60px;
overflow-y: auto;
overflow-x: hidden;
}
+.slx-textpreview-200 {
+ max-height: 200px;
+}
+
/*
* Sidebar
*/