#include "zm.h"
#include "zm_db.h"
#include "zm_zone.h"
#include "zm_image.h"
#include "zm_monitor.h"
+
void Zone::Setup(
Monitor *p_monitor,
int p_id,
diff --git a/src/zma.cpp b/src/zma.cpp
index 83035f011..33dedbe54 100644
--- a/src/zma.cpp
+++ b/src/zma.cpp
@@ -83,7 +83,7 @@ int main( int argc, char *argv[] ) {
while (1) {
int option_index = 0;
- int c = getopt_long (argc, argv, "m:h:v", long_options, &option_index);
+ int c = getopt_long(argc, argv, "m:h:v", long_options, &option_index);
if ( c == -1 ) {
break;
}
@@ -144,7 +144,7 @@ int main( int argc, char *argv[] ) {
unsigned int analysis_update_delay = monitor->GetAnalysisUpdateDelay();
time_t last_analysis_update_time, cur_time;
monitor->UpdateAdaptiveSkip();
- last_analysis_update_time = time( 0 );
+ last_analysis_update_time = time(0);
while( (!zm_terminate) && monitor->ShmValid() ) {
// Process the next image
@@ -181,5 +181,5 @@ int main( int argc, char *argv[] ) {
Image::Deinitialise();
logTerm();
zmDbClose();
- return( 0 );
+ return 0;
}
diff --git a/src/zmc.cpp b/src/zmc.cpp
index 543a67135..dbe317731 100644
--- a/src/zmc.cpp
+++ b/src/zmc.cpp
@@ -386,5 +386,5 @@ int main(int argc, char *argv[]) {
logTerm();
zmDbClose();
- return result;
+ return zm_terminate ? 0 : result;
}
diff --git a/src/zms.cpp b/src/zms.cpp
index e8d20f72f..74dab2ed9 100644
--- a/src/zms.cpp
+++ b/src/zms.cpp
@@ -46,7 +46,7 @@ bool ValidateAccess( User *user, int mon_id ) {
user->Id(), user->getUsername(), mon_id );
exit( -1 );
}
- return( allowed );
+ return allowed;
}
int main( int argc, const char *argv[] ) {
@@ -74,45 +74,44 @@ int main( int argc, const char *argv[] ) {
unsigned int playback_buffer = 0;
bool nph = false;
- const char *basename = strrchr( argv[0], '/' );
- if (basename) //if we found a / lets skip past it
+ const char *basename = strrchr(argv[0], '/');
+ if ( basename ) //if we found a / lets skip past it
basename++;
else //argv[0] will not always contain the full path, but rather just the script name
basename = argv[0];
const char *nph_prefix = "nph-";
- if ( basename && !strncmp( basename, nph_prefix, strlen(nph_prefix) ) ) {
+ if ( basename && !strncmp(basename, nph_prefix, strlen(nph_prefix)) ) {
nph = true;
}
zmLoadConfig();
-
- const char *query = getenv( "QUERY_STRING" );
+ const char *query = getenv("QUERY_STRING");
if ( query ) {
- Debug( 1, "Query: %s", query );
+ Debug(1, "Query: %s", query);
char temp_query[1024];
- strncpy( temp_query, query, sizeof(temp_query) );
+ strncpy(temp_query, query, sizeof(temp_query));
char *q_ptr = temp_query;
char *parms[16]; // Shouldn't be more than this
int parm_no = 0;
- while( (parm_no < 16) && (parms[parm_no] = strtok( q_ptr, "&" )) ) {
+ while( (parm_no < 16) && (parms[parm_no] = strtok(q_ptr, "&")) ) {
parm_no++;
q_ptr = NULL;
}
for ( int p = 0; p < parm_no; p++ ) {
- char *name = strtok( parms[p], "=" );
- char *value = strtok( NULL, "=" );
+ char *name = strtok(parms[p], "=");
+ char *value = strtok(NULL, "=");
if ( !value )
value = (char *)"";
- if ( !strcmp( name, "source" ) ) {
- source = !strcmp( value, "event" )?ZMS_EVENT:ZMS_MONITOR;
- } else if ( !strcmp( name, "mode" ) ) {
- mode = !strcmp( value, "jpeg" )?ZMS_JPEG:ZMS_MPEG;
- mode = !strcmp( value, "raw" )?ZMS_RAW:mode;
- mode = !strcmp( value, "zip" )?ZMS_ZIP:mode;
- mode = !strcmp( value, "single" )?ZMS_SINGLE:mode;
+ if ( !strcmp(name, "source") ) {
+ source = !strcmp(value, "event")?ZMS_EVENT:ZMS_MONITOR;
+ } else if ( !strcmp(name, "mode") ) {
+ mode = !strcmp(value, "jpeg")?ZMS_JPEG:ZMS_MPEG;
+ mode = !strcmp(value, "raw")?ZMS_RAW:mode;
+ mode = !strcmp(value, "zip")?ZMS_ZIP:mode;
+ mode = !strcmp(value, "single")?ZMS_SINGLE:mode;
} else if ( !strcmp( name, "format" ) ) {
strncpy( format, value, sizeof(format) );
} else if ( !strcmp( name, "monitor" ) ) {
@@ -182,32 +181,32 @@ int main( int argc, const char *argv[] ) {
if ( config.opt_use_auth ) {
User *user = 0;
- if ( strcmp( config.auth_relay, "none" ) == 0 ) {
+ if ( strcmp(config.auth_relay, "none") == 0 ) {
if ( username.length() ) {
- user = zmLoadUser( username.c_str() );
+ user = zmLoadUser(username.c_str());
}
} else {
//if ( strcmp( config.auth_relay, "hashed" ) == 0 )
{
if ( *auth ) {
- user = zmLoadAuthUser( auth, config.auth_hash_ips );
+ user = zmLoadAuthUser(auth, config.auth_hash_ips);
}
}
//else if ( strcmp( config.auth_relay, "plain" ) == 0 )
{
if ( username.length() && password.length() ) {
- user = zmLoadUser( username.c_str(), password.c_str() );
+ user = zmLoadUser(username.c_str(), password.c_str());
}
}
}
if ( !user ) {
- Error( "Unable to authenticate user" );
+ Error("Unable to authenticate user");
logTerm();
zmDbClose();
- return( -1 );
+ return -1;
}
- ValidateAccess( user, monitor_id );
- }
+ ValidateAccess(user, monitor_id);
+ } // end if config.opt_use_auth
hwcaps_detect();
zmSetDefaultTermHandler();
diff --git a/utils/packpack/startpackpack.sh b/utils/packpack/startpackpack.sh
index 3794e4645..3ed227a44 100755
--- a/utils/packpack/startpackpack.sh
+++ b/utils/packpack/startpackpack.sh
@@ -257,11 +257,14 @@ execpackpack () {
fi
if [ "${TRAVIS}" == "true" ]; then
- utils/packpack/heartbeat.sh &
- mypid=$!
- packpack/packpack $parms > buildlog.txt 2>&1
- kill $mypid
- tail -n 3000 buildlog.txt | grep -v ONVIF
+ # Travis will fail the build if the output gets too long
+ # To mitigate that, use grep to filter out some of the noise
+ if [ "${ARCH}" != "armhf" ]; then
+ packpack/packpack $parms | grep -Ev '^(-- Installing:|-- Up-to-date:|Skip blib|Manifying|Installing /build|cp lib|writing output...|copying images...|reading sources...|[Working])'
+ else
+ # Travis never ceases to amaze. For the case of arm emulation, Travis fails the build due to too little output over a 10 minute period. Facepalm.
+ packpack/packpack $parms | grep -Ev '^(-- Installing:|Skip blib|Manifying|Installing /build|cp lib|writing output...|copying images...|reading sources...|[Working])'
+ fi
else
packpack/packpack $parms
fi
diff --git a/utils/zmeditconfigdata.sh b/utils/zmeditconfigdata.sh
index c95569f34..32b000730 100755
--- a/utils/zmeditconfigdata.sh
+++ b/utils/zmeditconfigdata.sh
@@ -82,7 +82,7 @@ fi
# Don't stare too closely. You will burn your eyes out.
sed -i '/.*'${variable}'.*/{
$!{ N
- s/\(.*'${variable}'.*\n.*\)\"\(.*\)\"/\1\"'"${default}"'\"/
+ s/\(.*'${variable}'.*\n.*\)'\''\(.*\)'\''/\1'\'''"${default}"''\''/
t yes
P
D
diff --git a/version b/version
index 856307b22..6701dcb1c 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-1.31.44
+1.31.45
diff --git a/web/ajax/alarm.php b/web/ajax/alarm.php
index 2d4690866..002f9f784 100644
--- a/web/ajax/alarm.php
+++ b/web/ajax/alarm.php
@@ -1,40 +1,28 @@
diff --git a/web/ajax/event.php b/web/ajax/event.php
index 04ebca9ad..cf8c59aa3 100644
--- a/web/ajax/event.php
+++ b/web/ajax/event.php
@@ -1,28 +1,28 @@
$videoFile ) );
+ if ( !($event = dbFetchOne($sql, NULL, array( $_REQUEST['id']))) ) {
+ ajaxError('Video Generation Failure, Unable to load event');
+ } else {
+ if ( $videoFile = createVideo($event, $_REQUEST['videoFormat'], $_REQUEST['rate'], $_REQUEST['scale'], !empty($_REQUEST['overwrite'])) )
+ ajaxResponse(array('response'=>$videoFile));
else
- ajaxError( 'Video Generation Failed' );
+ ajaxError('Video Generation Failed');
}
}
$ok = true;
@@ -37,7 +37,7 @@ if ( canView( 'Events' ) ) {
}
case 'export' :
{
- require_once( ZM_SKIN_PATH.'/includes/export_functions.php' );
+ require_once(ZM_SKIN_PATH.'/includes/export_functions.php');
# We use session vars in here, so we need to restart the session because we stopped it in index.php to improve concurrency.
session_start();
@@ -46,22 +46,27 @@ if ( canView( 'Events' ) ) {
$exportDetail = $_SESSION['export']['detail'] = $_REQUEST['exportDetail'];
else
$exportDetail = false;
+
if ( !empty($_REQUEST['exportFrames']) )
$exportFrames = $_SESSION['export']['frames'] = $_REQUEST['exportFrames'];
else
$exportFrames = false;
+
if ( !empty($_REQUEST['exportImages']) )
$exportImages = $_SESSION['export']['images'] = $_REQUEST['exportImages'];
else
$exportImages = false;
+
if ( !empty($_REQUEST['exportVideo']) )
$exportVideo = $_SESSION['export']['video'] = $_REQUEST['exportVideo'];
else
$exportVideo = false;
+
if ( !empty($_REQUEST['exportMisc']) )
$exportMisc = $_SESSION['export']['misc'] = $_REQUEST['exportMisc'];
else
$exportMisc = false;
+
if ( !empty($_REQUEST['exportFormat']) )
$exportFormat = $_SESSION['export']['format'] = $_REQUEST['exportFormat'];
else
@@ -70,67 +75,84 @@ if ( canView( 'Events' ) ) {
session_write_close();
$exportIds = !empty($_REQUEST['eids'])?$_REQUEST['eids']:$_REQUEST['id'];
- if ( $exportFile = exportEvents( $exportIds, $exportDetail, $exportFrames, $exportImages, $exportVideo, $exportMisc, $exportFormat ) )
- ajaxResponse( array( 'exportFile'=>$exportFile ) );
+ if ( $exportFile = exportEvents(
+ $exportIds,
+ (isset($_REQUEST['connkey'])?$_REQUEST['connkey']:''),
+ $exportDetail,
+ $exportFrames,
+ $exportImages,
+ $exportVideo,
+ $exportMisc,
+ $exportFormat
+ ) )
+ ajaxResponse(array('exportFile'=>$exportFile));
else
- ajaxError( 'Export Failed' );
+ ajaxError('Export Failed');
break;
}
case 'download' :
{
- require_once( ZM_SKIN_PATH.'/includes/export_functions.php' );
+ require_once(ZM_SKIN_PATH.'/includes/export_functions.php');
$exportVideo = 1;
$exportFormat = $_REQUEST['exportFormat'];
$exportStructure = 'flat';
$exportIds = !empty($_REQUEST['eids'])?$_REQUEST['eids']:$_REQUEST['id'];
- if ( $exportFile = exportEvents( $exportIds, false, false, false, $exportVideo, false, $exportFormat, $exportStructure ) )
- ajaxResponse( array( 'exportFile'=>$exportFile ) );
+ if ( $exportFile = exportEvents(
+ $exportIds,
+ (isset($_REQUEST['connkey'])?$_REQUEST['connkey']:''),
+ false,false, false, $exportVideo, false, $exportFormat, $exportStructure ) )
+ ajaxResponse(array('exportFile'=>$exportFile));
else
- ajaxError( 'Export Failed' );
+ ajaxError('Export Failed');
break;
}
}
-}
+} // end if canView('Events')
-if ( canEdit( 'Events' ) ) {
+if ( canEdit('Events') ) {
switch ( $_REQUEST['action'] ) {
case 'rename' :
{
if ( !empty($_REQUEST['eventName']) )
- dbQuery( 'UPDATE Events SET Name = ? WHERE Id = ?', array( $_REQUEST['eventName'], $_REQUEST['id'] ) );
+ dbQuery('UPDATE Events SET Name = ? WHERE Id = ?', array($_REQUEST['eventName'], $_REQUEST['id']));
else
- ajaxError( 'No new event name supplied' );
- ajaxResponse( array( 'refreshEvent'=>true, 'refreshParent'=>true ) );
+ ajaxError('No new event name supplied');
+ ajaxResponse(array('refreshEvent'=>true, 'refreshParent'=>true));
break;
}
case 'eventdetail' :
{
- dbQuery( 'UPDATE Events SET Cause = ?, Notes = ? WHERE Id = ?', array( $_REQUEST['newEvent']['Cause'], $_REQUEST['newEvent']['Notes'], $_REQUEST['id'] ) );
- ajaxResponse( array( 'refreshEvent'=>true, 'refreshParent'=>true ) );
+ dbQuery(
+ 'UPDATE Events SET Cause = ?, Notes = ? WHERE Id = ?',
+ array($_REQUEST['newEvent']['Cause'], $_REQUEST['newEvent']['Notes'], $_REQUEST['id'])
+ );
+ ajaxResponse(array('refreshEvent'=>true, 'refreshParent'=>true));
break;
}
case 'archive' :
case 'unarchive' :
{
$archiveVal = ($_REQUEST['action'] == 'archive')?1:0;
- dbQuery( 'UPDATE Events SET Archived = ? WHERE Id = ?', array( $archiveVal, $_REQUEST['id']) );
- ajaxResponse( array( 'refreshEvent'=>true, 'refreshParent'=>false ) );
+ dbQuery(
+ 'UPDATE Events SET Archived = ? WHERE Id = ?',
+ array($archiveVal, $_REQUEST['id'])
+ );
+ ajaxResponse(array('refreshEvent'=>true, 'refreshParent'=>false));
break;
}
case 'delete' :
{
- $Event = new Event( $_REQUEST['id'] );
+ $Event = new Event($_REQUEST['id']);
if ( ! $Event->Id() ) {
- ajaxResponse( array( 'refreshEvent'=>false, 'refreshParent'=>true, 'message'=> 'Event not found.' ) );
+ ajaxResponse(array('refreshEvent'=>false, 'refreshParent'=>true, 'message'=> 'Event not found.'));
} else {
$Event->delete();
- ajaxResponse( array( 'refreshEvent'=>false, 'refreshParent'=>true ) );
+ ajaxResponse(array('refreshEvent'=>false, 'refreshParent'=>true));
}
break;
}
}
-}
-
-ajaxError( 'Unrecognised action or insufficient permissions' );
+} // end if canEdit('Events')
+ajaxError('Unrecognised action or insufficient permissions');
?>
diff --git a/web/ajax/stream.php b/web/ajax/stream.php
index 1c2fb3d62..44aaec8e6 100644
--- a/web/ajax/stream.php
+++ b/web/ajax/stream.php
@@ -22,13 +22,9 @@ if ( sem_acquire($semaphore,1) !== false ) {
if ( file_exists( $localSocketFile ) ) {
Warning("sock file $localSocketFile already exists?! Is someone else talking to zms?");
// They could be. We can maybe have concurrent requests from a browser.
- } else {
- Logger::Debug("socket file does not exist, we should be good to connect.");
}
if ( ! socket_bind( $socket, $localSocketFile ) ) {
- ajaxError( "socket_bind( $localSocketFile ) failed: ".socket_strerror(socket_last_error()) );
- } else {
- Logger::Debug("Bound to $localSocketFile");
+ ajaxError("socket_bind( $localSocketFile ) failed: ".socket_strerror(socket_last_error()) );
}
switch ( $_REQUEST['command'] ) {
@@ -81,7 +77,6 @@ if ( sem_acquire($semaphore,1) !== false ) {
$eSockets = NULL;
$timeout = MSG_TIMEOUT - ( time() - $start_time );
- Logger::Debug("TImeout is: $timeout/1000 seconds. " );
$numSockets = socket_select( $rSockets, $wSockets, $eSockets, intval($timeout/1000), ($timeout%1000)*1000 );
diff --git a/web/api/app/Controller/AppController.php b/web/api/app/Controller/AppController.php
index 7be1cd72a..692769ef0 100644
--- a/web/api/app/Controller/AppController.php
+++ b/web/api/app/Controller/AppController.php
@@ -27,114 +27,80 @@ App::uses('CrudControllerTrait', 'Crud.Lib');
* Add your application-wide methods in the class below, your controllers
* will inherit them.
*
- * @package app.Controller
- * @link http://book.cakephp.org/2.0/en/controllers.html#the-app-controller
+ * @package app.Controller
+ * @link http://book.cakephp.org/2.0/en/controllers.html#the-app-controller
*/
class AppController extends Controller {
- use CrudControllerTrait;
+ use CrudControllerTrait;
- public $components = [
- 'Session', // We are going to use SessionHelper to check PHP session vars
- 'RequestHandler',
- 'Crud.Crud' => [
- 'actions' => [
- 'index' => 'Crud.Index',
- 'add' => 'Crud.Add',
- 'edit' => 'Crud.Edit',
- 'view' => 'Crud.View',
- 'keyvalue' => 'Crud.List',
- 'category' => 'Crud.Category'
- ],
- 'listeners' => ['Api', 'ApiTransformation']
- #],
+ public $components = [
+ 'Session', // We are going to use SessionHelper to check PHP session vars
+ 'RequestHandler',
+ 'Crud.Crud' => [
+ 'actions' => [
+ 'index' => 'Crud.Index',
+ 'add' => 'Crud.Add',
+ 'edit' => 'Crud.Edit',
+ 'view' => 'Crud.View',
+ 'keyvalue' => 'Crud.List',
+ 'category' => 'Crud.Category'
+ ],
+ 'listeners' => ['Api', 'ApiTransformation']
+ #],
#'DebugKit.Toolbar' => [
# 'bootstrap' => true, 'routes' => true
]
- ];
+ ];
- // Global beforeFilter function
- //Zoneminder sets the username session variable
- // to the logged in user. If this variable is set
- // then you are logged in
- // its pretty simple to extend this to also check
- // for role and deny API access in future
- // Also checking to do this only if ZM_OPT_USE_AUTH is on
- public function beforeFilter() {
- $this->loadModel('Config');
-
- $options = array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_API'));
- $config = $this->Config->find('first', $options);
- $zmOptApi = $config['Config']['Value'];
-
- if ($zmOptApi !='1') {
+ // Global beforeFilter function
+ //Zoneminder sets the username session variable
+ // to the logged in user. If this variable is set
+ // then you are logged in
+ // its pretty simple to extend this to also check
+ // for role and deny API access in future
+ // Also checking to do this only if ZM_OPT_USE_AUTH is on
+ public function beforeFilter() {
+ if ( ! ZM_OPT_USE_API ) {
throw new UnauthorizedException(__('API Disabled'));
return;
- }
-
- $options = array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_AUTH'));
- $config = $this->Config->find('first', $options);
- $zmOptAuth = $config['Config']['Value'];
+ }
- if ( $zmOptAuth == '1' ) {
- require_once "../../../includes/auth.php";
+ # For use throughout the app. If not logged in, this will be null.
+ global $user;
+ $user = $this->Session->read('user');
+
+ if ( ZM_OPT_USE_AUTH ) {
+ require_once '../../../includes/auth.php';
- $this->loadModel('User');
- if ( isset($_REQUEST['user']) and isset($_REQUEST['pass']) ) {
- $user = $this->User->find('first', array ('conditions' => array (
- 'User.Username' => $_REQUEST['user'],
- 'User.Password' => $_REQUEST['pass'],
- )) );
- if ( ! $user ) {
- throw new UnauthorizedException(__('User not found'));
+ $mUser = $this->request->query('user') ? $this->request->query('user') : $this->request->data('user');
+ $mPassword = $this->request->query('pass') ? $this->request->query('pass') : $this->request->data('pass');
+ $mAuth = $this->request->query('auth') ? $this->request->query('auth') : $this->request->data('auth');
+
+ if ( $mUser and $mPassword ) {
+ $user = userLogin($mUser, $mPassword);
+ if ( !$user ) {
+ throw new UnauthorizedException(__('User not found or incorrect password'));
+ return;
+ }
+ } else if ( $mAuth ) {
+ $user = getAuthUser($mAuth);
+ if ( !$user ) {
+ throw new UnauthorizedException(__('Invalid Auth Key'));
return;
- } else {
- $this->Session->Write( 'user.Username', $user['User']['Username'] );
- $this->Session->Write( 'user.Enabled', $user['User']['Enabled'] );
}
}
-
- if ( isset($_REQUEST['auth']) ) {
-
- $user = getAuthUser($_REQUEST['auth']);
- if ( ! $user ) {
- throw new UnauthorizedException(__('User not found'));
+ // We need to reject methods that are not authenticated
+ // besides login and logout
+ if ( strcasecmp($this->params->action, 'logout') ) {
+ if ( !( $user and $user['Username'] ) ) {
+ throw new UnauthorizedException(__('Not Authenticated'));
+ return;
+ } else if ( !( $user and $user['Enabled'] ) ) {
+ throw new UnauthorizedException(__('User is not enabled'));
return;
- } else {
- if ( ! $this->Session->Write('user.Username', $user['Username']) )
- $this->log("Error writing session var user.Username");
- if ( ! $this->Session->Write('user.Enabled', $user['Enabled']) )
- $this->log("Error writing session var user.Enabled");
}
- } # end if REQUEST['auth']
-
- if ( ! $this->Session->read('user.Username') ) {
- throw new UnauthorizedException(__('Not Authenticated'));
- return;
- } else if ( ! $this->Session->read('user.Enabled') ) {
- throw new UnauthorizedException(__('User is not enabled'));
- return;
- }
-
- $options = array ('conditions' => array ('User.Username' => $this->Session->Read('user.Username')));
- $userMonitors = $this->User->find('first', $options);
- $this->Session->Write('allowedMonitors',$userMonitors['User']['MonitorIds']);
- $this->Session->Write('streamPermission',$userMonitors['User']['Stream']);
- $this->Session->Write('eventPermission',$userMonitors['User']['Events']);
- $this->Session->Write('controlPermission',$userMonitors['User']['Control']);
- $this->Session->Write('systemPermission',$userMonitors['User']['System']);
- $this->Session->Write('monitorPermission',$userMonitors['User']['Monitors']);
- } else {
- // if auth is not on, you can do everything
- //$userMonitors = $this->User->find('first', $options);
- $this->Session->Write('allowedMonitors','');
- $this->Session->Write('streamPermission','View');
- $this->Session->Write('eventPermission','Edit');
- $this->Session->Write('controlPermission','Edit');
- $this->Session->Write('systemPermission','Edit');
- $this->Session->Write('monitorPermission','Edit');
- }
-
-
+ } # end if ! login or logout
+ } # end if ZM_OPT_AUTH
+
} # end function beforeFilter()
-
}
diff --git a/web/api/app/Controller/ConfigsController.php b/web/api/app/Controller/ConfigsController.php
index 48f50ae8e..2084a84b3 100644
--- a/web/api/app/Controller/ConfigsController.php
+++ b/web/api/app/Controller/ConfigsController.php
@@ -21,15 +21,18 @@ class ConfigsController extends AppController {
*
* @return void
*/
- public function index() {
- $this->Config->recursive = 0;
- $configs = $this->Config->find('all');
- $this->set(array(
- 'configs' => $configs,
- '_serialize' => array('configs')
- ));
- }
-
+ public function index() {
+ global $configvals;
+ $this->Config->recursive = 0;
+ $configs = $this->Config->find('all');
+ foreach ( $configvals as $k=>$v ) {
+ $configs[] = array( 'Config'=>array('Name'=>$k, 'Value'=>$v ) );
+ }
+ $this->set(array(
+ 'configs' => $configs,
+ '_serialize' => array('configs')
+ ));
+ }
/**
* view method
@@ -53,8 +56,14 @@ class ConfigsController extends AppController {
public function viewByName($name = null) {
$config = $this->Config->findByName($name, array('fields' => 'Value'));
- if (!$config) {
- throw new NotFoundException(__('Invalid config'));
+ if ( !$config ) {
+ global $configvals;
+ if ( $configvals[$name] ) {
+ $config = array( 'Config'=>array('Value'=>$configvals[$name]) );
+ } else {
+ throw new NotFoundException(__('Invalid config'));
+ }
+ } else {
}
$this->set(array(
diff --git a/web/api/app/Controller/EventsController.php b/web/api/app/Controller/EventsController.php
index fd0c4ef98..1d9456cc4 100644
--- a/web/api/app/Controller/EventsController.php
+++ b/web/api/app/Controller/EventsController.php
@@ -1,5 +1,6 @@
Session->Read('eventPermission');
- if ($canView =='None') {
+ global $user;
+ $canView = (!$user) || ($user['Events'] != 'None');
+ if ( !$canView ) {
throw new UnauthorizedException(__('Insufficient Privileges'));
return;
}
}
-/**
- * index method
- *
- * @return void
- * This also creates a thumbnail for each event.
- */
- public function index() {
- $this->Event->recursive = -1;
-
- $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY);
+ /**
+ * index method
+ *
+ * @return void
+ * This also creates a thumbnail for each event.
+ */
+ public function index() {
+ $this->Event->recursive = -1;
- if (!empty($allowedMonitors)) {
+ global $user;
+ $allowedMonitors = $user ? preg_split('@,@', $user['MonitorIds'], NULL, PREG_SPLIT_NO_EMPTY) : null;
+
+ if ( $allowedMonitors ) {
$mon_options = array('Event.MonitorId' => $allowedMonitors);
} else {
- $mon_options='';
+ $mon_options = '';
}
- if ($this->request->params['named']) {
- //$this->FilterComponent = $this->Components->load('Filter');
- //$conditions = $this->FilterComponent->buildFilter($this->request->params['named']);
+ if ( $this->request->params['named'] ) {
+ //$this->FilterComponent = $this->Components->load('Filter');
+ //$conditions = $this->FilterComponent->buildFilter($this->request->params['named']);
$conditions = $this->request->params['named'];
- } else {
- $conditions = array();
- }
+ } else {
+ $conditions = array();
+ }
$settings = array(
- // https://github.com/ZoneMinder/ZoneMinder/issues/995
- // 'limit' => $limit['ZM_WEB_EVENTS_PER_PAGE'],
- // 25 events per page which is what the above
- // default is, is way too low for an API
- // changing this to 100 so we don't kill ZM
- // with many event APIs. In future, we can
- // make a nice ZM_API_ITEMS_PER_PAGE for all pagination
- // API
-
- 'limit' => '100',
- 'order' => array('StartTime'),
- 'paramType' => 'querystring',
+ // https://github.com/ZoneMinder/ZoneMinder/issues/995
+ // 'limit' => $limit['ZM_WEB_EVENTS_PER_PAGE'],
+ // 25 events per page which is what the above
+ // default is, is way too low for an API
+ // changing this to 100 so we don't kill ZM
+ // with many event APIs. In future, we can
+ // make a nice ZM_API_ITEMS_PER_PAGE for all pagination
+ // API
+
+ 'limit' => '100',
+ 'order' => array('StartTime'),
+ 'paramType' => 'querystring',
);
- if ( isset( $conditions['GroupId'] ) ) {
+ if ( isset($conditions['GroupId']) ) {
$settings['joins'] = array(
array(
'table' => 'Groups_Monitors',
@@ -75,45 +78,46 @@ class EventsController extends AppController {
}
$settings['conditions'] = array($conditions, $mon_options);
- // How many events to return
- $this->loadModel('Config');
- $limit = $this->Config->find('list', array(
- 'conditions' => array('Name' => 'ZM_WEB_EVENTS_PER_PAGE'),
- 'fields' => array('Name', 'Value')
- ));
- $this->Paginator->settings = $settings;
- $events = $this->Paginator->paginate('Event');
+ // How many events to return
+ $this->loadModel('Config');
+ $limit = $this->Config->find('list', array(
+ 'conditions' => array('Name' => 'ZM_WEB_EVENTS_PER_PAGE'),
+ 'fields' => array('Name', 'Value')
+ ));
+ $this->Paginator->settings = $settings;
+ $events = $this->Paginator->paginate('Event');
- // For each event, get the frameID which has the largest score
- foreach ($events as $key => $value) {
- $maxScoreFrameId = $this->getMaxScoreAlarmFrameId($value['Event']['Id']);
- $events[$key]['Event']['MaxScoreFrameId'] = $maxScoreFrameId;
- }
+ // For each event, get the frameID which has the largest score
+ foreach ( $events as $key => $value ) {
+ $maxScoreFrameId = $this->getMaxScoreAlarmFrameId($value['Event']['Id']);
+ $events[$key]['Event']['MaxScoreFrameId'] = $maxScoreFrameId;
+ }
- $this->set(compact('events'));
- }
+ $this->set(compact('events'));
+ } // end public function index()
-/**
- * view method
- *
- * @throws NotFoundException
- * @param string $id
- * @return void
- */
- public function view($id = null) {
+ /**
+ * view method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function view($id = null) {
$this->loadModel('Config');
$this->Event->recursive = 1;
- if (!$this->Event->exists($id)) {
+ if ( !$this->Event->exists($id) ) {
throw new NotFoundException(__('Invalid event'));
}
- $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY);
+ global $user;
+ $allowedMonitors = $user ? preg_split('@,@', $user['MonitorIds'], NULL, PREG_SPLIT_NO_EMPTY) : null;
- if (!empty($allowedMonitors)) {
+ if ( $allowedMonitors ) {
$mon_options = array('Event.MonitorId' => $allowedMonitors);
} else {
- $mon_options='';
+ $mon_options = '';
}
$options = array('conditions' => array(array('Event.' . $this->Event->primaryKey => $id), $mon_options));
@@ -149,14 +153,16 @@ class EventsController extends AppController {
*/
public function add() {
- if ($this->Session->Read('eventPermission') != 'Edit') {
+ global $user;
+ $canEdit = (!$user) || ($user['Events'] == 'Edit');
+ if ( !$canEdit ) {
throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
- if ($this->request->is('post')) {
+ if ( $this->request->is('post') ) {
$this->Event->create();
- if ($this->Event->save($this->request->data)) {
+ if ( $this->Event->save($this->request->data) ) {
return $this->flash(__('The event has been saved.'), array('action' => 'index'));
}
}
@@ -173,18 +179,20 @@ class EventsController extends AppController {
*/
public function edit($id = null) {
- if ($this->Session->Read('eventPermission') != 'Edit') {
+ global $user;
+ $canEdit = (!$user) || ($user['Events'] == 'Edit');
+ if ( !$canEdit ) {
throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
$this->Event->id = $id;
- if (!$this->Event->exists($id)) {
+ if ( !$this->Event->exists($id) ) {
throw new NotFoundException(__('Invalid event'));
}
- if ($this->Event->save($this->request->data)) {
+ if ( $this->Event->save($this->request->data) ) {
$message = 'Saved';
} else {
$message = 'Error';
@@ -204,16 +212,18 @@ class EventsController extends AppController {
* @return void
*/
public function delete($id = null) {
- if ($this->Session->Read('eventPermission') != 'Edit') {
+ global $user;
+ $canEdit = (!$user) || ($user['Events'] == 'Edit');
+ if ( !$canEdit ) {
throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
$this->Event->id = $id;
- if (!$this->Event->exists()) {
+ if ( !$this->Event->exists() ) {
throw new NotFoundException(__('Invalid event'));
}
$this->request->allowMethod('post', 'delete');
- if ($this->Event->delete()) {
+ if ( $this->Event->delete() ) {
//$this->loadModel('Frame');
//$this->Event->Frame->delete();
return $this->flash(__('The event has been deleted.'), array('action' => 'index'));
@@ -228,7 +238,7 @@ class EventsController extends AppController {
foreach ($this->params['named'] as $param_name => $value) {
// Transform params into mysql
- if (preg_match("/interval/i", $value, $matches)) {
+ if ( preg_match('/interval/i', $value, $matches) ) {
$condition = array("$param_name >= (date_sub(now(), $value))");
} else {
$condition = array($param_name => $value);
@@ -254,12 +264,12 @@ class EventsController extends AppController {
$this->Event->recursive = -1;
$results = array();
- $moreconditions ="";
+ $moreconditions = '';
foreach ($this->request->params['named'] as $name => $param) {
- $moreconditions = $moreconditions . " AND ".$name.$param;
- }
+ $moreconditions = $moreconditions . ' AND '.$name.$param;
+ }
- $query = $this->Event->query("select MonitorId, COUNT(*) AS Count from Events WHERE (StartTime >= (DATE_SUB(NOW(), interval $interval)) $moreconditions) GROUP BY MonitorId;");
+ $query = $this->Event->query("SELECT MonitorId, COUNT(*) AS Count FROM Events WHERE (StartTime >= (DATE_SUB(NOW(), interval $interval)) $moreconditions) GROUP BY MonitorId;");
foreach ($query as $result) {
$results[$result['Events']['MonitorId']] = $result[0]['Count'];
@@ -275,7 +285,7 @@ class EventsController extends AppController {
public function createThumbnail($id = null) {
$this->Event->recursive = -1;
- if (!$this->Event->exists($id)) {
+ if ( !$this->Event->exists($id) ) {
throw new NotFoundException(__('Invalid event'));
}
@@ -285,13 +295,13 @@ class EventsController extends AppController {
// Find the max Frame for this Event. Error out otherwise.
$this->loadModel('Frame');
- if (! $frame = $this->Frame->find('first', array(
+ if ( !( $frame = $this->Frame->find('first', array(
'conditions' => array(
'EventId' => $event['Event']['Id'],
'Score' => $event['Event']['MaxScore']
)
- ))) {
- throw new NotFoundException(__("Can not find Frame for Event " . $event['Event']['Id']));
+ ))) ) {
+ throw new NotFoundException(__('Can not find Frame for Event ' . $event['Event']['Id']));
}
$this->loadModel('Config');
@@ -304,14 +314,15 @@ class EventsController extends AppController {
$config = $this->Config->find('list', array(
'conditions' => array('OR' => array(
- 'Name' => array('ZM_WEB_LIST_THUMB_WIDTH',
- 'ZM_WEB_LIST_THUMB_HEIGHT',
- 'ZM_EVENT_IMAGE_DIGITS',
- 'ZM_DIR_IMAGES',
- $thumbs,
- 'ZM_DIR_EVENTS'
- )
- )),
+ 'Name' => array(
+ 'ZM_WEB_LIST_THUMB_WIDTH',
+ 'ZM_WEB_LIST_THUMB_HEIGHT',
+ 'ZM_EVENT_IMAGE_DIGITS',
+ 'ZM_DIR_IMAGES',
+ $thumbs,
+ 'ZM_DIR_EVENTS'
+ )
+ )),
'fields' => array('Name', 'Value')
));
$config['ZM_WEB_SCALE_THUMBS'] = $config[$thumbs];
@@ -335,12 +346,12 @@ class EventsController extends AppController {
$thumbData['Width'] = (int)$thumbWidth;
$thumbData['Height'] = (int)$thumbHeight;
- return( $thumbData );
+ return $thumbData;
}
public function archive($id = null) {
$this->Event->recursive = -1;
- if (!$this->Event->exists($id)) {
+ if ( !$this->Event->exists($id) ) {
throw new NotFoundException(__('Invalid event'));
}
@@ -365,7 +376,7 @@ class EventsController extends AppController {
public function getMaxScoreAlarmFrameId($id = null) {
$this->Event->recursive = -1;
- if (!$this->Event->exists($id)) {
+ if ( !$this->Event->exists($id) ) {
throw new NotFoundException(__('Invalid event'));
}
@@ -382,7 +393,7 @@ class EventsController extends AppController {
'Score' => $event['Event']['MaxScore']
)
))) {
- throw new NotFoundException(__("Can not find Frame for Event " . $event['Event']['Id']));
+ throw new NotFoundException(__('Can not find Frame for Event ' . $event['Event']['Id']));
}
return $frame['Frame']['Id'];
}
diff --git a/web/api/app/Controller/HostController.php b/web/api/app/Controller/HostController.php
index 0313bd97a..6dd9e5211 100644
--- a/web/api/app/Controller/HostController.php
+++ b/web/api/app/Controller/HostController.php
@@ -2,133 +2,164 @@
App::uses('AppController', 'Controller');
class HostController extends AppController {
-
- public $components = array('RequestHandler');
- public function daemonCheck($daemon=false, $args=false) {
+ public $components = array('RequestHandler', 'Session');
+
+ public function daemonCheck($daemon=false, $args=false) {
$string = Configure::read('ZM_PATH_BIN').'/zmdc.pl check';
if ( $daemon ) {
- $string .= " $daemon";
- if ( $args )
- $string .= " $args";
+ $string .= " $daemon";
+ if ( $args )
+ $string .= " $args";
}
$result = exec($string);
$result = preg_match('/running/', $result);
- $this->set(array(
- 'result' => $result,
- '_serialize' => array('result')
- ));
- }
-
- function getLoad() {
- $load = sys_getloadavg();
-
- $this->set(array(
- 'load' => $load,
- '_serialize' => array('load')
- ));
- }
-
- function getCredentials() {
- // ignore debug warnings from other functions
- $this->view='Json';
- $credentials = "";
- $appendPassword = 0;
-
- $this->loadModel('Config');
- $isZmAuth = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_AUTH')))['Config']['Value'];
-
- if ($isZmAuth) {
- $zmAuthRelay = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_RELAY')))['Config']['Value'];
- if ($zmAuthRelay == 'hashed') {
- $zmAuthHashIps= $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_HASH_IPS')))['Config']['Value'];
- $credentials = 'auth='.generateAuthHash($zmAuthHashIps);
- }
- elseif ($zmAuthRelay == 'plain') {
- // user will need to append the store password here
- $credentials = "user=".$this->Session->read('user.Username')."&pass=";
- $appendPassword = 1;
- }
- elseif ($zmAuthRelay == 'none') {
- $credentials = "user=".$this->Session->read('user.Username');
- }
- }
$this->set(array(
- 'credentials'=> $credentials,
- 'append_password'=>$appendPassword,
+ 'result' => $result,
+ '_serialize' => array('result')
+ ));
+ }
+
+ function getLoad() {
+ $load = sys_getloadavg();
+
+ $this->set(array(
+ 'load' => $load,
+ '_serialize' => array('load')
+ ));
+ }
+
+ function login() {
+
+ $cred = $this->_getCredentials();
+ $ver = $this->_getVersion();
+ $this->set(array(
+ 'credentials' => $cred[0],
+ 'append_password'=>$cred[1],
+ 'version' => $ver[0],
+ 'apiversion' => $ver[1],
+ '_serialize' => array('credentials',
+ 'append_password',
+ 'version',
+ 'apiversion'
+ )));
+ } // end function login()
+
+ // clears out session
+ function logout() {
+ global $user;
+ $this->Session->Write('user', null);
+
+ $this->set(array(
+ 'result' => 'ok',
+ '_serialize' => array('result')
+ ));
+
+ } // end function logout()
+
+ private function _getCredentials() {
+ $credentials = '';
+ $appendPassword = 0;
+ $this->loadModel('Config');
+ $isZmAuth = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_AUTH')))['Config']['Value'];
+
+ if ( $isZmAuth ) {
+ require_once "../../../includes/auth.php"; # in the event we directly call getCredentials.json
+ $this->Session->read('user'); # this is needed for command line/curl to recognize a session
+ $zmAuthRelay = $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_RELAY')))['Config']['Value'];
+ if ( $zmAuthRelay == 'hashed' ) {
+ $zmAuthHashIps= $this->Config->find('first',array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_HASH_IPS')))['Config']['Value'];
+ $credentials = 'auth='.generateAuthHash($zmAuthHashIps);
+ } else if ( $zmAuthRelay == 'plain' ) {
+ // user will need to append the store password here
+ $credentials = 'user='.$this->Session->read('user.Username').'&pass=';
+ $appendPassword = 1;
+ } else if ( $zmAuthRelay == 'none' ) {
+ $credentials = 'user='.$this->Session->read('user.Username');
+ }
+ }
+ return array($credentials, $appendPassword);
+ } // end function _getCredentials
+
+ function getCredentials() {
+ // ignore debug warnings from other functions
+ $this->view='Json';
+ $val = $this->_getCredentials();
+ $this->set(array(
+ 'credentials'=> $val[0],
+ 'append_password'=>$val[1],
'_serialize' => array('credentials', 'append_password')
) );
- }
+ }
-
- // If $mid is set, only return disk usage for that monitor
+ // If $mid is set, only return disk usage for that monitor
// Else, return an array of total disk usage, and per-monitor
// usage.
- function getDiskPercent($mid = null) {
- $this->loadModel('Config');
- $this->loadModel('Monitor');
+ function getDiskPercent($mid = null) {
+ $this->loadModel('Config');
+ $this->loadModel('Monitor');
- // If $mid is passed, see if it is valid
- if ($mid) {
- if (!$this->Monitor->exists($mid)) {
- throw new NotFoundException(__('Invalid monitor'));
- }
- }
+ // If $mid is passed, see if it is valid
+ if ($mid) {
+ if (!$this->Monitor->exists($mid)) {
+ throw new NotFoundException(__('Invalid monitor'));
+ }
+ }
- $zm_dir_events = $this->Config->find('list', array(
- 'conditions' => array('Name' => 'ZM_DIR_EVENTS'),
- 'fields' => array('Name', 'Value')
- ));
- $zm_dir_events = $zm_dir_events['ZM_DIR_EVENTS' ];
+ $zm_dir_events = $this->Config->find('list', array(
+ 'conditions' => array('Name' => 'ZM_DIR_EVENTS'),
+ 'fields' => array('Name', 'Value')
+ ));
+ $zm_dir_events = $zm_dir_events['ZM_DIR_EVENTS' ];
- // Test to see if $zm_dir_events is relative or absolute
- if ('/' === "" || strrpos($zm_dir_events, '/', -strlen($zm_dir_events)) !== TRUE) {
- // relative - so add the full path
- $zm_dir_events = Configure::read('ZM_PATH_WEB') . '/' . $zm_dir_events;
- }
+ // Test to see if $zm_dir_events is relative or absolute
+ if ('/' === "" || strrpos($zm_dir_events, '/', -strlen($zm_dir_events)) !== TRUE) {
+ // relative - so add the full path
+ $zm_dir_events = Configure::read('ZM_PATH_WEB') . '/' . $zm_dir_events;
+ }
- if ($mid) {
- // Get disk usage for $mid
- $usage = shell_exec ("du -sh0 $zm_dir_events/$mid | awk '{print $1}'");
- } else {
- $monitors = $this->Monitor->find('all', array(
- 'fields' => array('Id', 'Name', 'WebColour')
- ));
- $usage = array();
+ if ($mid) {
+ // Get disk usage for $mid
+ $usage = shell_exec ("du -sh0 $zm_dir_events/$mid | awk '{print $1}'");
+ } else {
+ $monitors = $this->Monitor->find('all', array(
+ 'fields' => array('Id', 'Name', 'WebColour')
+ ));
+ $usage = array();
- // Add each monitor's usage to array
- foreach ($monitors as $key => $value) {
- $id = $value['Monitor']['Id'];
- $name = $value['Monitor']['Name'];
- $color = $value['Monitor']['WebColour'];
+ // Add each monitor's usage to array
+ foreach ($monitors as $key => $value) {
+ $id = $value['Monitor']['Id'];
+ $name = $value['Monitor']['Name'];
+ $color = $value['Monitor']['WebColour'];
- $space = shell_exec ("du -s0 $zm_dir_events/$id | awk '{print $1}'");
- if ($space == null) {
- $space = 0;
- }
- $space = $space/1024/1024;
+ $space = shell_exec ("du -s0 $zm_dir_events/$id | awk '{print $1}'");
+ if ($space == null) {
+ $space = 0;
+ }
+ $space = $space/1024/1024;
- $usage[$name] = array(
- 'space' => rtrim($space),
- 'color' => $color
- );
- }
+ $usage[$name] = array(
+ 'space' => rtrim($space),
+ 'color' => $color
+ );
+ }
- // Add total usage to array
- $space = shell_exec( "df $zm_dir_events |tail -n1 | awk '{print $3 }'");
- $space = $space/1024/1024;
- $usage['Total'] = array(
- 'space' => rtrim($space),
- 'color' => '#F7464A'
- );
- }
+ // Add total usage to array
+ $space = shell_exec( "df $zm_dir_events |tail -n1 | awk '{print $3 }'");
+ $space = $space/1024/1024;
+ $usage['Total'] = array(
+ 'space' => rtrim($space),
+ 'color' => '#F7464A'
+ );
+ }
- $this->set(array(
- 'usage' => $usage,
- '_serialize' => array('usage')
- ));
- }
+ $this->set(array(
+ 'usage' => $usage,
+ '_serialize' => array('usage')
+ ));
+ }
function getTimeZone() {
//http://php.net/manual/en/function.date-default-timezone-get.php
@@ -139,18 +170,18 @@ class HostController extends AppController {
));
}
- function getVersion() {
- //throw new UnauthorizedException(__('API Disabled'));
- $version = Configure::read('ZM_VERSION');
- // not going to use the ZM_API_VERSION
- // requires recompilation and dependency on ZM upgrade
- //$apiversion = Configure::read('ZM_API_VERSION');
- $apiversion = '1.0';
+ private function _getVersion() {
+ $version = Configure::read('ZM_VERSION');
+ $apiversion = '1.0';
+ return array($version, $apiversion);
+ }
- $this->set(array(
- 'version' => $version,
- 'apiversion' => $apiversion,
- '_serialize' => array('version', 'apiversion')
- ));
- }
+ function getVersion() {
+ $val = $this->_getVersion();
+ $this->set(array(
+ 'version' => $val[0],
+ 'apiversion' => $val[1],
+ '_serialize' => array('version', 'apiversion')
+ ));
+ }
}
diff --git a/web/api/app/Controller/MonitorsController.php b/web/api/app/Controller/MonitorsController.php
index 660bee5ce..5ce4bb476 100644
--- a/web/api/app/Controller/MonitorsController.php
+++ b/web/api/app/Controller/MonitorsController.php
@@ -18,10 +18,13 @@ class MonitorsController extends AppController {
public function beforeRender() {
$this->set($this->Monitor->enumValues());
}
+
public function beforeFilter() {
parent::beforeFilter();
- $canView = $this->Session->Read('monitorPermission');
- if ($canView == 'None') {
+ global $user;
+ # We already tested for auth in appController, so we just need to test for specific permission
+ $canView = (!$user) || ($user['Monitors'] != 'None');
+ if ( !$canView ) {
throw new UnauthorizedException(__('Insufficient Privileges'));
return;
}
@@ -35,7 +38,7 @@ class MonitorsController extends AppController {
public function index() {
$this->Monitor->recursive = 0;
- if ($this->request->params['named']) {
+ if ( $this->request->params['named'] ) {
$this->FilterComponent = $this->Components->load('Filter');
//$conditions = $this->FilterComponent->buildFilter($this->request->params['named']);
$conditions = $this->request->params['named'];
@@ -43,13 +46,14 @@ class MonitorsController extends AppController {
$conditions = array();
}
- $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY);
- if (!empty($allowedMonitors)) {
+ global $user;
+ $allowedMonitors = $user ? preg_split('@,@', $user['MonitorIds'], NULL, PREG_SPLIT_NO_EMPTY) : null;
+ if ( $allowedMonitors ) {
$conditions['Monitor.Id' ] = $allowedMonitors;
}
$find_array = array('conditions'=>$conditions,'contain'=>array('Group'));
- if ( isset( $conditions['GroupId'] ) ) {
+ if ( isset($conditions['GroupId']) ) {
$find_array['joins'] = array(
array(
'table' => 'Groups_Monitors',
@@ -84,11 +88,12 @@ class MonitorsController extends AppController {
*/
public function view($id = null) {
$this->Monitor->recursive = 0;
- if (!$this->Monitor->exists($id)) {
+ if ( !$this->Monitor->exists($id) ) {
throw new NotFoundException(__('Invalid monitor'));
}
- $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY);
- if (!empty($allowedMonitors)) {
+ global $user;
+ $allowedMonitors = $user ? preg_split('@,@', $user['MonitorIds'], NULL, PREG_SPLIT_NO_EMPTY) : null;
+ if ( $allowedMonitors ) {
$restricted = array('Monitor.' . $this->Monitor->primaryKey => $allowedMonitors);
} else {
$restricted = '';
@@ -114,13 +119,15 @@ class MonitorsController extends AppController {
public function add() {
if ( $this->request->is('post') ) {
- if ( $this->Session->Read('systemPermission') != 'Edit' ) {
- throw new UnauthorizedException(__('Insufficient privileges'));
+ global $user;
+ $canAdd = (!$user) || ($user['System'] == 'Edit' );
+ if ( !$canAdd ) {
+ throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
$this->Monitor->create();
- if ($this->Monitor->save($this->request->data)) {
+ if ( $this->Monitor->save($this->request->data) ) {
$this->daemonControl($this->Monitor->id, 'start');
//return $this->flash(__('The monitor has been saved.'), array('action' => 'index'));
$message = 'Saved';
@@ -144,10 +151,12 @@ class MonitorsController extends AppController {
public function edit($id = null) {
$this->Monitor->id = $id;
- if (!$this->Monitor->exists($id)) {
+ if ( !$this->Monitor->exists($id) ) {
throw new NotFoundException(__('Invalid monitor'));
}
- if ($this->Session->Read('monitorPermission') != 'Edit') {
+ global $user;
+ $canEdit = (!$user) || ($user['Monitors'] == 'Edit');
+ if ( !$canEdit ) {
throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
@@ -163,9 +172,17 @@ class MonitorsController extends AppController {
// - restart or stop this monitor after change
$func = $Monitor['Function'];
// We don't pass the request data as the monitor object because it may be a subset of the full monitor array
- $this->daemonControl( $this->Monitor->id, 'stop' );
- if ( ( $func != 'None' ) and ( (!defined('ZM_SERVER_ID')) or ($Monitor['ServerId']==ZM_SERVER_ID) ) ) {
- $this->daemonControl( $this->Monitor->id, 'start' );
+ $this->daemonControl($this->Monitor->id, 'stop');
+ if (
+ ( $func != 'None' )
+ and
+ (
+ (!defined('ZM_SERVER_ID'))
+ or
+ ($Monitor['ServerId']==ZM_SERVER_ID)
+ )
+ ) {
+ $this->daemonControl($this->Monitor->id, 'start');
}
} else {
$message = 'Error ' . print_r($this->Monitor->invalidFields(), true);
@@ -187,10 +204,10 @@ class MonitorsController extends AppController {
*/
public function delete($id = null) {
$this->Monitor->id = $id;
- if (!$this->Monitor->exists()) {
+ if ( !$this->Monitor->exists() ) {
throw new NotFoundException(__('Invalid monitor'));
}
- if ($this->Session->Read('systemPermission') != 'Edit') {
+ if ( $this->Session->Read('systemPermission') != 'Edit' ) {
throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
@@ -198,7 +215,7 @@ class MonitorsController extends AppController {
$this->daemonControl($this->Monitor->id, 'stop');
- if ($this->Monitor->delete()) {
+ if ( $this->Monitor->delete() ) {
return $this->flash(__('The monitor has been deleted.'), array('action' => 'index'));
} else {
return $this->flash(__('The monitor could not be deleted. Please, try again.'), array('action' => 'index'));
@@ -206,7 +223,7 @@ class MonitorsController extends AppController {
}
public function sourceTypes() {
- $sourceTypes = $this->Monitor->query("describe Monitors Type;");
+ $sourceTypes = $this->Monitor->query('describe Monitors Type;');
preg_match('/^enum\((.*)\)$/', $sourceTypes[0]['COLUMNS']['Type'], $matches);
foreach( explode(',', $matches[1]) as $value ) {
@@ -226,7 +243,7 @@ class MonitorsController extends AppController {
public function alarm() {
$id = $this->request->params['named']['id'];
$cmd = strtolower($this->request->params['named']['command']);
- if (!$this->Monitor->exists($id)) {
+ if ( !$this->Monitor->exists($id) ) {
throw new NotFoundException(__('Invalid monitor'));
}
if ( $cmd != 'on' && $cmd != 'off' && $cmd != 'status' ) {
@@ -252,19 +269,18 @@ class MonitorsController extends AppController {
// form auth key based on auth credentials
$this->loadModel('Config');
$options = array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_OPT_USE_AUTH'));
- $config = $this->Config->find('first', $options);
+ $config = $this->Config->find('first', $options);
$zmOptAuth = $config['Config']['Value'];
-
$options = array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_RELAY'));
- $config = $this->Config->find('first', $options);
+ $config = $this->Config->find('first', $options);
$zmAuthRelay = $config['Config']['Value'];
- $auth='';
+ $auth = '';
if ( $zmOptAuth ) {
if ( $zmAuthRelay == 'hashed' ) {
$options = array('conditions' => array('Config.' . $this->Config->primaryKey => 'ZM_AUTH_HASH_SECRET'));
- $config = $this->Config->find('first', $options);
+ $config = $this->Config->find('first', $options);
$zmAuthHashSecret = $config['Config']['Value'];
$time = localtime();
@@ -293,7 +309,7 @@ class MonitorsController extends AppController {
$id = $this->request->params['named']['id'];
$daemon = $this->request->params['named']['daemon'];
- if (!$this->Monitor->exists($id)) {
+ if ( !$this->Monitor->exists($id) ) {
throw new NotFoundException(__('Invalid monitor'));
}
@@ -306,7 +322,7 @@ class MonitorsController extends AppController {
$monitor = Set::extract('/Monitor/.', $monitor);
// Pass -d for local, otherwise -m
- if ($monitor[0]['Type'] == 'Local') {
+ if ( $monitor[0]['Type'] == 'Local' ) {
$args = '-d '. $monitor[0]['Device'];
} else {
$args = '-m '. $monitor[0]['Id'];
@@ -315,7 +331,7 @@ class MonitorsController extends AppController {
// Build the command, and execute it
$zm_path_bin = Configure::read('ZM_PATH_BIN');
$command = escapeshellcmd("$zm_path_bin/zmdc.pl status $daemon $args");
- $status = exec( $command );
+ $status = exec($command);
// If 'not' is present, the daemon is not running, so return false
// https://github.com/ZoneMinder/ZoneMinder/issues/799#issuecomment-108996075
@@ -332,25 +348,18 @@ class MonitorsController extends AppController {
}
public function daemonControl($id, $command, $monitor=null, $daemon=null) {
- $args = '';
$daemons = array();
- if (!$monitor) {
+ if ( !$monitor ) {
// Need to see if it is local or remote
$monitor = $this->Monitor->find('first', array(
- 'fields' => array('Type', 'Function'),
+ 'fields' => array('Type', 'Function', 'Device'),
'conditions' => array('Id' => $id)
));
$monitor = $monitor['Monitor'];
}
- if ($monitor['Type'] == 'Local') {
- $args = '-d ' . $monitor['Device'];
- } else {
- $args = '-m ' . $id;
- }
-
- if ($monitor['Function'] == 'Monitor') {
+ if ( $monitor['Function'] == 'Monitor' ) {
array_push($daemons, 'zmc');
} else {
array_push($daemons, 'zmc', 'zma');
@@ -358,10 +367,16 @@ class MonitorsController extends AppController {
$zm_path_bin = Configure::read('ZM_PATH_BIN');
- foreach ($daemons as $daemon) {
+ foreach ( $daemons as $daemon ) {
+ $args = '';
+ if ( $daemon == 'zmc' and $monitor['Type'] == 'Local' ) {
+ $args = '-d ' . $monitor['Device'];
+ } else {
+ $args = '-m ' . $id;
+ }
+
$shellcmd = escapeshellcmd("$zm_path_bin/zmdc.pl $command $daemon $args");
$status = exec( $shellcmd );
}
}
-
} // end class MonitorsController
diff --git a/web/api/app/Controller/ServersController.php b/web/api/app/Controller/ServersController.php
index 88a5bec90..c30de038f 100644
--- a/web/api/app/Controller/ServersController.php
+++ b/web/api/app/Controller/ServersController.php
@@ -8,7 +8,6 @@ App::uses('AppController', 'Controller');
*/
class ServersController extends AppController {
-
/**
* Components
*
@@ -16,18 +15,16 @@ class ServersController extends AppController {
*/
public $components = array('Paginator', 'RequestHandler');
-
-public function beforeFilter() {
- parent::beforeFilter();
- $canView = $this->Session->Read('streamPermission');
- if ($canView =='None') {
- throw new UnauthorizedException(__('Insufficient Privileges'));
- return;
+ public function beforeFilter() {
+ parent::beforeFilter();
+ global $user;
+ $canView = (!$user) || ($user['System'] != 'None');
+ if ( !$canView ) {
+ throw new UnauthorizedException(__('Insufficient Privileges'));
+ return;
+ }
}
-}
-
-
/**
* index method
*
@@ -36,7 +33,7 @@ public function beforeFilter() {
public function index() {
$this->Server->recursive = 0;
- $options='';
+ $options = '';
$servers = $this->Server->find('all',$options);
$this->set(array(
'servers' => $servers,
@@ -76,16 +73,17 @@ public function beforeFilter() {
* @return void
*/
public function add() {
- if ($this->request->is('post')) {
+ if ( $this->request->is('post') ) {
- if ($this->Session->Read('systemPermission') != 'Edit')
- {
- throw new UnauthorizedException(__('Insufficient privileges'));
+ global $user;
+ $canEdit = (!$user) || ($user['System'] == 'Edit');
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
$this->Server->create();
- if ($this->Server->save($this->request->data)) {
+ if ( $this->Server->save($this->request->data) ) {
# Might be nice to send it a start request
#$this->daemonControl($this->Server->id, 'start', $this->request->data);
return $this->flash(__('The server has been saved.'), array('action' => 'index'));
@@ -103,15 +101,17 @@ public function beforeFilter() {
public function edit($id = null) {
$this->Server->id = $id;
- if (!$this->Server->exists($id)) {
- throw new NotFoundException(__('Invalid server'));
- }
- if ($this->Session->Read('systemPermission') != 'Edit')
- {
- throw new UnauthorizedException(__('Insufficient privileges'));
+ global $user;
+ $canEdit = (!$user) || ($user['System'] == 'Edit');
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
- if ($this->Server->save($this->request->data)) {
+
+ if ( !$this->Server->exists($id) ) {
+ throw new NotFoundException(__('Invalid server'));
+ }
+ if ( $this->Server->save($this->request->data) ) {
$message = 'Saved';
} else {
$message = 'Error';
@@ -133,20 +133,22 @@ public function beforeFilter() {
* @return void
*/
public function delete($id = null) {
- $this->Server->id = $id;
- if (!$this->Server->exists()) {
- throw new NotFoundException(__('Invalid server'));
- }
- if ($this->Session->Read('systemPermission') != 'Edit')
- {
- throw new UnauthorizedException(__('Insufficient privileges'));
+ global $user;
+ $canEdit = (!$user) || ($user['System'] == 'Edit');
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient privileges'));
return;
}
+
+ $this->Server->id = $id;
+ if ( !$this->Server->exists() ) {
+ throw new NotFoundException(__('Invalid server'));
+ }
$this->request->allowMethod('post', 'delete');
#$this->daemonControl($this->Server->id, 'stop');
- if ($this->Server->delete()) {
+ if ( $this->Server->delete() ) {
return $this->flash(__('The server has been deleted.'), array('action' => 'index'));
} else {
return $this->flash(__('The server could not be deleted. Please, try again.'), array('action' => 'index'));
diff --git a/web/api/app/Controller/StatesController.php b/web/api/app/Controller/StatesController.php
index 051837b27..29201d2c1 100644
--- a/web/api/app/Controller/StatesController.php
+++ b/web/api/app/Controller/StatesController.php
@@ -12,30 +12,28 @@ class StatesController extends AppController {
public $components = array('RequestHandler');
public function beforeFilter() {
- parent::beforeFilter();
- $canView = $this->Session->Read('systemPermission');
- if ($canView =='None')
- {
- throw new UnauthorizedException(__('Insufficient Privileges'));
- return;
- }
-
+ parent::beforeFilter();
+ global $user;
+ $canView = (!$user) || ($user['System'] != 'None');
+ if ( !$canView ) {
+ throw new UnauthorizedException(__('Insufficient Privileges'));
+ return;
+ }
}
-
/**
* index method
*
* @return void
*/
- public function index() {
- $this->State->recursive = 0;
- $states = $this->State->find('all');
- $this->set(array(
- 'states' => $states,
- '_serialize' => array('states')
- ));
- }
+public function index() {
+ $this->State->recursive = 0;
+ $states = $this->State->find('all');
+ $this->set(array(
+ 'states' => $states,
+ '_serialize' => array('states')
+ ));
+}
/**
* view method
@@ -44,35 +42,35 @@ public function beforeFilter() {
* @param string $id
* @return void
*/
- public function view($id = null) {
- if (!$this->State->exists($id)) {
- throw new NotFoundException(__('Invalid state'));
- }
- $options = array('conditions' => array('State.' . $this->State->primaryKey => $id));
- $this->set('state', $this->State->find('first', $options));
- }
+public function view($id = null) {
+ if ( !$this->State->exists($id) ) {
+ throw new NotFoundException(__('Invalid state'));
+ }
+ $options = array('conditions' => array('State.' . $this->State->primaryKey => $id));
+ $this->set('state', $this->State->find('first', $options));
+}
/**
* add method
*
* @return void
*/
- public function add() {
-
- if ($this->request->is('post')) {
+public function add() {
- if ($this->Session->Read('systemPermission') != 'Edit')
- {
- throw new UnauthorizedException(__('Insufficient privileges'));
- return;
- }
+ if ($this->request->is('post')) {
- $this->State->create();
- if ($this->State->save($this->request->data)) {
- return $this->flash(__('The state has been saved.'), array('action' => 'index'));
- }
- }
- }
+ if ($this->Session->Read('systemPermission') != 'Edit')
+ {
+ throw new UnauthorizedException(__('Insufficient privileges'));
+ return;
+ }
+
+ $this->State->create();
+ if ($this->State->save($this->request->data)) {
+ return $this->flash(__('The state has been saved.'), array('action' => 'index'));
+ }
+ }
+}
/**
* edit method
@@ -81,26 +79,27 @@ public function beforeFilter() {
* @param string $id
* @return void
*/
- public function edit($id = null) {
- if (!$this->State->exists($id)) {
- throw new NotFoundException(__('Invalid state'));
- }
+public function edit($id = null) {
+ if (!$this->State->exists($id)) {
+ throw new NotFoundException(__('Invalid state'));
+ }
- if ($this->Session->Read('systemPermission') != 'Edit')
- {
- throw new UnauthorizedException(__('Insufficient privileges'));
- return;
- }
+ global $user;
+ $canEdit = (!$user) || ($user['System'] == 'Edit');
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient privileges'));
+ return;
+ }
- if ($this->request->is(array('post', 'put'))) {
- if ($this->State->save($this->request->data)) {
- return $this->flash(__('The state has been saved.'), array('action' => 'index'));
- }
- } else {
- $options = array('conditions' => array('State.' . $this->State->primaryKey => $id));
- $this->request->data = $this->State->find('first', $options);
- }
- }
+ if ( $this->request->is(array('post', 'put')) ) {
+ if ( $this->State->save($this->request->data) ) {
+ return $this->flash(__('The state has been saved.'), array('action' => 'index'));
+ }
+ } else {
+ $options = array('conditions' => array('State.' . $this->State->primaryKey => $id));
+ $this->request->data = $this->State->find('first', $options);
+ }
+}
/**
* delete method
@@ -109,48 +108,50 @@ public function beforeFilter() {
* @param string $id
* @return void
*/
- public function delete($id = null) {
- $this->State->id = $id;
- if ($this->Session->Read('systemPermission') != 'Edit')
- {
- throw new UnauthorizedException(__('Insufficient privileges'));
- return;
- }
+public function delete($id = null) {
+ $this->State->id = $id;
+ global $user;
+ $canEdit = (!$user) || ($user['System'] == 'Edit');
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient privileges'));
+ return;
+ }
- if (!$this->State->exists()) {
- throw new NotFoundException(__('Invalid state'));
- }
- $this->request->allowMethod('post', 'delete');
- if ($this->State->delete()) {
- return $this->flash(__('The state has been deleted.'), array('action' => 'index'));
- } else {
- return $this->flash(__('The state could not be deleted. Please, try again.'), array('action' => 'index'));
- }
- }
+ if (!$this->State->exists()) {
+ throw new NotFoundException(__('Invalid state'));
+ }
+ $this->request->allowMethod('post', 'delete');
+ if ($this->State->delete()) {
+ return $this->flash(__('The state has been deleted.'), array('action' => 'index'));
+ } else {
+ return $this->flash(__('The state could not be deleted. Please, try again.'), array('action' => 'index'));
+ }
+}
- public function change() {
- if ($this->Session->Read('systemPermission') != 'Edit')
- {
- throw new UnauthorizedException(__('Insufficient privileges'));
- return;
- }
+public function change() {
+ global $user;
+ $canEdit = (!$user) || ($user['System'] == 'Edit');
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient privileges'));
+ return;
+ }
- $newState = $this->request->params['pass'][0];
- $blah = $this->packageControl($newState);
+ $newState = $this->request->params['pass'][0];
+ $blah = $this->packageControl($newState);
- $this->set(array(
- 'blah' => $blah,
- '_serialize' => array('blah')
- ));
- }
+ $this->set(array(
+ 'blah' => $blah,
+ '_serialize' => array('blah')
+ ));
+}
- public function packageControl( $command ) {
- $zm_path_bin = Configure::read('ZM_PATH_BIN');
- $string = $zm_path_bin.'/zmpkg.pl '.escapeshellarg( $command );
- $status = exec( $string );
+public function packageControl( $command ) {
+ $zm_path_bin = Configure::read('ZM_PATH_BIN');
+ $string = $zm_path_bin.'/zmpkg.pl '.escapeshellarg( $command );
+ $status = exec( $string );
- return $status;
- }
+ return $status;
+}
}
diff --git a/web/api/app/Controller/UsersController.php b/web/api/app/Controller/UsersController.php
new file mode 100644
index 000000000..6b691cee1
--- /dev/null
+++ b/web/api/app/Controller/UsersController.php
@@ -0,0 +1,172 @@
+User->recursive = 0;
+
+ $users = $this->Paginator->paginate('User');
+
+ $this->set(compact('users'));
+ }
+
+/**
+ * view method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function view($id = null) {
+ $this->loadModel('Config');
+ $configs = $this->Config->find('list', array(
+ 'fields' => array('Name', 'Value'),
+ 'conditions' => array('Name' => array('ZM_DIR_EVENTS'))
+ ));
+
+ $this->User->recursive = 1;
+ if (!$this->User->exists($id)) {
+ throw new NotFoundException(__('Invalid user'));
+ }
+ $options = array('conditions' => array('User.' . $this->User->primaryKey => $id));
+ $user = $this->User->find('first', $options);
+
+ $this->set(array(
+ 'user' => $user,
+ '_serialize' => array('user')
+ ));
+ }
+
+/**
+ * add method
+ *
+ * @return void
+ */
+ public function add() {
+ if ($this->request->is('post')) {
+ $this->User->create();
+ if ($this->User->save($this->request->data)) {
+ return $this->flash(__('The user has been saved.'), array('action' => 'index'));
+ }
+ $this->Session->setFlash(
+ __('The user could not be saved. Please, try again.')
+ );
+ }
+ }
+
+/**
+ * edit method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function edit($id = null) {
+ $this->User->id = $id;
+
+ if (!$this->User->exists($id)) {
+ throw new NotFoundException(__('Invalid user'));
+ }
+
+ if ($this->request->is('post') || $this->request->is('put')) {
+ if ($this->User->save($this->request->data)) {
+ $message = 'Saved';
+ } else {
+ $message = 'Error';
+ }
+ } else {
+ $this->request->data = $this->User->read(null, $id);
+ unset($this->request->data['User']['password']);
+ }
+
+ $this->set(array(
+ 'message' => $message,
+ '_serialize' => array('message')
+ ));
+ }
+
+/**
+ * delete method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function delete($id = null) {
+ $this->User->id = $id;
+ if (!$this->User->exists()) {
+ throw new NotFoundException(__('Invalid user'));
+ }
+ $this->request->allowMethod('post', 'delete');
+ if ($this->User->delete()) {
+ $message = 'The user has been deleted.';
+ } else {
+ $message = 'The user could not be deleted. Please, try again.';
+ }
+ $this->set(array(
+ 'message' => $message,
+ '_serialize' => array('message')
+ ));
+ }
+
+ public function beforeFilter() {
+ parent::beforeFilter();
+
+ $this->loadModel('Config');
+ $configs = $this->Config->find('list', array(
+ 'fields' => array('Name', 'Value'),
+ 'conditions' => array('Name' => array('ZM_OPT_USE_AUTH'))
+ ));
+ if ( $configs['ZM_OPT_USE_AUTH'] ) {
+ $this->Auth->allow('add','logout');
+ } else {
+ $this->Auth->allow();
+ }
+ }
+
+ public function login() {
+ $this->loadModel('Config');
+ $configs = $this->Config->find('list', array(
+ 'fields' => array('Name', 'Value'),
+ 'conditions' => array('Name' => array('ZM_OPT_USE_AUTH'))
+ ));
+
+ if ( ! $configs['ZM_OPT_USE_AUTH'] ) {
+ $this->set(array(
+ 'message' => 'Login is not required.',
+ '_serialize' => array('message')
+ ));
+ return;
+ }
+
+ if ($this->request->is('post')) {
+ if ($this->Auth->login()) {
+ return $this->redirect($this->Auth->redirectUrl());
+ }
+ $this->Session->setFlash(__('Invalid username or password, try again'));
+ }
+ }
+
+ public function logout() {
+ return $this->redirect($this->Auth->logout());
+ }
+
+}
diff --git a/web/api/app/Controller/ZonePresetsController.php b/web/api/app/Controller/ZonePresetsController.php
index b89a6c75d..e26732eb8 100644
--- a/web/api/app/Controller/ZonePresetsController.php
+++ b/web/api/app/Controller/ZonePresetsController.php
@@ -8,92 +8,93 @@ App::uses('AppController', 'Controller');
*/
class ZonePresetsController extends AppController {
-/**
- * Components
- *
- * @var array
- */
- public $components = array('RequestHandler');
+ /**
+ * Components
+ *
+ * @var array
+ */
+ public $components = array('RequestHandler');
-/**
- * index method
- *
- * @return void
- */
- public function index() {
- $zonePresets = $this->ZonePreset->find('all');
- $this->set(array(
- 'zonePresets' => $zonePresets,
- '_serialize' => array('zonePresets')
- ));
- }
+ /**
+ * index method
+ *
+ * @return void
+ */
+ public function index() {
+ $zonePresets = $this->ZonePreset->find('all');
+ $this->set(array(
+ 'zonePresets' => $zonePresets,
+ '_serialize' => array('zonePresets')
+ ));
+ }
-/**
- * view method
- *
- * @throws NotFoundException
- * @param string $id
- * @return void
- */
- public function view($id = null) {
- if (!$this->ZonePreset->exists($id)) {
- throw new NotFoundException(__('Invalid zone preset'));
- }
- $options = array('conditions' => array('ZonePreset.' . $this->ZonePreset->primaryKey => $id));
- $this->set('zonePreset', $this->ZonePreset->find('first', $options));
- }
+ /**
+ * view method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function view($id = null) {
+ if ( !$this->ZonePreset->exists($id) ) {
+ throw new NotFoundException(__('Invalid zone preset'));
+ }
+ $options = array('conditions' => array('ZonePreset.' . $this->ZonePreset->primaryKey => $id));
+ $this->set('zonePreset', $this->ZonePreset->find('first', $options));
+ }
-/**
- * add method
- *
- * @return void
- */
- public function add() {
- if ($this->request->is('post')) {
- $this->ZonePreset->create();
- if ($this->ZonePreset->save($this->request->data)) {
- return $this->flash(__('The zone preset has been saved.'), array('action' => 'index'));
- }
- }
- }
+ /**
+ * add method
+ *
+ * @return void
+ */
+ public function add() {
+ if ( $this->request->is('post') ) {
+ $this->ZonePreset->create();
+ if ( $this->ZonePreset->save($this->request->data) ) {
+ return $this->flash(__('The zone preset has been saved.'), array('action' => 'index'));
+ }
+ }
+ }
-/**
- * edit method
- *
- * @throws NotFoundException
- * @param string $id
- * @return void
- */
- public function edit($id = null) {
- if (!$this->ZonePreset->exists($id)) {
- throw new NotFoundException(__('Invalid zone preset'));
- }
- if ($this->request->is(array('post', 'put'))) {
- if ($this->ZonePreset->save($this->request->data)) {
- return $this->flash(__('The zone preset has been saved.'), array('action' => 'index'));
- }
- } else {
- $options = array('conditions' => array('ZonePreset.' . $this->ZonePreset->primaryKey => $id));
- $this->request->data = $this->ZonePreset->find('first', $options);
- }
- }
+ /**
+ * edit method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function edit($id = null) {
+ if ( !$this->ZonePreset->exists($id) ) {
+ throw new NotFoundException(__('Invalid zone preset'));
+ }
+ if ( $this->request->is(array('post', 'put')) ) {
+ if ( $this->ZonePreset->save($this->request->data) ) {
+ return $this->flash(__('The zone preset has been saved.'), array('action' => 'index'));
+ }
+ } else {
+ $options = array('conditions' => array('ZonePreset.' . $this->ZonePreset->primaryKey => $id));
+ $this->request->data = $this->ZonePreset->find('first', $options);
+ }
+ }
-/**
- * delete method
- *
- * @throws NotFoundException
- * @param string $id
- * @return void
- */
- public function delete($id = null) {
- $this->ZonePreset->id = $id;
- if (!$this->ZonePreset->exists()) {
- throw new NotFoundException(__('Invalid zone preset'));
- }
- $this->request->allowMethod('post', 'delete');
- if ($this->ZonePreset->delete()) {
- return $this->flash(__('The zone preset has been deleted.'), array('action' => 'index'));
- } else {
- return $this->flash(__('The zone preset could not be deleted. Please, try again.'), array('action' => 'index'));
- }
- }}
+ /**
+ * delete method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function delete($id = null) {
+ $this->ZonePreset->id = $id;
+ if ( !$this->ZonePreset->exists() ) {
+ throw new NotFoundException(__('Invalid zone preset'));
+ }
+ $this->request->allowMethod('post', 'delete');
+ if ( $this->ZonePreset->delete() ) {
+ return $this->flash(__('The zone preset has been deleted.'), array('action' => 'index'));
+ } else {
+ return $this->flash(__('The zone preset could not be deleted. Please, try again.'), array('action' => 'index'));
+ }
+ }
+} // end class ZonePresetsController
diff --git a/web/api/app/Controller/ZonesController.php b/web/api/app/Controller/ZonesController.php
index 5fbadc2ed..74a87f353 100644
--- a/web/api/app/Controller/ZonesController.php
+++ b/web/api/app/Controller/ZonesController.php
@@ -7,148 +7,163 @@ App::uses('AppController', 'Controller');
*/
class ZonesController extends AppController {
-/**
- * Components
- *
- * @var array
- */
-public $components = array('RequestHandler');
+ /**
+ * Components
+ *
+ * @var array
+ */
+ public $components = array('RequestHandler');
-public function beforeFilter() {
- parent::beforeFilter();
- $canView = $this->Session->Read('monitorPermission');
- if ($canView =='None')
- {
- throw new UnauthorizedException(__('Insufficient Privileges'));
- return;
- }
+ public function beforeFilter() {
+ parent::beforeFilter();
-}
+ global $user;
+ $canView = (!$user) || $user['Monitors'] != 'None';
+ if ( !$canView ) {
+ throw new UnauthorizedException(__('Insufficient Privileges'));
+ return;
+ }
+ }
-// Find all zones which belong to a MonitorId
-public function forMonitor($id = null) {
+ // Find all zones which belong to a MonitorId
+ public function forMonitor($id = null) {
$this->loadModel('Monitor');
- if (!$this->Monitor->exists($id)) {
- throw new NotFoundException(__('Invalid monitor'));
+ if ( !$this->Monitor->exists($id) ) {
+ throw new NotFoundException(__('Invalid monitor'));
}
$this->Zone->recursive = -1;
$zones = $this->Zone->find('all', array(
- 'conditions' => array('MonitorId' => $id)
+ 'conditions' => array('MonitorId' => $id)
));
$this->set(array(
- 'zones' => $zones,
- '_serialize' => array('zones')
+ 'zones' => $zones,
+ '_serialize' => array('zones')
));
-}
-public function index() {
+ }
+ public function index() {
$this->Zone->recursive = -1;
-
- $allowedMonitors=preg_split ('@,@', $this->Session->Read('allowedMonitors'),NULL, PREG_SPLIT_NO_EMPTY);
- if (!empty($allowedMonitors))
- {
- $mon_options = array('Zones.MonitorId' => $allowedMonitors);
- }
- else
- {
- $mon_options='';
+
+ global $user;
+ $allowedMonitors = $user ? preg_split('@,@', $user['MonitorIds'],NULL, PREG_SPLIT_NO_EMPTY) : null;
+ if ( $allowedMonitors ) {
+ $mon_options = array('Zones.MonitorId' => $allowedMonitors);
+ } else {
+ $mon_options = '';
}
$zones = $this->Zone->find('all',$mon_options);
$this->set(array(
- 'zones' => $zones,
- '_serialize' => array('zones')
+ 'zones' => $zones,
+ '_serialize' => array('zones')
));
-}
-/**
- * add method
- *
- * @return void
- */
- public function add() {
- if ($this->request->is('post')) {
- $this->Zone->create();
- if ($this->Zone->save($this->request->data)) {
- return $this->flash(__('The zone has been saved.'), array('action' => 'index'));
- }
- }
- $monitors = $this->Zone->Monitor->find('list');
- $this->set(compact('monitors'));
+ }
+
+ /**
+ * add method
+ *
+ * @return void
+ */
+ public function add() {
+ if ( $this->request->is('post') ) {
+
+ global $user;
+ $canEdit = (!$user) || $user['Monitors'] == 'Edit';
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient Privileges'));
+ return;
+ }
+
+ $this->Zone->create();
+ if ( $this->Zone->save($this->request->data) ) {
+ return $this->flash(__('The zone has been saved.'), array('action' => 'index'));
+ }
+ }
+ $monitors = $this->Zone->Monitor->find('list');
+ $this->set(compact('monitors'));
+ }
+
+ /**
+ * edit method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function edit($id = null) {
+ $this->Zone->id = $id;
+
+ if ( !$this->Zone->exists($id) ) {
+ throw new NotFoundException(__('Invalid zone'));
+ }
+ if ( $this->request->is(array('post', 'put')) ) {
+ global $user;
+ $canEdit = (!$user) || $user['Monitors'] == 'Edit';
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient Privileges'));
+ return;
+ }
+ if ( $this->Zone->save($this->request->data) ) {
+ return $this->flash(__('The zone has been saved.'), array('action' => 'index'));
+ }
+ } else {
+ $options = array('conditions' => array('Zone.' . $this->Zone->primaryKey => $id));
+ $this->request->data = $this->Zone->find('first', $options);
+ }
+ $monitors = $this->Zone->Monitor->find('list');
+ $this->set(compact('monitors'));
+ }
+
+ /**
+ * delete method
+ *
+ * @throws NotFoundException
+ * @param string $id
+ * @return void
+ */
+ public function delete($id = null) {
+ $this->Zone->id = $id;
+ if ( !$this->Zone->exists() ) {
+ throw new NotFoundException(__('Invalid zone'));
+ }
+ $this->request->allowMethod('post', 'delete');
+ global $user;
+ $canEdit = (!$user) || $user['Monitors'] == 'Edit';
+ if ( !$canEdit ) {
+ throw new UnauthorizedException(__('Insufficient Privileges'));
+ return;
+ }
+ if ( $this->Zone->delete() ) {
+ return $this->flash(__('The zone has been deleted.'), array('action' => 'index'));
+ } else {
+ return $this->flash(__('The zone could not be deleted. Please, try again.'), array('action' => 'index'));
+ }
+ }
+
+ public function createZoneImage($id = null) {
+ $this->loadModel('Monitor');
+ $this->Monitor->id = $id;
+ if ( !$this->Monitor->exists() ) {
+ throw new NotFoundException(__('Invalid zone'));
}
-/**
- * edit method
- *
- * @throws NotFoundException
- * @param string $id
- * @return void
- */
- public function edit($id = null) {
- $this->Zone->id = $id;
+ $this->loadModel('Config');
+ $zm_dir_images = $this->Config->find('list', array(
+ 'conditions' => array('Name' => 'ZM_DIR_IMAGES'),
+ 'fields' => array('Name', 'Value')
+ ));
- if (!$this->Zone->exists($id)) {
- throw new NotFoundException(__('Invalid zone'));
- }
- if ($this->request->is(array('post', 'put'))) {
- if ($this->Zone->save($this->request->data)) {
- return $this->flash(__('The zone has been saved.'), array('action' => 'index'));
- }
- } else {
- $options = array('conditions' => array('Zone.' . $this->Zone->primaryKey => $id));
- $this->request->data = $this->Zone->find('first', $options);
- }
- $monitors = $this->Zone->Monitor->find('list');
- $this->set(compact('monitors'));
- }
+ $zm_dir_images = $zm_dir_images['ZM_DIR_IMAGES'];
+ $zm_path_web = Configure::read('ZM_PATH_WEB');
+ $zm_path_bin = Configure::read('ZM_PATH_BIN');
+ $images_path = "$zm_path_web/$zm_dir_images";
-/**
- * delete method
- *
- * @throws NotFoundException
- * @param string $id
- * @return void
- */
- public function delete($id = null) {
- $this->Zone->id = $id;
- if (!$this->Zone->exists()) {
- throw new NotFoundException(__('Invalid zone'));
- }
- $this->request->allowMethod('post', 'delete');
- if ($this->Zone->delete()) {
- return $this->flash(__('The zone has been deleted.'), array('action' => 'index'));
- } else {
- return $this->flash(__('The zone could not be deleted. Please, try again.'), array('action' => 'index'));
- }
- }
+ chdir($images_path);
+ $command = escapeshellcmd("$zm_path_bin/zmu -z -m $id");
+ system($command, $status);
-
- public function createZoneImage( $id = null ) {
- $this->loadModel('Monitor');
- $this->Monitor->id = $id;
- if (!$this->Monitor->exists()) {
- throw new NotFoundException(__('Invalid zone'));
- }
-
-
- $this->loadModel('Config');
- $zm_dir_images = $this->Config->find('list', array(
- 'conditions' => array('Name' => 'ZM_DIR_IMAGES'),
- 'fields' => array('Name', 'Value')
- ));
-
- $zm_dir_images = $zm_dir_images['ZM_DIR_IMAGES'];
- $zm_path_web = Configure::read('ZM_PATH_WEB');
- $zm_path_bin = Configure::read('ZM_PATH_BIN');
- $images_path = "$zm_path_web/$zm_dir_images";
-
- chdir($images_path);
-
- $command = escapeshellcmd("$zm_path_bin/zmu -z -m $id");
- system( $command, $status );
-
- $this->set(array(
- 'status' => $status,
- '_serialize' => array('status')
- ));
-
- }
-}
+ $this->set(array(
+ 'status' => $status,
+ '_serialize' => array('status')
+ ));
+ }
+} // end class
diff --git a/web/api/app/Model/User.php b/web/api/app/Model/User.php
index 8ef18d131..9137ebfc5 100644
--- a/web/api/app/Model/User.php
+++ b/web/api/app/Model/User.php
@@ -1,12 +1,28 @@
array(
+ 'required' => array(
+ 'rule' => array('notEmpty'),
+ 'message' => 'A username is required'
+ )
+ ),
+ 'Password' => array(
+ 'required' => array(
+ 'rule' => array('notEmpty'),
+ 'message' => 'A password is required'
+ )
+ )
+ );
+
/**
* Use table
*
@@ -26,6 +42,48 @@ class User extends AppModel {
*
* @var string
*/
- public $displayField = 'Name';
+ public $displayField = 'Username';
+
+
+ //The Associations below have been created with all possible keys, those that are not needed can be removed
+
+/**
+ * belongsTo associations
+ *
+ * @var array
+ */
+ public $belongsTo = array(
+ /*'Monitor' => array(
+ 'className' => 'Monitor',
+ 'foreignKey' => 'MonitorId',
+ 'conditions' => '',
+ 'fields' => '',
+ 'order' => ''
+ )
+*/
+ );
+
+/**
+ * hasMany associations
+ *
+ * @var array
+ */
+ public $hasMany = array(
+/*
+ 'Frame' => array(
+ 'className' => 'Frame',
+ 'foreignKey' => 'UserId',
+ 'dependent' => true,
+ 'conditions' => '',
+ 'fields' => '',
+ 'order' => '',
+ 'limit' => '',
+ 'offset' => '',
+ 'exclusive' => '',
+ 'finderQuery' => '',
+ 'counterQuery' => ''
+ )
+*/
+ );
}
diff --git a/web/api/app/View/Users/add.ctp b/web/api/app/View/Users/add.ctp
new file mode 100644
index 000000000..fc374d5ca
--- /dev/null
+++ b/web/api/app/View/Users/add.ctp
@@ -0,0 +1,15 @@
+
+
+Form->create('User'); ?>
+
+
+ Form->input('username');
+ echo $this->Form->input('password');
+ echo $this->Form->input('role', array(
+ 'options' => array('admin' => 'Admin', 'author' => 'Author')
+ ));
+ ?>
+
+Form->end(__('Submit')); ?>
+
+
diff --git a/web/api/app/View/Users/json/index.ctp b/web/api/app/View/Users/json/index.ctp
new file mode 100644
index 000000000..b425392b0
--- /dev/null
+++ b/web/api/app/View/Users/json/index.ctp
@@ -0,0 +1,5 @@
+Paginator->params();
+ echo json_encode($array);
+?>
diff --git a/web/api/app/View/Users/json/view.ctp b/web/api/app/View/Users/json/view.ctp
new file mode 100644
index 000000000..35fe5faa9
--- /dev/null
+++ b/web/api/app/View/Users/json/view.ctp
@@ -0,0 +1 @@
+echo json_encode($user);
diff --git a/web/api/app/View/Users/login.ctp b/web/api/app/View/Users/login.ctp
new file mode 100644
index 000000000..335ad3108
--- /dev/null
+++ b/web/api/app/View/Users/login.ctp
@@ -0,0 +1,13 @@
+
+Session->flash('auth'); ?>
+Form->create('User'); ?>
+
+
+
+
+ Form->input('username');
+ echo $this->Form->input('password');
+ ?>
+
+Form->end(__('Login')); ?>
+
diff --git a/web/api/app/View/Users/xml/index.ctp b/web/api/app/View/Users/xml/index.ctp
new file mode 100644
index 000000000..af960238f
--- /dev/null
+++ b/web/api/app/View/Users/xml/index.ctp
@@ -0,0 +1,2 @@
+$xml = Xml::fromArray(array('response' => $events));
+echo $xml->asXML();
diff --git a/web/api/app/View/Users/xml/view.ctp b/web/api/app/View/Users/xml/view.ctp
new file mode 100644
index 000000000..7f64e422f
--- /dev/null
+++ b/web/api/app/View/Users/xml/view.ctp
@@ -0,0 +1,2 @@
+$xml = Xml::fromArray(array('response' => $event));
+echo $xml->asXML();
diff --git a/web/includes/Control.php b/web/includes/Control.php
index de5f221ff..74beeca05 100644
--- a/web/includes/Control.php
+++ b/web/includes/Control.php
@@ -12,6 +12,9 @@ private $defaults = array(
'CanMoveRel' => 0,
'CanMoveCon' => 0,
'CanPan' => 0,
+ 'CanReset' => 0,
+ 'CanSleep' => 0,
+ 'CanWake' => 0,
'MinPanRange' => NULL,
'MaxPanRange' => NULL,
'MinPanStep' => NULL,
@@ -103,7 +106,7 @@ private $defaults = array(
if ( $IdOrRow ) {
$row = NULL;
if ( is_integer( $IdOrRow ) or is_numeric( $IdOrRow ) ) {
- $row = dbFetchOne( 'SELECT * FROM Control WHERE Id=?', NULL, array( $IdOrRow ) );
+ $row = dbFetchOne( 'SELECT * FROM Controls WHERE Id=?', NULL, array( $IdOrRow ) );
if ( ! $row ) {
Error("Unable to load Control record for Id=" . $IdOrRow );
}
diff --git a/web/includes/Event.php b/web/includes/Event.php
index d7ce25dc4..18adff226 100644
--- a/web/includes/Event.php
+++ b/web/includes/Event.php
@@ -246,7 +246,7 @@ class Event {
if ( is_null($new) or ( $new != '' ) ) {
$this->{'DiskSpace'} = $new;
}
- if ( null === $this->{'DiskSpace'} ) {
+ if ( (!array_key_exists('DiskSpace',$this)) or (null === $this->{'DiskSpace'}) ) {
$this->{'DiskSpace'} = folder_size($this->Path());
dbQuery('UPDATE Events SET DiskSpace=? WHERE Id=?', array($this->{'DiskSpace'}, $this->{'Id'}));
}
diff --git a/web/includes/Filter.php b/web/includes/Filter.php
index de51b9876..721302edb 100644
--- a/web/includes/Filter.php
+++ b/web/includes/Filter.php
@@ -20,7 +20,7 @@ public $defaults = array(
'limit' => 100,
'Query' => array(),
'sort_field' => ZM_WEB_EVENT_SORT_FIELD,
- 'sort_asc' => ZM_WEB_EVENT_SORT_ORDER == 'asc' ? 'asc' : 'desc',
+ 'sort_asc' => ZM_WEB_EVENT_SORT_ORDER,
);
public function __construct( $IdOrRow=NULL ) {
diff --git a/web/includes/Monitor.php b/web/includes/Monitor.php
index 8f43cda9f..fc33988a7 100644
--- a/web/includes/Monitor.php
+++ b/web/includes/Monitor.php
@@ -9,8 +9,10 @@ private $defaults = array(
'Name' => '',
'StorageId' => 0,
'ServerId' => 0,
+ 'Type' => 'Ffmpeg',
'Function' => 'None',
'Enabled' => 1,
+ 'LinkedMonitors' => null,
'Width' => null,
'Height' => null,
'Orientation' => null,
@@ -20,9 +22,9 @@ private $defaults = array(
'OutputContainer' => 'auto',
'ZoneCount' => 0,
'Triggers' => null,
- 'Type' => 'Ffmpeg',
'MaxFPS' => null,
'AlarmMaxFPS' => null,
+ 'Refresh' => null,
);
private $status_fields = array(
'AnalysisFPS' => null,
@@ -218,7 +220,7 @@ private $control_fields = array(
if ( ZM_OPT_USE_AUTH ) {
if ( ZM_AUTH_RELAY == 'hashed' ) {
- $args['auth'] = generateAuthHash( ZM_AUTH_HASH_IPS );
+ $args['auth'] = generateAuthHash(ZM_AUTH_HASH_IPS);
} elseif ( ZM_AUTH_RELAY == 'plain' ) {
$args['user'] = $_SESSION['username'];
$args['pass'] = $_SESSION['password'];
@@ -338,13 +340,13 @@ private $control_fields = array(
}
if ( $mode == 'stop' ) {
- daemonControl( 'stop', 'zmc', $zmcArgs );
+ daemonControl('stop', 'zmc', $zmcArgs);
} else {
if ( $mode == 'restart' ) {
- daemonControl( 'stop', 'zmc', $zmcArgs );
+ daemonControl('stop', 'zmc', $zmcArgs);
}
if ( $this->{'Function'} != 'None' ) {
- daemonControl( 'start', 'zmc', $zmcArgs );
+ daemonControl('start', 'zmc', $zmcArgs);
}
}
} else if ( $this->ServerId() ) {
@@ -381,6 +383,8 @@ private $control_fields = array(
} catch ( Exception $e ) {
Error("Except $e thrown trying to restart zmc");
}
+ } else {
+ Error("Server not assigned to Monitor in a multi-server setup. Please assign a server to the Monitor.");
}
} // end function zmcControl
@@ -388,9 +392,9 @@ private $control_fields = array(
if ( (!defined('ZM_SERVER_ID')) or ( array_key_exists('ServerId', $this) and (ZM_SERVER_ID==$this->{'ServerId'}) ) ) {
if ( $this->{'Function'} == 'None' || $this->{'Function'} == 'Monitor' || $mode == 'stop' ) {
if ( ZM_OPT_CONTROL ) {
- daemonControl( 'stop', 'zmtrack.pl', '-m '.$this->{'Id'} );
+ daemonControl('stop', 'zmtrack.pl', '-m '.$this->{'Id'});
}
- daemonControl( 'stop', 'zma', '-m '.$this->{'Id'} );
+ daemonControl('stop', 'zma', '-m '.$this->{'Id'});
} else {
if ( $mode == 'restart' ) {
if ( ZM_OPT_CONTROL ) {
@@ -407,7 +411,8 @@ private $control_fields = array(
}
}
} // end if we are on the recording server
- }
+ } // end public function zmaControl
+
public function GroupIds( $new='') {
if ( $new != '' ) {
if(!is_array($new)) {
@@ -468,6 +473,8 @@ private $control_fields = array(
$this->{'Storage'} = isset($this->{'StorageId'}) ?
Storage::find_one(array('Id'=>$this->{'StorageId'})) :
new Storage(NULL);
+ if ( ! $this->{'Storage'} )
+ $this->{'Storage'} = new Storage(NULL);
}
return $this->{'Storage'};
}
@@ -485,14 +492,20 @@ private $control_fields = array(
$source = preg_replace( '/^.*\//', '', $this->{'Path'} );
} elseif ( $this->{'Type'} == 'Ffmpeg' || $this->{'Type'} == 'Libvlc' || $this->{'Type'} == 'WebSite' ) {
$url_parts = parse_url( $this->{'Path'} );
- unset($url_parts['user']);
- unset($url_parts['pass']);
- #unset($url_parts['scheme']);
- unset($url_parts['query']);
- #unset($url_parts['path']);
- if ( isset($url_parts['port']) and ( $url_parts['port'] == '80' or $url_parts['port'] == '554' ) )
- unset($url_parts['port']);
- $source = unparse_url($url_parts);
+ if ( ZM_WEB_FILTER_SOURCE == "Hostname" ) { # Filter out everything but the hostname
+ $source = $url_parts['host'];
+ } elseif ( ZM_WEB_FILTER_SOURCE == "NoCredentials" ) { # Filter out sensitive and common items
+ unset($url_parts['user']);
+ unset($url_parts['pass']);
+ #unset($url_parts['scheme']);
+ unset($url_parts['query']);
+ #unset($url_parts['path']);
+ if ( isset($url_parts['port']) and ( $url_parts['port'] == '80' or $url_parts['port'] == '554' ) )
+ unset($url_parts['port']);
+ $source = unparse_url($url_parts);
+ } else { # Don't filter anything
+ $source = $this->{'Path'};
+ }
}
if ( $source == '' ) {
$source = 'Monitor ' . $this->{'Id'};
diff --git a/web/includes/Server.php b/web/includes/Server.php
index d76984598..591563b52 100644
--- a/web/includes/Server.php
+++ b/web/includes/Server.php
@@ -1,5 +1,5 @@
{'disk_total_space'} = disk_total_space($this->Path());
+ if ( !array_key_exists('disk_total_space', $this) ) {
+ $path = $this->Path();
+ if ( file_exists($path) ) {
+ $this->{'disk_total_space'} = disk_total_space($path);
+ } else {
+ Error("Path $path does not exist.");
+ $this->{'disk_total_space'} = 0;
+ }
}
return $this->{'disk_total_space'};
}
public function disk_used_space() {
# This isn't a function like this in php, so we have to add up the space used in each event.
- if ( (! array_key_exists('disk_used_space', $this)) or (!$this->{'disk_used_space'}) ) {
+ if ( ( !array_key_exists('disk_used_space', $this)) or !$this->{'disk_used_space'} ) {
if ( $this->{'Type'} == 's3fs' ) {
$this->{'disk_used_space'} = $this->disk_event_space();
} else {
$path = $this->Path();
- $this->{'disk_used_space'} = disk_total_space($path) - disk_free_space($path);
+ if ( file_exists($path) ) {
+ $this->{'disk_used_space'} = disk_total_space($path) - disk_free_space($path);
+ } else {
+ Error("Path $path does not exist.");
+ $this->{'disk_used_space'} = 0;
+ }
}
}
return $this->{'disk_used_space'};
diff --git a/web/includes/actions.php b/web/includes/actions.php
index 89d87ae0e..04fc6fbab 100644
--- a/web/includes/actions.php
+++ b/web/includes/actions.php
@@ -114,23 +114,23 @@ if ( $action == 'login' && isset($_REQUEST['username']) && ( ZM_AUTH_TYPE == 're
// as it produces the same error as when you don't answer a recaptcha
if (isset($responseData['error-codes']) && is_array($responseData['error-codes'])) {
if (!in_array('invalid-input-secret',$responseData['error-codes'])) {
- Error ('reCaptcha authentication failed');
+ Error('reCaptcha authentication failed');
userLogout();
$view='login';
$refreshParent = true;
+ return;
} else {
//Let them login but show an error
echo '';
- Error ('Invalid recaptcha secret detected');
+ Error('Invalid recaptcha secret detected');
}
}
} // end if success==false
-
} // end if using reCaptcha
- $username = validStr( $_REQUEST['username'] );
+ $username = validStr($_REQUEST['username']);
$password = isset($_REQUEST['password'])?validStr($_REQUEST['password']):'';
- userLogin( $username, $password );
+ userLogin($username, $password);
$refreshParent = true;
$view = 'console';
$redirect = ZM_BASE_URL.$_SERVER['PHP_SELF'].'?view=console';
@@ -476,15 +476,12 @@ if ( canEdit( 'Monitors' ) ) {
);
if ( $_REQUEST['newMonitor']['ServerId'] == 'auto' ) {
- Logger::Debug("Auto selecting server");
$_REQUEST['newMonitor']['ServerId'] = dbFetchOne('SELECT Id FROM Servers WHERE Status=\'Running\' ORDER BY FreeMem DESC, CpuLoad ASC LIMIT 1', 'Id');
Logger::Debug("Auto selecting server: Got " . $_REQUEST['newMonitor']['ServerId'] );
if ( ( ! $_REQUEST['newMonitor'] ) and defined('ZM_SERVER_ID') ) {
$_REQUEST['newMonitor']['ServerId'] = ZM_SERVER_ID;
Logger::Debug("Auto selecting server to " . ZM_SERVER_ID);
}
- } else {
- Logger::Debug("NOT Auto selecting server" . $_REQUEST['newMonitor']['ServerId']);
}
$columns = getTableColumns('Monitors');
@@ -495,8 +492,8 @@ if ( canEdit( 'Monitors' ) ) {
# If we change anything that changes the shared mem size, zma can complain. So let's stop first.
if ( $monitor['Type'] != 'WebSite' ) {
- zmaControl( $monitor, 'stop' );
- zmcControl( $monitor, 'stop' );
+ zmaControl($monitor, 'stop');
+ zmcControl($monitor, 'stop');
}
dbQuery( 'UPDATE Monitors SET '.implode( ', ', $changes ).' WHERE Id=?', array($mid) );
// Groups will be added below
@@ -570,23 +567,26 @@ if ( canEdit( 'Monitors' ) ) {
}
$restart = true;
+ } else {
+ Logger::Debug("No action due to no changes to Monitor");
} # end if count(changes)
- if (
- ( !isset($_POST['newMonitor']['GroupIds']) )
- or
- ( count($_POST['newMonitor']['GroupIds']) != count($Monitor->GroupIds()) )
- or
- array_diff($_POST['newMonitor']['GroupIds'], $Monitor->GroupIds())
- ) {
- if ( $Monitor->Id() )
- dbQuery('DELETE FROM Groups_Monitors WHERE MonitorId=?', array($mid));
- if ( isset($_POST['newMonitor']['GroupIds']) ) {
- foreach ( $_POST['newMonitor']['GroupIds'] as $group_id ) {
- dbQuery('INSERT INTO Groups_Monitors (GroupId,MonitorId) VALUES (?,?)', array($group_id, $mid));
- }
+ if (
+ ( !isset($_POST['newMonitor']['GroupIds']) )
+ or
+ ( count($_POST['newMonitor']['GroupIds']) != count($Monitor->GroupIds()) )
+ or
+ array_diff($_POST['newMonitor']['GroupIds'], $Monitor->GroupIds())
+ ) {
+ if ( $Monitor->Id() )
+ dbQuery('DELETE FROM Groups_Monitors WHERE MonitorId=?', array($mid));
+
+ if ( isset($_POST['newMonitor']['GroupIds']) ) {
+ foreach ( $_POST['newMonitor']['GroupIds'] as $group_id ) {
+ dbQuery('INSERT INTO Groups_Monitors (GroupId,MonitorId) VALUES (?,?)', array($group_id, $mid));
}
- } // end if there has been a change of groups
+ }
+ } // end if there has been a change of groups
if ( ZM_OPT_X10 ) {
$x10Changes = getFormChanges( $x10Monitor, $_REQUEST['newX10Monitor'] );
@@ -732,7 +732,7 @@ if ( canEdit( 'System' ) ) {
$_SESSION['zmMontageLayout'] = $Layout->Id();
setcookie('zmMontageLayout', $Layout->Id(), 1 );
session_write_close();
- $redirect = ZM_BASE_URL.$_SERVER['PHP_SELF'].'?view=montagereview';
+ $redirect = ZM_BASE_URL.$_SERVER['PHP_SELF'].'?view=montage';
} // end if save
} else if ( $_REQUEST['object'] == 'server' ) {
diff --git a/web/includes/auth.php b/web/includes/auth.php
index 297dcaec9..9cf8d37c1 100644
--- a/web/includes/auth.php
+++ b/web/includes/auth.php
@@ -19,7 +19,7 @@
//
function userLogin($username, $password='', $passwordHashed=false) {
- global $user, $cookies;
+ global $user;
$sql = 'SELECT * FROM Users WHERE Enabled=1';
$sql_values = NULL;
@@ -34,7 +34,12 @@ function userLogin($username, $password='', $passwordHashed=false) {
$sql .= ' AND Username=?';
$sql_values = array($username);
}
- session_start();
+ $close_session = 0;
+ if ( !is_session_started() ) {
+ Logger::Debug("Starting session in userLogin");
+ session_start();
+ $close_session = 1;
+ }
$_SESSION['username'] = $username;
if ( ZM_AUTH_RELAY == 'plain' ) {
// Need to save this in session
@@ -54,7 +59,9 @@ function userLogin($username, $password='', $passwordHashed=false) {
$_SESSION['loginFailed'] = true;
unset($user);
}
- session_write_close();
+ if ( $close_session )
+ session_write_close();
+ return isset($user) ? $user: null;
} # end function userLogin
function userLogout() {
@@ -103,13 +110,13 @@ function getAuthUser($auth) {
return false;
} // end getAuthUser($auth)
-function generateAuthHash($useRemoteAddr) {
+function generateAuthHash($useRemoteAddr, $force=false) {
if ( ZM_OPT_USE_AUTH and ZM_AUTH_RELAY == 'hashed' and isset($_SESSION['username']) and $_SESSION['passwordHash'] ) {
# regenerate a hash at half the liftetime of a hash, an hour is 3600 so half is 1800
$time = time();
$mintime = $time - ( ZM_AUTH_HASH_TTL * 1800 );
- if ( ( !isset($_SESSION['AuthHash']) ) or ( $_SESSION['AuthHashGeneratedAt'] < $mintime ) ) {
+ if ( $force or ( !isset($_SESSION['AuthHash']) ) or ( $_SESSION['AuthHashGeneratedAt'] < $mintime ) ) {
# Don't both regenerating Auth Hash if an hour hasn't gone by yet
$local_time = localtime();
$authKey = '';
@@ -120,19 +127,25 @@ function generateAuthHash($useRemoteAddr) {
}
#Logger::Debug("Generated using hour:".$local_time[2] . ' mday:' . $local_time[3] . ' month:'.$local_time[4] . ' year: ' . $local_time[5] );
$auth = md5($authKey);
- session_start();
- $_SESSION['AuthHash'] = $auth;
- $_SESSION['AuthHashGeneratedAt'] = $time;
- session_write_close();
+ if ( !$force ) {
+ $close_session = 0;
+ if ( !is_session_started() ) {
+ session_start();
+ $close_session = 1;
+ }
+ $_SESSION['AuthHash'] = $auth;
+ $_SESSION['AuthHashGeneratedAt'] = $time;
+ session_write_close();
+ } else {
+ return $auth;
+ }
#Logger::Debug("Generated new auth $auth at " . $_SESSION['AuthHashGeneratedAt']. " using $authKey" );
- #} else {
+ #} else {
#Logger::Debug("Using cached auth " . $_SESSION['AuthHash'] ." beacuse generatedat:" . $_SESSION['AuthHashGeneratedAt'] . ' < now:'. $time . ' - ' . ZM_AUTH_HASH_TTL . ' * 1800 = '. $mintime);
} # end if AuthHash is not cached
return $_SESSION['AuthHash'];
- } else {
- $auth = '';
- }
- return $auth;
+ } # end if using AUTH and AUTH_RELAY
+ return '';
}
function visibleMonitor($mid) {
@@ -153,4 +166,17 @@ function canEdit($area, $mid=false) {
return ( $user[$area] == 'Edit' && ( !$mid || visibleMonitor($mid) ));
}
+function is_session_started() {
+ if ( php_sapi_name() !== 'cli' ) {
+ if ( version_compare(phpversion(), '5.4.0', '>=') ) {
+ return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
+ } else {
+ return session_id() === '' ? FALSE : TRUE;
+ }
+ } else {
+ Warning("php_sapi_name === 'cli'");
+ }
+ return FALSE;
+}
+
?>
diff --git a/web/includes/functions.php b/web/includes/functions.php
index 20d8e2db4..5af957004 100644
--- a/web/includes/functions.php
+++ b/web/includes/functions.php
@@ -227,7 +227,7 @@ function getImageStreamHTML( $id, $src, $width, $height, $title='' ) {
if ( canStreamIframe() ) {
return '';
} else {
- return ' ';
+ return ' ';
}
}
@@ -334,11 +334,11 @@ function getZmuCommand( $args ) {
if ( ZM_OPT_USE_AUTH ) {
if ( ZM_AUTH_RELAY == 'hashed' ) {
- $zmuCommand .= ' -A '.generateAuthHash( false );
+ $zmuCommand .= ' -A '.generateAuthHash(false, true);
} elseif ( ZM_AUTH_RELAY == 'plain' ) {
$zmuCommand .= ' -U ' .escapeshellarg($_SESSION['username']).' -P '.escapeshellarg($_SESSION['password']);
} elseif ( ZM_AUTH_RELAY == 'none' ) {
- $zmuCommand .= " -U ".escapeshellarg($_SESSION['username']);
+ $zmuCommand .= ' -U '.escapeshellarg($_SESSION['username']);
}
}
@@ -355,7 +355,7 @@ function getEventDefaultVideoPath( $event ) {
function deletePath( $path ) {
if ( is_dir( $path ) ) {
system( escapeshellcmd( 'rm -rf '.$path ) );
- } else {
+ } else if ( file_exists($path) ) {
unlink( $path );
}
}
@@ -432,20 +432,38 @@ function htmlSelect( $name, $contents, $values, $behaviours=false ) {
}
}
- return "".htmlOptions( $contents, $values ).' ';
+ return "".htmlOptions($contents, $values).' ';
}
-function htmlOptions( $contents, $values ) {
- $html = '';
- foreach ( $contents as $value=>$text ) {
- if ( is_array( $text ) )
- $text = $text['Name'];
- else if ( is_object( $text ) )
- $text = $text->Name();
- $selected = is_array( $values ) ? in_array( $value, $values ) : !strcmp($value, $values);
- $html .= "$text ";
+function htmlOptions($contents, $values) {
+ $options_html = '';
+
+ foreach ( $contents as $value=>$option ) {
+ $disabled = 0;
+ $text = '';
+ if ( is_array($option) ) {
+
+ if ( isset($option['Name']) )
+ $text = $option['Name'];
+ else if ( isset($option['text']) )
+ $text = $option['text'];
+
+ if ( isset($option['disabled']) ) {
+ $disabled = $option['disabled'];
+ Error("Setting to disabled");
+ }
+ } else if ( is_object($option) ) {
+ $text = $option->Name();
+ } else {
+ $text = $option;
+ }
+ $selected = is_array($values) ? in_array($value, $values) : !strcmp($value, $values);
+ $options_html .= "$text ";
}
- return $html;
+ return $options_html;
}
function truncText( $text, $length, $deslash=1 ) {
@@ -2063,7 +2081,7 @@ function cache_bust( $file ) {
global $css;
$dirname = preg_replace( '/\//', '_', $parts['dirname'] );
$cacheFile = $dirname.'_'.$parts['filename'].'-'.$css.'-'.filemtime($file).'.'.$parts['extension'];
- if ( file_exists( ZM_DIR_CACHE.'/'.$cacheFile ) or symlink( ZM_PATH_WEB.'/'.$file, ZM_DIR_CACHE.'/'.$cacheFile ) ) {
+ if ( file_exists(ZM_DIR_CACHE.'/'.$cacheFile) or symlink(ZM_PATH_WEB.'/'.$file, ZM_DIR_CACHE.'/'.$cacheFile) ) {
return 'cache/'.$cacheFile;
} else {
Warning("Failed linking $file to $cacheFile");
@@ -2137,15 +2155,15 @@ function getStreamHTML( $monitor, $options = array() ) {
if ( isset($options['scale']) and $options['scale'] and ( $options['scale'] != 100 ) ) {
//Warning("Scale to " . $options['scale'] );
- $options['width'] = reScale( $monitor->Width(), $options['scale'] ) . 'px';
- $options['height'] = reScale( $monitor->Height(), $options['scale'] ) . 'px';
+ $options['width'] = reScale( $monitor->Width(), $options['scale'] );
+ $options['height'] = reScale( $monitor->Height(), $options['scale'] );
} else {
# scale is empty or 100
# There may be a fixed width applied though, in which case we need to leave the height empty
if ( ! ( isset($options['width']) and $options['width'] ) ) {
- $options['width'] = $monitor->Width() . 'px';
+ $options['width'] = $monitor->Width();
if ( ! ( isset($options['height']) and $options['height'] ) ) {
- $options['height'] = $monitor->Height() . 'px';
+ $options['height'] = $monitor->Height();
}
} else if ( ! isset($options['height']) ) {
$options['height'] = '';
@@ -2159,12 +2177,13 @@ function getStreamHTML( $monitor, $options = array() ) {
$options['buffer'] = $monitor->StreamReplayBuffer();
//Warning("width: " . $options['width'] . ' height: ' . $options['height']. ' scale: ' . $options['scale'] );
- if ( $monitor->Type() == "WebSite" ) {
- return getWebSiteUrl( 'liveStream'.$monitor->Id(), $monitor->Path(),
- ( isset($options['width']) ? $options['width'] : NULL ),
- ( isset($options['height']) ? $options['height'] : NULL ),
- $monitor->Name()
- );
+ if ( $monitor->Type() == 'WebSite' ) {
+ return getWebSiteUrl(
+ 'liveStream'.$monitor->Id(), $monitor->Path(),
+ ( isset($options['width']) ? $options['width'] : NULL ),
+ ( isset($options['height']) ? $options['height'] : NULL ),
+ $monitor->Name()
+ );
//FIXME, the width and height of the image need to be scaled.
} else if ( ZM_WEB_STREAM_METHOD == 'mpeg' && ZM_MPEG_LIVE_FORMAT ) {
$streamSrc = $monitor->getStreamSrc( array(
@@ -2177,7 +2196,7 @@ function getStreamHTML( $monitor, $options = array() ) {
return getVideoStreamHTML( 'liveStream'.$monitor->Id(), $streamSrc, $options['width'], $options['height'], ZM_MPEG_LIVE_FORMAT, $monitor->Name() );
} else if ( $options['mode'] == 'stream' and canStream() ) {
$options['mode'] = 'jpeg';
- $streamSrc = $monitor->getStreamSrc( $options );
+ $streamSrc = $monitor->getStreamSrc($options);
if ( canStreamNative() )
return getImageStreamHTML( 'liveStream'.$monitor->Id(), $streamSrc, $options['width'], $options['height'], $monitor->Name());
diff --git a/web/index.php b/web/index.php
index 473a065ae..1451b3726 100644
--- a/web/index.php
+++ b/web/index.php
@@ -51,7 +51,12 @@ require_once( 'includes/Event.php' );
require_once( 'includes/Group.php' );
require_once( 'includes/Monitor.php' );
-if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) {
+
+if (
+ (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')
+ or
+ (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
+) {
$protocol = 'https';
} else {
$protocol = 'http';
@@ -200,7 +205,7 @@ isset($view) || $view = NULL;
isset($request) || $request = NULL;
isset($action) || $action = NULL;
-if ( ZM_ENABLE_CSRF_MAGIC && $action != 'login' && $view != 'view_video' && $view != 'video' && $request != 'control' && $view != 'frames' && $view != 'archive' ) {
+if ( ZM_ENABLE_CSRF_MAGIC && $action != 'login' && $view != 'view_video' && $request != 'control' && $view != 'frames' && $view != 'archive' ) {
require_once( 'includes/csrf/csrf-magic.php' );
#Logger::Debug("Calling csrf_check with the following values: \$request = \"$request\", \$view = \"$view\", \$action = \"$action\"");
csrf_check();
diff --git a/web/lang/en_gb.php b/web/lang/en_gb.php
index 9042fe839..7b01020f3 100644
--- a/web/lang/en_gb.php
+++ b/web/lang/en_gb.php
@@ -324,6 +324,7 @@ $SLANG = array(
'Exclude' => 'Exclude',
'Execute' => 'Execute',
'ExportDetails' => 'Export Event Details',
+ 'ExportMatches' => 'Export Matches',
'Exif' => 'Embed EXIF data into image',
'Export' => 'Export',
'DownloadVideo' => 'Download Video',
@@ -662,6 +663,7 @@ $SLANG = array(
'ShowFilterWindow' => 'Show Filter Window',
'ShowTimeline' => 'Show Timeline',
'SignalCheckColour' => 'Signal Check Colour',
+ 'SignalCheckPoints' => 'Signal Check Points',
'Size' => 'Size',
'SkinDescription' => 'Change the skin for this session',
'CSSDescription' => 'Change the css for this session',
@@ -696,6 +698,7 @@ $SLANG = array(
'Stills' => 'Stills',
'Stopped' => 'Stopped',
'Stop' => 'Stop',
+ 'StorageArea' => 'Storage Area',
'StorageScheme' => 'Scheme',
'StreamReplayBuffer' => 'Stream Replay Image Buffer',
'Stream' => 'Stream',
diff --git a/web/lang/es_ar.php b/web/lang/es_ar.php
index e723af417..cbb3c2d88 100644
--- a/web/lang/es_ar.php
+++ b/web/lang/es_ar.php
@@ -60,10 +60,10 @@ $SLANG = array(
'AttrDateTime' => 'Fecha/Hora',
'AttrDiskBlocks' => 'Disk Blocks',
'AttrDiskPercent' => 'Disk Percent',
- 'AttrDuration' => 'Duración',
+ 'AttrDuration' => 'Duración',
'AttrFrames' => 'Cuadros',
'AttrId' => 'Id',
- 'AttrMaxScore' => 'Puntaje Máximo',
+ 'AttrMaxScore' => 'Puntaje Máximo',
'AttrMonitorId' => 'Monitor Id',
'AttrMonitorName' => 'Nombre Monitor',
'AttrName' => 'Name',
@@ -71,7 +71,7 @@ $SLANG = array(
'AttrSystemLoad' => 'System Load',
'AttrTime' => 'Hora',
'AttrTotalScore' => 'Puntaje Total',
- 'AttrWeekday' => 'Día Semana',
+ 'AttrWeekday' => 'DÃa Semana',
'Auto' => 'Auto',
'AutoStopTimeout' => 'Auto Stop Timeout',
'Available' => 'Available', // Added - 2009-03-31
@@ -95,7 +95,7 @@ $SLANG = array(
'BadLabelY' => 'Label Y co-ordinate must be set to an integer of zero or more',
'BadMaxFPS' => 'Maximum FPS must be a positive integer or floating point value',
'BadMotionFrameSkip' => 'Motion Frame skip count must be an integer of zero or more',
- 'BadNameChars' => 'Los nombres pueden contener solamente caracteres alfanuméricos más el guión y la raya',
+ 'BadNameChars' => 'Los nombres pueden contener solamente caracteres alfanuméricos más el guión y la raya',
'BadPalette' => 'Palette must be set to a valid value', // Added - 2009-03-31
'BadPath' => 'Path must be set to a valid value',
'BadPort' => 'Port must be set to a valid number',
@@ -177,7 +177,7 @@ $SLANG = array(
'Config' => 'Config.',
'ConfiguredFor' => 'Configurado Para',
'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?',
- 'ConfirmPassword' => 'Confirmar Contraseña',
+ 'ConfirmPassword' => 'Confirmar Contraseña',
'ConjAnd' => 'y',
'ConjOr' => 'o',
'Console' => 'Console',
@@ -195,7 +195,7 @@ $SLANG = array(
'Cycle' => 'Cycle',
'CycleWatch' => 'Cycle Watch',
'DateTime' => 'Date/Time', // Added - 2011-06-16
- 'Day' => 'Día',
+ 'Day' => 'DÃa',
'Debug' => 'Debug',
'DefaultRate' => 'Default Rate',
'DefaultScale' => 'Default Scale',
@@ -203,15 +203,15 @@ $SLANG = array(
'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18
'Delay' => 'Delay', // Added - 2015-04-18
'Delete' => 'Borrar',
- 'DeleteAndNext' => 'Borrar & Próximo',
+ 'DeleteAndNext' => 'Borrar & Próximo',
'DeleteAndPrev' => 'Borrar & Anterior',
'DeleteSavedFilter' => 'Borrar Filtro Guardado',
- 'Description' => 'Descripción',
+ 'Description' => 'Descripción',
'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31
'DetectedProfiles' => 'Detected Profiles', // Added - 2015-04-18
'Device' => 'Device', // Added - 2009-02-08
'DeviceChannel' => 'Canal',
- 'DeviceFormat' => 'Señal',
+ 'DeviceFormat' => 'Señal',
'DeviceNumber' => 'Fuente',
'DevicePath' => 'Device Path',
'Devices' => 'Devices',
@@ -232,15 +232,15 @@ $SLANG = array(
'DonateYes' => 'Yes, I\'d like to donate now',
'Download' => 'Download',
'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31
- 'Duration' => 'Duración',
+ 'Duration' => 'Duración',
'Edit' => 'Editar',
'Email' => 'Email',
'EnableAlarms' => 'Enable Alarms',
'Enabled' => 'Habilitado',
'EnterNewFilterName' => 'Ingresar Nuevo Nombre De Filtro',
'Error' => 'Error',
- 'ErrorBrackets' => 'Error, Revisar si tiene la misma cantidad de paréntesis de apertura',
- 'ErrorValidValue' => 'Error, Revisar si los términos tienen nombres validos',
+ 'ErrorBrackets' => 'Error, Revisar si tiene la misma cantidad de paréntesis de apertura',
+ 'ErrorValidValue' => 'Error, Revisar si los términos tienen nombres validos',
'Etc' => 'etc',
'Event' => 'Evento',
'EventFilter' => 'Filtro de Evento',
@@ -302,7 +302,7 @@ $SLANG = array(
'FrameSkip' => 'Saltear Cuadro',
'Frames' => 'Cuadros',
'Func' => 'Func',
- 'Function' => 'Función',
+ 'Function' => 'Función',
'Gain' => 'Gain',
'General' => 'General',
'GenerateVideo' => 'Crear Video',
@@ -326,12 +326,12 @@ $SLANG = array(
'HighBW' => 'Alta B/W',
'Home' => 'Home',
'Hour' => 'Hora',
- 'Hue' => 'Saturación',
+ 'Hue' => 'Saturación',
'Id' => 'Id',
'Idle' => 'Pasivo',
'Ignore' => 'Ignorar',
'Image' => 'Imagen',
- 'ImageBufferSize' => 'Tamaño del Buffer de Imagen',
+ 'ImageBufferSize' => 'Tamaño del Buffer de Imagen',
'Images' => 'Images',
'In' => 'In',
'Include' => 'Incluir',
@@ -434,7 +434,7 @@ $SLANG = array(
'MonitorProbe' => 'Monitor Probe', // Added - 2009-03-31
'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection. Select the desired entry from the list below. Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor. ', // Added - 2009-03-31
'Monitors' => 'Monitores',
- 'Montage' => 'Cámara Múltiple',
+ 'Montage' => 'Cámara Múltiple',
'Month' => 'Mes',
'More' => 'More', // Added - 2011-06-16
'MotionFrameSkip' => 'Motion Frame Skip',
@@ -446,8 +446,8 @@ $SLANG = array(
'MtgDefault' => 'Default', // Added 2013.08.15.
'MustBeGe' => 'Debe ser mayor o igual que',
'MustBeLe' => 'Debe ser menor o igual que',
- 'MustConfirmPassword' => 'Debe confirmar la contraseña',
- 'MustSupplyPassword' => 'Debe ingresar una contraseña',
+ 'MustConfirmPassword' => 'Debe confirmar la contraseña',
+ 'MustSupplyPassword' => 'Debe ingresar una contraseña',
'MustSupplyUsername' => 'You must supply a username', // Added - 2009-02-08
'Name' => 'Nombre',
'Near' => 'Near',
@@ -455,7 +455,7 @@ $SLANG = array(
'New' => 'Nuevo',
'NewGroup' => 'New Group',
'NewLabel' => 'New Label',
- 'NewPassword' => 'Nueva Contraseña',
+ 'NewPassword' => 'Nueva Contraseña',
'NewState' => 'Nuevo Estado',
'NewUser' => 'Nuevo Usuario',
'Next' => 'Siguiente',
@@ -491,7 +491,7 @@ $SLANG = array(
'Options' => 'Opciones',
'OrEnterNewName' => 'o agregue nombre',
'Order' => 'Order',
- 'Orientation' => 'Orientación',
+ 'Orientation' => 'Orientación',
'Out' => 'Out',
'OverwriteExisting' => 'Sobreescribir Exitente',
'Paged' => 'Paged',
@@ -500,8 +500,8 @@ $SLANG = array(
'PanRight' => 'Pan Right',
'PanTilt' => 'Pan/Tilt',
'Parameter' => 'Parametro',
- 'Password' => 'Contraseña',
- 'PasswordsDifferent' => 'Las contraseñas nueva y de confirmacion son diferentes',
+ 'Password' => 'Contraseña',
+ 'PasswordsDifferent' => 'Las contraseñas nueva y de confirmacion son diferentes',
'Paths' => 'Enlaces',
'Pause' => 'Pause',
'Phone' => 'Phone',
@@ -556,7 +556,7 @@ $SLANG = array(
'RotateRight' => 'Rotar a la izquierda',
'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25
'RunMode' => 'Metodo Ejecucion',
- 'RunState' => 'Estado de Ejecución',
+ 'RunState' => 'Estado de Ejecución',
'Running' => 'Ejecutando',
'Save' => 'Guardar',
'SaveAs' => 'Guardar Como',
@@ -564,7 +564,7 @@ $SLANG = array(
'Scale' => 'Escala',
'Score' => 'Res.',
'Secs' => 'Seg',
- 'Sectionlength' => 'Longitud Sección',
+ 'Sectionlength' => 'Longitud Sección',
'Select' => 'Select',
'SelectFormat' => 'Select Format', // Added - 2011-06-17
'SelectLog' => 'Select Log', // Added - 2011-06-17
@@ -630,7 +630,7 @@ $SLANG = array(
'Today' => 'Today',
'Tools' => 'Herra.',
'Total' => 'Total', // Added - 2011-06-16
- 'TotalBrScore' => 'Total puntuación',
+ 'TotalBrScore' => 'Total puntuación',
'TrackDelay' => 'Track Delay',
'TrackMotion' => 'Track Motion',
'Triggers' => 'Gatillos',
@@ -642,8 +642,8 @@ $SLANG = array(
'Units' => 'Unidades',
'Unknown' => 'Desconocido',
'Update' => 'Update',
- 'UpdateAvailable' => 'Una Actualización a ZoneMinder esta disponible',
- 'UpdateNotNecessary' => 'No se requiere Actualización',
+ 'UpdateAvailable' => 'Una Actualización a ZoneMinder esta disponible',
+ 'UpdateNotNecessary' => 'No se requiere Actualización',
'Updated' => 'Updated', // Added - 2011-06-16
'Upload' => 'Upload', // Added - 2011-08-23
'UseFilter' => 'Usar Filtro',
@@ -657,9 +657,9 @@ $SLANG = array(
'V4LCapturesPerFrame' => 'Captures Per Frame', // Added - 2015-04-18
'V4LMultiBuffer' => 'Multi Buffering', // Added - 2015-04-18
'Value' => 'Valor',
- 'Version' => 'Versión',
- 'VersionIgnore' => 'Ignore esta versión',
- 'VersionRemindDay' => 'Recordar en 1 día',
+ 'Version' => 'Versión',
+ 'VersionIgnore' => 'Ignore esta versión',
+ 'VersionRemindDay' => 'Recordar en 1 dÃa',
'VersionRemindHour' => 'Recordar en 1 hora',
'VersionRemindNever' => 'No avizar de nuevas versiones',
'VersionRemindWeek' => 'Recordar en 1 semana',
@@ -670,7 +670,7 @@ $SLANG = array(
'VideoGenNoFiles' => 'No Video Files Found',
'VideoGenParms' => 'Parametros Generacion Video',
'VideoGenSucceeded' => 'Video Generation Succeeded!',
- 'VideoSize' => 'Tamaño Video',
+ 'VideoSize' => 'Tamaño Video',
'View' => 'Ver',
'ViewAll' => 'Ver Todo',
'ViewEvent' => 'View Event',
@@ -686,7 +686,7 @@ $SLANG = array(
'Wide' => 'Wide',
'X' => 'X',
'X10' => 'X10',
- 'X10ActivationString' => 'X10 Comando Activación',
+ 'X10ActivationString' => 'X10 Comando Activación',
'X10InputAlarmString' => 'X10 Comando Entrada Alarma',
'X10OutputAlarmString' => 'X10 Output Alarm String',
'Y' => 'Y',
diff --git a/web/lang/he_il.php b/web/lang/he_il.php
index 0d54d43e9..f8c8897a4 100644
--- a/web/lang/he_il.php
+++ b/web/lang/he_il.php
@@ -71,62 +71,62 @@ setlocale( LC_ALL, 'he_IL' ); //All locale settings 4.3.0 and after
// Simple String Replacements
$SLANG = array(
- '24BitColour' => 'öáò 24 áéè',
- '32BitColour' => 'öáò 32 áéè', // Added - 2011-06-15
- '8BitGrey' => 'âååðé àôåø 8 áéè',
- 'Action' => 'ôòåìä',
- 'Actual' => 'î÷åøé',
- 'AddNewControl' => 'äåñó ÷åðèøåì çãù',
- 'AddNewMonitor' => 'äåñó îåðéèåø çãù',
- 'AddNewUser' => 'äåñó îùúîù çãù',
- 'AddNewZone' => 'äåñó àéæåø çãù',
- 'Alarm' => 'àæò÷ä',
- 'AlarmBrFrames' => 'àæò÷ú ôøééîéí',
- 'AlarmFrame' => 'àæò÷ú ôøééîéí',
- 'AlarmFrameCount' => 'ñôéøú àæò÷åú ôøééîéí',
- 'AlarmLimits' => 'äâáìåú àæò÷ä',
+ '24BitColour' => 'öáò 24 áéè',
+ '32BitColour' => 'öáò 32 áéè', // Added - 2011-06-15
+ '8BitGrey' => 'âååðé à ôåø 8 áéè',
+ 'Action' => 'ôòåìä',
+ 'Actual' => 'î÷åøé',
+ 'AddNewControl' => 'äåñó ÷åðèøåì çãù',
+ 'AddNewMonitor' => 'äåñó îåðéèåø çãù',
+ 'AddNewUser' => 'äåñó îùúîù çãù',
+ 'AddNewZone' => 'äåñó à éæåø çãù',
+ 'Alarm' => 'à æò÷ä',
+ 'AlarmBrFrames' => 'à æò÷ú ôøééîéÃ',
+ 'AlarmFrame' => 'à æò÷ú ôøééîéÃ',
+ 'AlarmFrameCount' => 'ñôéøú à æò÷åú ôøééîéÃ',
+ 'AlarmLimits' => 'äâáìåú à æò÷ä',
'AlarmMaximumFPS' => 'Alarm Maximum FPS',
- 'AlarmPx' => 'àæò÷ú Px',
- 'AlarmRGBUnset' => 'äéðê çééá ìàúçì àæò÷ú öáò',
+ 'AlarmPx' => 'à æò÷ú Px',
+ 'AlarmRGBUnset' => 'äéðê çééá ìà úçì à æò÷ú öáò',
'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18
- 'Alert' => 'äúøàä',
- 'All' => 'äëì',
+ 'Alert' => 'äúøà ä',
+ 'All' => 'äëì',
'AnalysisFPS' => 'Analysis FPS', // Added - 2015-07-22
'AnalysisUpdateDelay' => 'Analysis Update Delay', // Added - 2015-07-23
- 'Apply' => 'äçì',
- 'ApplyingStateChange' => 'äçì ùéðåé îöá',
- 'ArchArchived' => 'àøëéá áìáã',
- 'ArchUnarchived' => 'ìà ìàøëéá áìáã',
- 'Archive' => 'àøëéá',
- 'Archived' => 'àåøëá',
- 'Area' => 'àæåø',
- 'AreaUnits' => 'àæåø (px/%)',
+ 'Apply' => 'äçì',
+ 'ApplyingStateChange' => 'äçì ùéðåé îöá',
+ 'ArchArchived' => 'à øëéá áìáã',
+ 'ArchUnarchived' => 'ìà ìà øëéá áìáã',
+ 'Archive' => 'à øëéá',
+ 'Archived' => 'à åøëá',
+ 'Area' => 'à æåø',
+ 'AreaUnits' => 'à æåø (px/%)',
'AttrAlarmFrames' => 'Alarm Frames',
'AttrArchiveStatus' => 'Archive Status',
- 'AttrAvgScore' => 'ðé÷åã îîåöò',
- 'AttrCause' => 'ñéáä',
- 'AttrDate' => 'úàøéê',
- 'AttrDateTime' => 'úàøéê/ùòä',
+ 'AttrAvgScore' => 'ðé÷åã îîåöò',
+ 'AttrCause' => 'ñéáä',
+ 'AttrDate' => 'úà øéê',
+ 'AttrDateTime' => 'úà øéê/ùòä',
'AttrDiskBlocks' => 'Disk Blocks',
'AttrDiskPercent' => 'Disk Percent',
- 'AttrDuration' => 'îùê æîï',
- 'AttrFrames' => 'ôøééîéí',
+ 'AttrDuration' => 'îùê æîï',
+ 'AttrFrames' => 'ôøééîéÃ',
'AttrId' => 'Id',
- 'AttrMaxScore' => 'ðé÷åã î÷ñéîìé',
+ 'AttrMaxScore' => 'ðé÷åã î÷ñéîìé',
'AttrMonitorId' => 'Monitor Id',
- 'AttrMonitorName' => 'ùí îåðéèåø',
- 'AttrName' => 'ùí',
- 'AttrNotes' => 'äòøåú',
+ 'AttrMonitorName' => 'ùà îåðéèåø',
+ 'AttrName' => 'ùÃ',
+ 'AttrNotes' => 'äòøåú',
'AttrSystemLoad' => 'System Load',
- 'AttrTime' => 'ùòä',
- 'AttrTotalScore' => 'ñê ñëåí',
- 'AttrWeekday' => 'éåí áùáåò',
- 'Auto' => 'àåèå',
- 'AutoStopTimeout' => 'ôñ÷ æîï òöéøä àåèå',
+ 'AttrTime' => 'ùòä',
+ 'AttrTotalScore' => 'ñê ñëåÃ',
+ 'AttrWeekday' => 'éåà áùáåò',
+ 'Auto' => 'à åèå',
+ 'AutoStopTimeout' => 'ôñ÷ æîï òöéøä à åèå',
'Available' => 'Available', // Added - 2009-03-31
- 'AvgBrScore' => 'ðé÷åã îîåöò',
- 'Background' => 'ø÷ò',
- 'BackgroundFilter' => 'äøõ îñðï áø÷ò',
+ 'AvgBrScore' => 'ðé÷åã îîåöò',
+ 'Background' => 'ø÷ò',
+ 'BackgroundFilter' => 'äøõ îñðï áø÷ò',
'BadAlarmFrameCount' => 'Alarm frame count must be an integer of one or more',
'BadAlarmMaxFPS' => 'Alarm Maximum FPS must be a positive integer or floating point value',
'BadAnalysisFPS' => 'Analysis FPS must be a positive integer or floating point value', // Added - 2015-07-22
@@ -157,24 +157,24 @@ $SLANG = array(
'BadWarmupCount' => 'Warmup frames must be an integer of zero or more',
'BadWebColour' => 'Web colour must be a valid web colour string',
'BadWidth' => 'Width must be set to a valid value',
- 'Bandwidth' => 'øåçá ôñ',
+ 'Bandwidth' => 'øåçá ôñ',
'BandwidthHead' => 'Bandwidth', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing
'BlobPx' => 'Blob Px',
'BlobSizes' => 'Blob Sizes',
'Blobs' => 'Blobs',
- 'Brightness' => 'áäéøåú',
+ 'Brightness' => 'áäéøåú',
'Buffer' => 'Buffer', // Added - 2015-04-18
'Buffers' => 'Buffers',
'CSSDescription' => 'Change the default css for this computer', // Added - 2015-04-18
- 'CanAutoFocus' => 'àôùø äúî÷ãåú àåèåîèé',
+ 'CanAutoFocus' => 'à ôùø äúî÷ãåú à åèåîèé',
'CanAutoGain' => 'Can Auto Gain',
'CanAutoIris' => 'Can Auto Iris',
'CanAutoWhite' => 'Can Auto White Bal.',
- 'CanAutoZoom' => 'àôùø æåí àåèåîèé',
- 'CanFocus' => 'àôùø äúî÷ãåú',
- 'CanFocusAbs' => 'àôùø äúî÷ãåú àáñåìåèé',
- 'CanFocusCon' => 'àôùø äúî÷ãåú îúîùê',
- 'CanFocusRel' => 'àôùø äúî÷ãåú éçñé',
+ 'CanAutoZoom' => 'à ôùø æåà à åèåîèé',
+ 'CanFocus' => 'à ôùø äúî÷ãåú',
+ 'CanFocusAbs' => 'à ôùø äúî÷ãåú à áñåìåèé',
+ 'CanFocusCon' => 'à ôùø äúî÷ãåú îúîùê',
+ 'CanFocusRel' => 'à ôùø äúî÷ãåú éçñé',
'CanGain' => 'Can Gain ',
'CanGainAbs' => 'Can Gain Absolute',
'CanGainCon' => 'Can Gain Continuous',
@@ -183,136 +183,136 @@ $SLANG = array(
'CanIrisAbs' => 'Can Iris Absolute',
'CanIrisCon' => 'Can Iris Continuous',
'CanIrisRel' => 'Can Iris Relative',
- 'CanMove' => 'àôùø úðåòä',
- 'CanMoveAbs' => 'àôùø úðåòä àáñåìåèéú',
- 'CanMoveCon' => 'àôùø úæåæä îúîùëú',
+ 'CanMove' => 'à ôùø úðåòä',
+ 'CanMoveAbs' => 'à ôùø úðåòä à áñåìåèéú',
+ 'CanMoveCon' => 'à ôùø úæåæä îúîùëú',
'CanMoveDiag' => 'Can Move Diagonally',
'CanMoveMap' => 'Can Move Mapped',
- 'CanMoveRel' => 'àôùø úæåæä éçñéú',
+ 'CanMoveRel' => 'à ôùø úæåæä éçñéú',
'CanPan' => 'Can Pan' ,
- 'CanReset' => 'àôùø àúçåì',
+ 'CanReset' => 'à ôùø à úçåì',
'CanSetPresets' => 'Can Set Presets',
- 'CanSleep' => 'àôùø îöá ùéðä',
- 'CanTilt' => 'àôùø æòæåò',
- 'CanWake' => 'àôùø éöéàä îîöá ùéðä',
+ 'CanSleep' => 'à ôùø îöá ùéðä',
+ 'CanTilt' => 'à ôùø æòæåò',
+ 'CanWake' => 'à ôùø éöéà ä îîöá ùéðä',
'CanWhite' => 'Can White Balance',
'CanWhiteAbs' => 'Can White Bal. Absolute',
'CanWhiteBal' => 'Can White Bal.',
'CanWhiteCon' => 'Can White Bal. Continuous',
'CanWhiteRel' => 'Can White Bal. Relative',
- 'CanZoom' => 'àôùø æåí',
- 'CanZoomAbs' => 'àôùø æåí àáñåìåèé',
- 'CanZoomCon' => 'àôùø æåí îúîùê',
- 'CanZoomRel' => 'àôùø æåí éçñé',
- 'Cancel' => 'áèì',
+ 'CanZoom' => 'à ôùø æåÃ',
+ 'CanZoomAbs' => 'à ôùø æåà à áñåìåèé',
+ 'CanZoomCon' => 'à ôùø æåà îúîùê',
+ 'CanZoomRel' => 'à ôùø æåà éçñé',
+ 'Cancel' => 'áèì',
'CancelForcedAlarm' => 'Cancel Forced Alarm',
'CaptureHeight' => 'Capture Height',
'CaptureMethod' => 'Capture Method', // Added - 2009-02-08
'CapturePalette' => 'Capture Palette',
'CaptureResolution' => 'Capture Resolution', // Added - 2015-04-18
'CaptureWidth' => 'Capture Width',
- 'Cause' => 'ñéáä',
+ 'Cause' => 'ñéáä',
'CheckMethod' => 'Alarm Check Method',
'ChooseDetectedCamera' => 'Choose Detected Camera', // Added - 2009-03-31
- 'ChooseFilter' => 'áçø îñðï',
+ 'ChooseFilter' => 'áçø îñðï',
'ChooseLogFormat' => 'Choose a log format', // Added - 2011-06-17
'ChooseLogSelection' => 'Choose a log selection', // Added - 2011-06-17
'ChoosePreset' => 'Choose Preset',
'Clear' => 'Clear', // Added - 2011-06-16
- 'Close' => 'ñâåø',
- 'Colour' => 'öáò',
- 'Command' => 'ô÷åãä',
+ 'Close' => 'ñâåø',
+ 'Colour' => 'öáò',
+ 'Command' => 'ô÷åãä',
'Component' => 'Component', // Added - 2011-06-16
- 'Config' => 'úöåøä',
- 'ConfiguredFor' => 'úöåøä òáåø',
+ 'Config' => 'úöåøä',
+ 'ConfiguredFor' => 'úöåøä òáåø',
'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?',
- 'ConfirmPassword' => 'àùø ñéñîà',
- 'ConjAnd' => 'å',
- 'ConjOr' => 'àå',
- 'Console' => '÷åðñåì',
- 'ContactAdmin' => 'öåø ÷ùø òí îðäì äîòøëú áùáéì ôøèéí ðåñôéí.',
- 'Continue' => 'äîùê',
- 'Contrast' => 'ðéâåãéåú',
- 'Control' => '÷åðèøåì',
- 'ControlAddress' => 'ëúåáú ä÷åðèøåì',
- 'ControlCap' => 'éëåìú ä÷åðèøåì',
- 'ControlCaps' => 'éëåìåú ä÷åðèøåì',
- 'ControlDevice' => 'äú÷ï ä÷åðèøåì',
- 'ControlType' => 'ñåâ ä÷åðèøåì',
+ 'ConfirmPassword' => 'à ùø ñéñîà ',
+ 'ConjAnd' => 'Ã¥',
+ 'ConjOr' => 'à å',
+ 'Console' => '÷åðñåì',
+ 'ContactAdmin' => 'öåø ÷ùø òà îðäì äîòøëú áùáéì ôøèéà ðåñôéÃ.',
+ 'Continue' => 'äîùê',
+ 'Contrast' => 'ðéâåãéåú',
+ 'Control' => '÷åðèøåì',
+ 'ControlAddress' => 'ëúåáú ä÷åðèøåì',
+ 'ControlCap' => 'éëåìú ä÷åðèøåì',
+ 'ControlCaps' => 'éëåìåú ä÷åðèøåì',
+ 'ControlDevice' => 'äú÷ï ä÷åðèøåì',
+ 'ControlType' => 'ñåâ ä÷åðèøåì',
'Controllable' => 'Controllable',
'Current' => 'Current', // Added - 2015-04-18
- 'Cycle' => 'îçæåøé',
- 'CycleWatch' => 'öôééä îçæåøéú',
+ 'Cycle' => 'îçæåøé',
+ 'CycleWatch' => 'öôééä îçæåøéú',
'DateTime' => 'Date/Time', // Added - 2011-06-16
- 'Day' => 'éåí',
+ 'Day' => 'éåÃ',
'Debug' => 'Debug',
'DefaultRate' => 'Default Rate',
'DefaultScale' => 'Default Scale',
'DefaultView' => 'Default View',
'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18
'Delay' => 'Delay', // Added - 2015-04-18
- 'Delete' => 'îç÷',
- 'DeleteAndNext' => 'îç÷ & äáà',
- 'DeleteAndPrev' => 'îç÷ & ä÷åãí',
- 'DeleteSavedFilter' => 'îç÷ îñðï ùîåø',
- 'Description' => 'úéàåø',
+ 'Delete' => 'îç÷',
+ 'DeleteAndNext' => 'îç÷ & äáà ',
+ 'DeleteAndPrev' => 'îç÷ & ä÷åãÃ',
+ 'DeleteSavedFilter' => 'îç÷ îñðï ùîåø',
+ 'Description' => 'úéà åø',
'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31
'DetectedProfiles' => 'Detected Profiles', // Added - 2015-04-18
'Device' => 'Device', // Added - 2009-02-08
- 'DeviceChannel' => 'òøåõ ääú÷ï',
- 'DeviceFormat' => 'úáðéú ääú÷ï',
- 'DeviceNumber' => 'îñôø ääú÷ï',
- 'DevicePath' => 'ðúéá ääú÷ï',
- 'Devices' => 'äú÷ðéí',
- 'Dimensions' => 'îéîãéí',
- 'DisableAlarms' => 'ðèøì àæò÷åú',
- 'Disk' => 'ãéñ÷',
+ 'DeviceChannel' => 'òøåõ ääú÷ï',
+ 'DeviceFormat' => 'úáðéú ääú÷ï',
+ 'DeviceNumber' => 'îñôø ääú÷ï',
+ 'DevicePath' => 'ðúéá ääú÷ï',
+ 'Devices' => 'äú÷ðéÃ',
+ 'Dimensions' => 'îéîãéÃ',
+ 'DisableAlarms' => 'ðèøì à æò÷åú',
+ 'Disk' => 'ãéñ÷',
'Display' => 'Display', // Added - 2011-01-30
'Displaying' => 'Displaying', // Added - 2011-06-16
'DoNativeMotionDetection'=> 'Do Native Motion Detection',
- 'Donate' => 'úøåí áá÷ùä',
- 'DonateAlready' => 'ìà, úøîúé ëáø',
+ 'Donate' => 'úøåà áá÷ùä',
+ 'DonateAlready' => 'ìà , úøîúé ëáø',
'DonateEnticement' => 'You\'ve been running ZoneMinder for a while now and hopefully are finding it a useful addition to your home or workplace security. Although ZoneMinder is, and will remain, free and open source, it costs money to develop and support. If you would like to help support future development and new features then please consider donating. Donating is, of course, optional but very much appreciated and you can donate as much or as little as you like. If you would like to donate please select the option below or go to http://www.zoneminder.com/donate.html in your browser. Thank you for using ZoneMinder and don\'t forget to visit the forums on ZoneMinder.com for support or suggestions about how to make your ZoneMinder experience even better.',
- 'DonateRemindDay' => 'òãééï ìà, äæëø ìà áòåã éåí àçã',
- 'DonateRemindHour' => 'òãééï ìà, äæëø ìé áòåã ùòä àçú',
- 'DonateRemindMonth' => 'òãééï ìà, äæëø ìé áòåã çåãù àçã',
- 'DonateRemindNever' => 'ìà, àðé ìà øåöä ìúøåí, àì úúæëø àåúé',
- 'DonateRemindWeek' => 'òãééï ìà, äæëø ìé áòåã ùáåò àçã',
- 'DonateYes' => 'ëï, àðé îòåðééï ìúøåí òëùéå',
- 'Download' => 'äåøã',
+ 'DonateRemindDay' => 'òãééï ìà , äæëø ìà áòåã éåà à çã',
+ 'DonateRemindHour' => 'òãééï ìà , äæëø ìé áòåã ùòä à çú',
+ 'DonateRemindMonth' => 'òãééï ìà , äæëø ìé áòåã çåãù à çã',
+ 'DonateRemindNever' => 'ìà , à ðé ìà øåöä ìúøåÃ, à ì úúæëø à åúé',
+ 'DonateRemindWeek' => 'òãééï ìà , äæëø ìé áòåã ùáåò à çã',
+ 'DonateYes' => 'ëï, à ðé îòåðééï ìúøåà òëùéå',
+ 'Download' => 'äåøã',
'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31
- 'Duration' => 'îùê æîï',
- 'Edit' => 'òøåê',
- 'Email' => 'ãåà"ì',
- 'EnableAlarms' => 'àôùø àæò÷åú',
- 'Enabled' => 'àôùø',
- 'EnterNewFilterName' => 'äæï îñðï çãù',
- 'Error' => 'ùâéàä',
+ 'Duration' => 'îùê æîï',
+ 'Edit' => 'òøåê',
+ 'Email' => 'ãåà "ì',
+ 'EnableAlarms' => 'à ôùø à æò÷åú',
+ 'Enabled' => 'à ôùø',
+ 'EnterNewFilterName' => 'äæï îñðï çãù',
+ 'Error' => 'ùâéà ä',
'ErrorBrackets' => 'Error, please check you have an equal number of opening and closing brackets',
'ErrorValidValue' => 'Error, please check that all terms have a valid value',
- 'Etc' => 'åëå\'',
- 'Event' => 'àéøåò',
- 'EventFilter' => 'îñðï àéøåò',
- 'EventId' => 'æéäåé àéøåò',
- 'EventName' => 'ùí àéøåò',
+ 'Etc' => 'åëå\'',
+ 'Event' => 'à éøåò',
+ 'EventFilter' => 'îñðï à éøåò',
+ 'EventId' => 'æéäåé à éøåò',
+ 'EventName' => 'ùà à éøåò',
'EventPrefix' => 'Event Prefix',
- 'Events' => 'àéøåòéí',
- 'Exclude' => 'ììà',
- 'Execute' => 'áöò',
- 'Export' => 'éöà',
- 'ExportDetails' => 'éöà ôøèé àéøåò',
- 'ExportFailed' => 'éöåà ðëùì',
- 'ExportFormat' => 'éöà úáðéú ÷åáõ',
+ 'Events' => 'à éøåòéÃ',
+ 'Exclude' => 'ììà ',
+ 'Execute' => 'áöò',
+ 'Export' => 'éöà ',
+ 'ExportDetails' => 'éöà ôøèé à éøåò',
+ 'ExportFailed' => 'éöåà ðëùì',
+ 'ExportFormat' => 'éöà úáðéú ÷åáõ',
'ExportFormatTar' => 'Tar',
'ExportFormatZip' => 'Zip',
'ExportFrames' => 'Export Frame Details',
- 'ExportImageFiles' => 'éöà ÷áöé úîåðä',
+ 'ExportImageFiles' => 'éöà ÷áöé úîåðä',
'ExportLog' => 'Export Log', // Added - 2011-06-17
- 'ExportMiscFiles' => 'éöà ÷áöéí àçøéí (àí éùðí)',
- 'ExportOptions' => 'éöà àôùøåéåú',
+ 'ExportMiscFiles' => 'éöà ÷áöéà à çøéà (à à éùðÃ)',
+ 'ExportOptions' => 'éöà à ôùøåéåú',
'ExportSucceeded' => 'Export Succeeded', // Added - 2009-02-08
'ExportVideoFiles' => 'Export Video Files (if present)',
- 'Exporting' => 'îééöà',
+ 'Exporting' => 'îééöà ',
'FPS' => 'fps',
'FPSReportInterval' => 'FPS Report Interval',
'FTP' => 'FTP',
@@ -320,20 +320,20 @@ $SLANG = array(
'FastForward' => 'Fast Forward',
'Feed' => 'Feed',
'Ffmpeg' => 'Ffmpeg', // Added - 2009-02-08
- 'File' => '÷åáõ',
+ 'File' => '÷åáõ',
'Filter' => 'Filter', // Added - 2015-04-18
- 'FilterArchiveEvents' => 'àøëá úåàîéí',
- 'FilterDeleteEvents' => 'îç÷ úåàîéí',
- 'FilterEmailEvents' => 'ùìç ãåàø ùì ëì äúåàîéí',
+ 'FilterArchiveEvents' => 'à øëá úåà îéÃ',
+ 'FilterDeleteEvents' => 'îç÷ úåà îéÃ',
+ 'FilterEmailEvents' => 'ùìç ãåà ø ùì ëì äúåà îéÃ',
'FilterExecuteEvents' => 'Execute command on all matches',
'FilterLog' => 'Filter log', // Added - 2015-04-18
'FilterMessageEvents' => 'Message details of all matches',
'FilterPx' => 'Filter Px',
- 'FilterUnset' => 'òìéê ìöééï øåçá åâåáä îñðï',
- 'FilterUploadEvents' => 'òìä àú ëì äúåàîéí',
- 'FilterVideoEvents' => 'öåø åéãàå ìëì äúåàîéí',
- 'Filters' => 'îñððéí',
- 'First' => 'äøàùåï',
+ 'FilterUnset' => 'òìéê ìöééï øåçá åâåáä îñðï',
+ 'FilterUploadEvents' => 'òìä à ú ëì äúåà îéÃ',
+ 'FilterVideoEvents' => 'öåø åéãà å ìëì äúåà îéÃ',
+ 'Filters' => 'îñððéÃ',
+ 'First' => 'äøà ùåï',
'FlippedHori' => 'Flipped Horizontally',
'FlippedVert' => 'Flipped Vertically',
'FnMocord' => 'Mocord', // Added 2013.08.16.
@@ -342,24 +342,24 @@ $SLANG = array(
'FnNodect' => 'Nodect', // Added 2013.08.16.
'FnNone' => 'None', // Added 2013.08.16.
'FnRecord' => 'Record', // Added 2013.08.16.
- 'Focus' => 'äúî÷ã',
- 'ForceAlarm' => 'äëøç àæò÷ä',
- 'Format' => 'úáðéú',
- 'Frame' => 'ôøééí',
+ 'Focus' => 'äúî÷ã',
+ 'ForceAlarm' => 'äëøç à æò÷ä',
+ 'Format' => 'úáðéú',
+ 'Frame' => 'ôøééÃ',
'FrameId' => 'Frame Id',
'FrameRate' => 'Frame Rate',
- 'FrameSkip' => 'ãìâ ôøééí',
- 'Frames' => 'ôøééîéí',
- 'Func' => 'ôåð÷',
- 'Function' => 'ôåð÷öéä',
+ 'FrameSkip' => 'ãìâ ôøééÃ',
+ 'Frames' => 'ôøééîéÃ',
+ 'Func' => 'ôåð÷',
+ 'Function' => 'ôåð÷öéä',
'Gain' => 'Gain',
- 'General' => 'ëììé',
- 'GenerateVideo' => 'öåø åéãàå',
- 'GeneratingVideo' => 'îééöø åéãàå',
- 'GoToZoneMinder' => 'á÷ø ZoneMinder.com',
- 'Grey' => 'àôåø',
- 'Group' => '÷áåöä',
- 'Groups' => '÷áåöåú',
+ 'General' => 'ëììé',
+ 'GenerateVideo' => 'öåø åéãà å',
+ 'GeneratingVideo' => 'îééöø åéãà å',
+ 'GoToZoneMinder' => 'á÷ø ZoneMinder.com',
+ 'Grey' => 'à ôåø',
+ 'Group' => '÷áåöä',
+ 'Groups' => '÷áåöåú',
'HasFocusSpeed' => 'Has Focus Speed',
'HasGainSpeed' => 'Has Gain Speed',
'HasHomePreset' => 'Has Home Preset',
@@ -371,51 +371,51 @@ $SLANG = array(
'HasTurboTilt' => 'Has Turbo Tilt',
'HasWhiteSpeed' => 'Has White Bal. Speed',
'HasZoomSpeed' => 'Has Zoom Speed',
- 'High' => 'âáåä',
- 'HighBW' => 'âáåä ø/ô',
- 'Home' => 'áéú',
- 'Hour' => 'ùòä',
+ 'High' => 'âáåä',
+ 'HighBW' => 'âáåä ø/ô',
+ 'Home' => 'áéú',
+ 'Hour' => 'ùòä',
'Hue' => 'Hue',
- 'Id' => 'æéäåé',
- 'Idle' => 'äîúðä',
- 'Ignore' => 'äúòìí',
- 'Image' => 'úîåðä',
+ 'Id' => 'æéäåé',
+ 'Idle' => 'äîúðä',
+ 'Ignore' => 'äúòìÃ',
+ 'Image' => 'úîåðä',
'ImageBufferSize' => 'Image Buffer Size (frames)',
- 'Images' => 'úîåðåú',
- 'In' => 'áúåê',
- 'Include' => 'ëìåì',
- 'Inverted' => 'äôåê',
+ 'Images' => 'úîåðåú',
+ 'In' => 'áúåê',
+ 'Include' => 'ëìåì',
+ 'Inverted' => 'äôåê',
'Iris' => 'Iris',
- 'KeyString' => 'îçøåæú úåéí',
- 'Label' => 'úååéú',
- 'Language' => 'ùôä',
- 'Last' => 'àçøåï',
+ 'KeyString' => 'îçøåæú úåéÃ',
+ 'Label' => 'úååéú',
+ 'Language' => 'ùôä',
+ 'Last' => 'à çøåï',
'Layout' => 'Layout', // Added - 2009-02-08
'Level' => 'Level', // Added - 2011-06-16
'Libvlc' => 'Libvlc',
- 'LimitResultsPost' => 'úåöàåú áìáã;', // This is used at the end of the phrase 'Limit to first N results only'
- 'LimitResultsPre' => 'äâáì ìøàùåï', // This is used at the beginning of the phrase 'Limit to first N results only'
+ 'LimitResultsPost' => 'úåöà åú áìáã;', // This is used at the end of the phrase 'Limit to first N results only'
+ 'LimitResultsPre' => 'äâáì ìøà ùåï', // This is used at the beginning of the phrase 'Limit to first N results only'
'Line' => 'Line', // Added - 2011-06-16
- 'LinkedMonitors' => 'îåðéèåøéí î÷åùøéí',
- 'List' => 'øùéîä',
- 'Load' => 'èòï',
- 'Local' => 'î÷åîé',
+ 'LinkedMonitors' => 'îåðéèåøéà î÷åùøéÃ',
+ 'List' => 'øùéîä',
+ 'Load' => 'èòï',
+ 'Local' => 'î÷åîé',
'Log' => 'Log', // Added - 2011-06-16
- 'LoggedInAs' => 'äúçáø ë',
+ 'LoggedInAs' => 'äúçáø ë',
'Logging' => 'Logging', // Added - 2011-06-16
- 'LoggingIn' => 'îúçáø',
- 'Login' => 'äúçáø',
- 'Logout' => 'äúðú÷',
+ 'LoggingIn' => 'îúçáø',
+ 'Login' => 'äúçáø',
+ 'Logout' => 'äúðú÷',
'Logs' => 'Logs', // Added - 2011-06-17
- 'Low' => 'ðîåê',
- 'LowBW' => 'ðîåê ø/ô',
- 'Main' => 'îøëæé',
- 'Man' => 'îãøéê',
- 'Manual' => 'îãøéê',
- 'Mark' => 'ñîï',
- 'Max' => 'î÷ñ',
- 'MaxBandwidth' => 'øåçá ôñ î÷ñ',
- 'MaxBrScore' => 'ðé÷åã î÷ñéîìé',
+ 'Low' => 'ðîåê',
+ 'LowBW' => 'ðîåê ø/ô',
+ 'Main' => 'îøëæé',
+ 'Man' => 'îãøéê',
+ 'Manual' => 'îãøéê',
+ 'Mark' => 'ñîï',
+ 'Max' => 'î÷ñ',
+ 'MaxBandwidth' => 'øåçá ôñ î÷ñ',
+ 'MaxBrScore' => 'ðé÷åã î÷ñéîìé',
'MaxFocusRange' => 'Max Focus Range',
'MaxFocusSpeed' => 'Max Focus Speed',
'MaxFocusStep' => 'Max Focus Step',
@@ -438,7 +438,7 @@ $SLANG = array(
'MaxZoomSpeed' => 'Max Zoom Speed',
'MaxZoomStep' => 'Max Zoom Step',
'MaximumFPS' => 'Maximum FPS',
- 'Medium' => 'áéðåðé',
+ 'Medium' => 'áéðåðé',
'MediumBW' => 'Medium B/W',
'Message' => 'Message', // Added - 2011-06-16
'MinAlarmAreaLtMax' => 'Minimum alarm area should be less than maximum',
@@ -476,18 +476,18 @@ $SLANG = array(
'MinZoomStep' => 'Min Zoom Step',
'Misc' => 'Misc',
'Mode' => 'Mode', // Added - 2015-04-18
- 'Monitor' => 'îåðéèåø',
+ 'Monitor' => 'îåðéèåø',
'MonitorIds' => 'Monitor Ids',
'MonitorPreset' => 'Monitor Preset',
'MonitorPresetIntro' => 'Select an appropriate preset from the list below. Please note that this may overwrite any values you already have configured for this monitor. ',
'MonitorProbe' => 'Monitor Probe', // Added - 2009-03-31
'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection. Select the desired entry from the list below. Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor. ', // Added - 2009-03-31
- 'Monitors' => 'îåðéèåøéí',
+ 'Monitors' => 'îåðéèåøéÃ',
'Montage' => 'Montage',
- 'Month' => 'çåãù',
+ 'Month' => 'çåãù',
'More' => 'More', // Added - 2011-06-16
'MotionFrameSkip' => 'Motion Frame Skip',
- 'Move' => 'äææ',
+ 'Move' => 'äææ',
'Mtg2widgrd' => '2-wide grid', // Added 2013.08.15.
'Mtg3widgrd' => '3-wide grid', // Added 2013.08.15.
'Mtg3widgrx' => '3-wide grid, scaled, enlarge on alarm', // Added 2013.08.15.
@@ -498,48 +498,48 @@ $SLANG = array(
'MustConfirmPassword' => 'You must confirm the password',
'MustSupplyPassword' => 'You must supply a password',
'MustSupplyUsername' => 'You must supply a username',
- 'Name' => 'ùí',
- 'Near' => 'ìéã',
- 'Network' => 'øùú',
- 'New' => 'çãù',
- 'NewGroup' => '÷áåöä çãùä',
- 'NewLabel' => 'úååéú çãùä',
- 'NewPassword' => 'ñéñîà çãùä',
- 'NewState' => 'îöá çãù',
- 'NewUser' => 'îùúîù çãù',
- 'Next' => 'äáà',
- 'No' => 'ìà',
+ 'Name' => 'ùÃ',
+ 'Near' => 'ìéã',
+ 'Network' => 'øùú',
+ 'New' => 'çãù',
+ 'NewGroup' => '÷áåöä çãùä',
+ 'NewLabel' => 'úååéú çãùä',
+ 'NewPassword' => 'ñéñîà çãùä',
+ 'NewState' => 'îöá çãù',
+ 'NewUser' => 'îùúîù çãù',
+ 'Next' => 'äáà ',
+ 'No' => 'ìà ',
'NoDetectedCameras' => 'No Detected Cameras', // Added - 2009-03-31
'NoFramesRecorded' => 'There are no frames recorded for this event',
- 'NoGroup' => 'ììà ÷áåöä',
+ 'NoGroup' => 'ììà ÷áåöä',
'NoSavedFilters' => 'NoSavedFilters',
'NoStatisticsRecorded' => 'There are no statistics recorded for this event/frame',
- 'None' => 'øé÷',
- 'NoneAvailable' => 'áìúé æîéï',
- 'Normal' => 'ðåøîìé',
+ 'None' => 'øé÷',
+ 'NoneAvailable' => 'áìúé æîéï',
+ 'Normal' => 'ðåøîìé',
'Notes' => 'Notes',
'NumPresets' => 'Num Presets',
- 'Off' => 'ëáåé',
- 'On' => 'ãìå÷',
+ 'Off' => 'ëáåé',
+ 'On' => 'ãìå÷',
'OnvifCredentialsIntro'=> 'Please supply user name and password for the selected camera. If no user has been created for the camera then the user given here will be created with the given password. ', // Added - 2015-04-18
'OnvifProbe' => 'ONVIF', // Added - 2015-04-18
'OnvifProbeIntro' => 'The list below shows detected ONVIF cameras and whether they are already being used or available for selection. Select the desired entry from the list below. Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor. ', // Added - 2015-04-18
- 'OpEq' => 'ùååä ì',
- 'OpGt' => 'âãåì î',
+ 'OpEq' => 'ùååä ì',
+ 'OpGt' => 'âãåì î',
'OpGtEq' => 'greater than or equal to',
'OpIn' => 'in set',
- 'OpLt' => 'ôçåú î',
+ 'OpLt' => 'ôçåú î',
'OpLtEq' => 'less than or equal to',
'OpMatches' => 'matches',
- 'OpNe' => 'àéðå ùååä',
+ 'OpNe' => 'à éðå ùååä',
'OpNotIn' => 'not in set',
- 'OpNotMatches' => 'àéðå úåàí',
- 'Open' => 'ôúç',
+ 'OpNotMatches' => 'à éðå úåà Ã',
+ 'Open' => 'ôúç',
'OptionHelp' => 'OptionHelp',
'OptionRestartWarning' => 'These changes may not come into effect fully\nwhile the system is running. When you have\nfinished making your changes please ensure that\nyou restart ZoneMinder.',
- 'Options' => 'àôùøåéåú',
+ 'Options' => 'à ôùøåéåú',
'OrEnterNewName' => 'or enter new name',
- 'Order' => 'îéåï',
+ 'Order' => 'îéåï',
'Orientation' => 'Orientation',
'Out' => 'Out',
'OverwriteExisting' => 'Overwrite Existing',
@@ -548,200 +548,200 @@ $SLANG = array(
'PanLeft' => 'Pan Left',
'PanRight' => 'Pan Right',
'PanTilt' => 'Pan/Tilt',
- 'Parameter' => 'ôøîèø',
- 'Password' => 'ñéñîà',
+ 'Parameter' => 'ôøîèø',
+ 'Password' => 'ñéñîà ',
'PasswordsDifferent' => 'The new and confirm passwords are different',
- 'Paths' => 'ðúéáéí',
+ 'Paths' => 'ðúéáéÃ',
'Pause' => 'Pause',
- 'Phone' => 'èìôåï',
- 'PhoneBW' => 'ø/ô èìôåï',
+ 'Phone' => 'èìôåï',
+ 'PhoneBW' => 'ø/ô èìôåï',
'Pid' => 'PID', // Added - 2011-06-16
'PixelDiff' => 'Pixel Diff',
- 'Pixels' => 'ôé÷ñìéí',
+ 'Pixels' => 'ôé÷ñìéÃ',
'Play' => 'Play',
- 'PlayAll' => 'ðâï äëì',
- 'PleaseWait' => 'äîúï áá÷ùä',
+ 'PlayAll' => 'ðâï äëì',
+ 'PleaseWait' => 'äîúï áá÷ùä',
'Plugins' => 'Plugins',
- 'Point' => 'ð÷åãä',
+ 'Point' => 'ð÷åãä',
'PostEventImageBuffer' => 'Post Event Image Count',
'PreEventImageBuffer' => 'Pre Event Image Count',
'PreserveAspect' => 'Preserve Aspect Ratio',
'Preset' => 'Preset',
'Presets' => 'Presets',
- 'Prev' => 'ä÷åãí',
+ 'Prev' => 'ä÷åãÃ',
'Probe' => 'Probe', // Added - 2009-03-31
'ProfileProbe' => 'Stream Probe', // Added - 2015-04-18
'ProfileProbeIntro' => 'The list below shows the existing stream profiles of the selected camera . Select the desired entry from the list below. Please note that ZoneMinder cannot configure additional profiles and that choosing a camera here may overwrite any values you already have configured for the current monitor. ', // Added - 2015-04-18
'Progress' => 'Progress', // Added - 2015-04-18
'Protocol' => 'Protocol',
- 'Rate' => 'ãéøåâ',
- 'Real' => 'àîéúé',
- 'Record' => 'ä÷ìèä',
+ 'Rate' => 'ãéøåâ',
+ 'Real' => 'à îéúé',
+ 'Record' => 'ä÷ìèä',
'RefImageBlendPct' => 'Reference Image Blend %ge',
- 'Refresh' => 'øòðåï',
- 'Remote' => 'îøåç÷',
- 'RemoteHostName' => 'ùí îàøç îøåç÷',
- 'RemoteHostPath' => 'ðúéá îàøç îøåç÷',
- 'RemoteHostPort' => 'ôåøè îàøç îøåç÷',
+ 'Refresh' => 'øòðåï',
+ 'Remote' => 'îøåç÷',
+ 'RemoteHostName' => 'ùà îà øç îøåç÷',
+ 'RemoteHostPath' => 'ðúéá îà øç îøåç÷',
+ 'RemoteHostPort' => 'ôåøè îà øç îøåç÷',
'RemoteHostSubPath' => 'Remote Host SubPath', // Added - 2009-02-08
'RemoteImageColours' => 'Remote Image Colours',
'RemoteMethod' => 'Remote Method', // Added - 2009-02-08
'RemoteProtocol' => 'Remote Protocol', // Added - 2009-02-08
- 'Rename' => 'ùðä ùí',
+ 'Rename' => 'ùðä ùÃ',
'Replay' => 'Replay',
'ReplayAll' => 'All Events',
'ReplayGapless' => 'Gapless Events',
'ReplaySingle' => 'Single Event',
- 'Reset' => 'àôñ',
+ 'Reset' => 'à ôñ',
'ResetEventCounts' => 'Reset Event Counts',
- 'Restart' => 'àúçì',
- 'Restarting' => 'îàúçì',
+ 'Restart' => 'à úçì',
+ 'Restarting' => 'îà úçì',
'RestrictedCameraIds' => 'Restricted Camera Ids',
'RestrictedMonitors' => 'Restricted Monitors',
- 'ReturnDelay' => 'çæøä îäùäéä',
- 'ReturnLocation' => 'îé÷åí çæøä',
+ 'ReturnDelay' => 'çæøä îäùäéä',
+ 'ReturnLocation' => 'îé÷åà çæøä',
'Rewind' => 'Rewind',
- 'RotateLeft' => 'ñåáá ùîàìä',
- 'RotateRight' => 'ñåáá éîéðä',
+ 'RotateLeft' => 'ñåáá ùîà ìä',
+ 'RotateRight' => 'ñåáá éîéðä',
'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25
- 'RunMode' => 'öåøú øéöä',
- 'RunState' => 'îöá øéöä',
- 'Running' => 'îøéõ',
- 'Save' => 'ùîåø',
- 'SaveAs' => 'ùîåø áùí',
- 'SaveFilter' => 'ùîåø îñðï',
- 'Scale' => 'ñ÷àìä',
- 'Score' => 'ðé÷åã',
- 'Secs' => 'ùðéåú',
- 'Sectionlength' => 'àåøê ÷èò',
- 'Select' => 'áçø',
+ 'RunMode' => 'öåøú øéöä',
+ 'RunState' => 'îöá øéöä',
+ 'Running' => 'îøéõ',
+ 'Save' => 'ùîåø',
+ 'SaveAs' => 'ùîåø áùÃ',
+ 'SaveFilter' => 'ùîåø îñðï',
+ 'Scale' => 'ñ÷à ìä',
+ 'Score' => 'ðé÷åã',
+ 'Secs' => 'ùðéåú',
+ 'Sectionlength' => 'à åøê ÷èò',
+ 'Select' => 'áçø',
'SelectFormat' => 'Select Format', // Added - 2011-06-17
'SelectLog' => 'Select Log', // Added - 2011-06-17
- 'SelectMonitors' => 'áçø îåðéèåøéí',
+ 'SelectMonitors' => 'áçø îåðéèåøéÃ',
'SelfIntersecting' => 'Polygon edges must not intersect',
- 'Set' => '÷áò',
+ 'Set' => '÷áò',
'SetNewBandwidth' => 'Set New Bandwidth',
'SetPreset' => 'Set Preset',
- 'Settings' => 'äâãøåú',
+ 'Settings' => 'äâãøåú',
'ShowFilterWindow' => 'Show Filter Window',
'ShowTimeline' => 'Show Timeline',
'SignalCheckColour' => 'Signal Check Colour',
- 'Size' => 'âåãì',
+ 'Size' => 'âåãì',
'SkinDescription' => 'Change the default skin for this computer', // Added - 2011-01-30
- 'Sleep' => 'ùéðä',
+ 'Sleep' => 'ùéðä',
'SortAsc' => 'Asc',
'SortBy' => 'Sort by',
'SortDesc' => 'Desc',
- 'Source' => 'î÷åø',
+ 'Source' => 'î÷åø',
'SourceColours' => 'Source Colours', // Added - 2009-02-08
'SourcePath' => 'Source Path', // Added - 2009-02-08
- 'SourceType' => 'ñåâ î÷åø',
- 'Speed' => 'îäéøåú',
- 'SpeedHigh' => 'îäéøåú âáåää',
- 'SpeedLow' => 'îäéøåú ðîåëä',
- 'SpeedMedium' => 'îöìîä áéðåðéú',
- 'SpeedTurbo' => 'îäéøåú èåøáå',
- 'Start' => 'äúçì',
- 'State' => 'îöá',
- 'Stats' => 'îöáéí',
- 'Status' => 'ñèèåñ',
- 'Step' => 'öòã',
+ 'SourceType' => 'ñåâ î÷åø',
+ 'Speed' => 'îäéøåú',
+ 'SpeedHigh' => 'îäéøåú âáåää',
+ 'SpeedLow' => 'îäéøåú ðîåëä',
+ 'SpeedMedium' => 'îöìîä áéðåðéú',
+ 'SpeedTurbo' => 'îäéøåú èåøáå',
+ 'Start' => 'äúçì',
+ 'State' => 'îöá',
+ 'Stats' => 'îöáéÃ',
+ 'Status' => 'ñèèåñ',
+ 'Step' => 'öòã',
'StepBack' => 'Step Back',
'StepForward' => 'Step Forward',
- 'StepLarge' => 'öòã âãåì',
- 'StepMedium' => 'öòã áéðåðé',
- 'StepNone' => 'àì úöòã',
- 'StepSmall' => 'öòã ÷èï',
- 'Stills' => 'ñèéìñ',
- 'Stop' => 'òöåø',
- 'Stopped' => 'ðòöø',
- 'Stream' => 'ñèøéí',
+ 'StepLarge' => 'öòã âãåì',
+ 'StepMedium' => 'öòã áéðåðé',
+ 'StepNone' => 'à ì úöòã',
+ 'StepSmall' => 'öòã ÷èï',
+ 'Stills' => 'ñèéìñ',
+ 'Stop' => 'òöåø',
+ 'Stopped' => 'ðòöø',
+ 'Stream' => 'ñèøéÃ',
'StreamReplayBuffer' => 'Stream Replay Image Buffer',
'Submit' => 'Submit',
- 'System' => 'îòøëú',
+ 'System' => 'îòøëú',
'SystemLog' => 'System Log', // Added - 2011-06-16
'TargetColorspace' => 'Target colorspace', // Added - 2015-04-18
- 'Tele' => 'èì',
+ 'Tele' => 'èì',
'Thumbnail' => 'Thumbnail',
'Tilt' => 'Tilt',
- 'Time' => 'æîï',
- 'TimeDelta' => 'ùéðåé áæîï',
- 'TimeStamp' => 'çåúîú æîï',
- 'Timeline' => '÷å æîï',
+ 'Time' => 'æîï',
+ 'TimeDelta' => 'ùéðåé áæîï',
+ 'TimeStamp' => 'çåúîú æîï',
+ 'Timeline' => '÷å æîï',
'TimelineTip1' => 'Pass your mouse over the graph to view a snapshot image and event details.', // Added 2013.08.15.
'TimelineTip2' => 'Click on the coloured sections of the graph, or the image, to view the event.', // Added 2013.08.15.
'TimelineTip3' => 'Click on the background to zoom in to a smaller time period based around your click.', // Added 2013.08.15.
'TimelineTip4' => 'Use the controls below to zoom out or navigate back and forward through the time range.', // Added 2013.08.15.
- 'Timestamp' => 'çåúîú æîï',
+ 'Timestamp' => 'çåúîú æîï',
'TimestampLabelFormat' => 'Timestamp Label Format',
'TimestampLabelX' => 'Timestamp Label X',
'TimestampLabelY' => 'Timestamp Label Y',
- 'Today' => 'äéåí',
- 'Tools' => 'ëìéí',
+ 'Today' => 'äéåÃ',
+ 'Tools' => 'ëìéÃ',
'Total' => 'Total', // Added - 2011-06-16
- 'TotalBrScore' => 'ñê ðé÷åã',
+ 'TotalBrScore' => 'ñê ðé÷åã',
'TrackDelay' => 'Track Delay',
'TrackMotion' => 'Track Motion',
- 'Triggers' => 'èøéâøéí',
+ 'Triggers' => 'èøéâøéÃ',
'TurboPanSpeed' => 'Turbo Pan Speed',
'TurboTiltSpeed' => 'Turbo Tilt Speed',
- 'Type' => 'ñåâ',
- 'Unarchive' => 'áìúé àøëéá',
+ 'Type' => 'ñåâ',
+ 'Unarchive' => 'áìúé à øëéá',
'Undefined' => 'Undefined', // Added - 2009-02-08
- 'Units' => 'éçéãåú',
- 'Unknown' => 'áìúé éãåò',
- 'Update' => 'òãëåï',
- 'UpdateAvailable' => 'òãëåï ìæåï-îéðãø àôùøé.',
- 'UpdateNotNecessary' => 'òãëåï àéðå äëøçé.',
+ 'Units' => 'éçéãåú',
+ 'Unknown' => 'áìúé éãåò',
+ 'Update' => 'òãëåï',
+ 'UpdateAvailable' => 'òãëåï ìæåï-îéðãø à ôùøé.',
+ 'UpdateNotNecessary' => 'òãëåï à éðå äëøçé.',
'Updated' => 'Updated', // Added - 2011-06-16
'Upload' => 'Upload', // Added - 2011-08-23
- 'UseFilter' => 'ùéîåù áîñðï',
+ 'UseFilter' => 'ùéîåù áîñðï',
'UseFilterExprsPost' => ' filter expressions', // This is used at the end of the phrase 'use N filter expressions'
- 'UseFilterExprsPre' => 'ùéîåù ', // This is used at the beginning of the phrase 'use N filter expressions'
+ 'UseFilterExprsPre' => 'ùéîåù ', // This is used at the beginning of the phrase 'use N filter expressions'
'UsedPlugins' => 'Used Plugins',
- 'User' => 'îùúîù',
- 'Username' => 'ùí îùúîù',
- 'Users' => 'îùúîùéí',
+ 'User' => 'îùúîù',
+ 'Username' => 'ùà îùúîù',
+ 'Users' => 'îùúîùéÃ',
'V4L' => 'V4L', // Added - 2015-04-18
'V4LCapturesPerFrame' => 'Captures Per Frame', // Added - 2015-04-18
'V4LMultiBuffer' => 'Multi Buffering', // Added - 2015-04-18
- 'Value' => 'òøê',
- 'Version' => 'âéøñä',
- 'VersionIgnore' => 'äúòìí îâéøñä æå',
- 'VersionRemindDay' => 'äæëø ìé áòåã éåí àçã',
- 'VersionRemindHour' => 'äæëø ìé áòåã ùòä àçú',
+ 'Value' => 'òøê',
+ 'Version' => 'âéøñä',
+ 'VersionIgnore' => 'äúòìà îâéøñä æå',
+ 'VersionRemindDay' => 'äæëø ìé áòåã éåà à çã',
+ 'VersionRemindHour' => 'äæëø ìé áòåã ùòä à çú',
'VersionRemindNever' => 'Don\'t remind about new versions',
'VersionRemindWeek' => 'Remind again in 1 week',
- 'Video' => 'åéãàå',
- 'VideoFormat' => 'úáðéú åéãàå',
+ 'Video' => 'åéãà å',
+ 'VideoFormat' => 'úáðéú åéãà å',
'VideoGenFailed' => 'Video Generation Failed!',
'VideoGenFiles' => 'Existing Video Files',
'VideoGenNoFiles' => 'No Video Files Found',
'VideoGenParms' => 'Video Generation Parameters',
'VideoGenSucceeded' => 'Video Generation Succeeded!',
- 'VideoSize' => 'âåãì åéãàå',
- 'View' => 'äöâ',
- 'ViewAll' => 'äöâ äëì',
- 'ViewEvent' => 'äöâ àéøåò',
+ 'VideoSize' => 'âåãì åéãà å',
+ 'View' => 'äöâ',
+ 'ViewAll' => 'äöâ äëì',
+ 'ViewEvent' => 'äöâ à éøåò',
'ViewPaged' => 'View Paged',
- 'Wake' => 'äòø',
+ 'Wake' => 'äòø',
'WarmupFrames' => 'Warmup Frames',
- 'Watch' => 'öôä',
- 'Web' => 'àéðèøðè',
- 'WebColour' => 'öáò àéðèøðè',
- 'Week' => 'ùáåò',
- 'White' => 'ìáï',
+ 'Watch' => 'öôä',
+ 'Web' => 'à éðèøðè',
+ 'WebColour' => 'öáò à éðèøðè',
+ 'Week' => 'ùáåò',
+ 'White' => 'ìáï',
'WhiteBalance' => 'White Balance',
- 'Wide' => 'øçá',
+ 'Wide' => 'øçá',
'X' => 'X',
'X10' => 'X10',
'X10ActivationString' => 'X10 Activation String',
'X10InputAlarmString' => 'X10 Input Alarm String',
'X10OutputAlarmString' => 'X10 Output Alarm String',
'Y' => 'Y',
- 'Yes' => 'ëï',
- 'YouNoPerms' => 'àéï ìê äøùàä ìäéëðñ ìî÷åø æä.',
- 'Zone' => 'àæåø',
+ 'Yes' => 'ëï',
+ 'YouNoPerms' => 'à éï ìê äøùà ä ìäéëðñ ìî÷åø æä.',
+ 'Zone' => 'à æåø',
'ZoneAlarmColour' => 'Alarm Colour (Red/Green/Blue)',
'ZoneArea' => 'Zone Area',
'ZoneExtendAlarmFrames' => 'Extend Alarm Frame Count',
@@ -753,10 +753,10 @@ $SLANG = array(
'ZoneMinMaxPixelThres' => 'Min/Max Pixel Threshold (0-255)',
'ZoneMinderLog' => 'ZoneMinder Log', // Added - 2011-06-17
'ZoneOverloadFrames' => 'Overload Frame Ignore Count',
- 'Zones' => 'àæåøéí',
- 'Zoom' => 'æåí',
- 'ZoomIn' => 'æåí ôðéîä',
- 'ZoomOut' => 'æåí äçåöä',
+ 'Zones' => 'à æåøéÃ',
+ 'Zoom' => 'æåÃ',
+ 'ZoomIn' => 'æåà ôðéîä',
+ 'ZoomOut' => 'æåà äçåöä',
);
// Complex replacements with formatting and/or placements, must be passed through sprintf
diff --git a/web/lang/pt_br.php b/web/lang/pt_br.php
index ae9c8c5b1..c7c3caf42 100644
--- a/web/lang/pt_br.php
+++ b/web/lang/pt_br.php
@@ -4,7 +4,7 @@
//
// Feel Free to contact Me at illuminati@linuxmail.org
//
-// Tradução Para Português do Brasil do Zoneminder
+// Tradução Para Português do Brasil do Zoneminder
//
// Sinta-se Livre para me contactar em illuminati@linuxmail.org
@@ -18,7 +18,7 @@ $SLANG = array(
'Actual' => 'Atual',
'AddNewControl' => 'Add New Control',
'AddNewMonitor' => 'Adicionar Monitor',
- 'AddNewUser' => 'Adicionar Usuário',
+ 'AddNewUser' => 'Adicionar Usuário',
'AddNewZone' => 'Adicionar Zona',
'Alarm' => 'Alarme',
'AlarmBrFrames' => 'Imagens Alarmadas',
@@ -34,7 +34,7 @@ $SLANG = array(
'AnalysisFPS' => 'Analysis FPS', // Added - 2015-07-22
'AnalysisUpdateDelay' => 'Analysis Update Delay', // Added - 2015-07-23
'Apply' => 'Aplicar',
- 'ApplyingStateChange' => 'Aplicando mudança de estado',
+ 'ApplyingStateChange' => 'Aplicando mudança de estado',
'ArchArchived' => 'Somente Arquivados',
'ArchUnarchived' => 'Somente Nao Arquivados',
'Archive' => 'Arquivar',
@@ -49,7 +49,7 @@ $SLANG = array(
'AttrDateTime' => 'Data/Horario',
'AttrDiskBlocks' => 'Blocos de Disco',
'AttrDiskPercent' => 'Porcentagem de Disco',
- 'AttrDuration' => 'Duração',
+ 'AttrDuration' => 'Duração',
'AttrFrames' => 'Imagens',
'AttrId' => 'Id',
'AttrMaxScore' => 'Max. Score',
@@ -58,7 +58,7 @@ $SLANG = array(
'AttrName' => 'Nome',
'AttrNotes' => 'Notes',
'AttrSystemLoad' => 'System Load',
- 'AttrTime' => 'Horário',
+ 'AttrTime' => 'Horário',
'AttrTotalScore' => 'Score Total',
'AttrWeekday' => 'Dia/Semana',
'Auto' => 'Auto',
@@ -84,7 +84,7 @@ $SLANG = array(
'BadLabelY' => 'Label Y co-ordinate must be set to an integer of zero or more',
'BadMaxFPS' => 'Maximum FPS must be a positive integer or floating point value',
'BadMotionFrameSkip' => 'Motion Frame skip count must be an integer of zero or more',
- 'BadNameChars' => 'Nomes devem ser caracteres alfanuméricos mais hífen e underscore',
+ 'BadNameChars' => 'Nomes devem ser caracteres alfanuméricos mais hÃfen e underscore',
'BadPalette' => 'Palette must be set to a valid value', // Added - 2009-03-31
'BadPath' => 'Path must be set to a valid value',
'BadPort' => 'Port must be set to a valid number',
@@ -145,7 +145,7 @@ $SLANG = array(
'CanZoomCon' => 'Can Zoom Continuous',
'CanZoomRel' => 'Can Zoom Relative',
'Cancel' => 'Cancelar',
- 'CancelForcedAlarm' => 'Cancelar Alarme Forçado',
+ 'CancelForcedAlarm' => 'Cancelar Alarme Forçado',
'CaptureHeight' => 'Altura da Captura',
'CaptureMethod' => 'Capture Method', // Added - 2009-02-08
'CapturePalette' => 'Paleta de Captura',
@@ -192,10 +192,10 @@ $SLANG = array(
'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18
'Delay' => 'Delay', // Added - 2015-04-18
'Delete' => 'Deletar',
- 'DeleteAndNext' => 'Deletar & Próx',
+ 'DeleteAndNext' => 'Deletar & Próx',
'DeleteAndPrev' => 'Deletar & Ant',
'DeleteSavedFilter' => 'Deletar Filtros Salvos',
- 'Description' => 'Descrição',
+ 'Description' => 'Descrição',
'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31
'DetectedProfiles' => 'Detected Profiles', // Added - 2015-04-18
'Device' => 'Device', // Added - 2009-02-08
@@ -204,7 +204,7 @@ $SLANG = array(
'DeviceNumber' => 'Num. do Dispos.',
'DevicePath' => 'Device Path',
'Devices' => 'Devices',
- 'Dimensions' => 'Dimensões',
+ 'Dimensions' => 'Dimensões',
'DisableAlarms' => 'Disable Alarms',
'Disk' => 'Disco',
'Display' => 'Display', // Added - 2011-01-30
@@ -221,15 +221,15 @@ $SLANG = array(
'DonateYes' => 'Yes, I\'d like to donate now',
'Download' => 'Download',
'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31
- 'Duration' => 'Duração',
+ 'Duration' => 'Duração',
'Edit' => 'Editar',
'Email' => 'Email',
'EnableAlarms' => 'Enable Alarms',
'Enabled' => 'Habilitado',
'EnterNewFilterName' => 'Digite nome do novo filtro',
'Error' => 'Erro',
- 'ErrorBrackets' => 'Por favor cheque se você tem o mesmo numero de chaves abertas e fechadas',
- 'ErrorValidValue' => 'Erro, por favor cheque se os campos estão corretos',
+ 'ErrorBrackets' => 'Por favor cheque se você tem o mesmo numero de chaves abertas e fechadas',
+ 'ErrorValidValue' => 'Erro, por favor cheque se os campos estão corretos',
'Etc' => 'etc',
'Event' => 'Evento',
'EventFilter' => 'Filtro de Evento',
@@ -283,7 +283,7 @@ $SLANG = array(
'FnNone' => 'None', // Added 2013.08.16.
'FnRecord' => 'Record', // Added 2013.08.16.
'Focus' => 'Focus',
- 'ForceAlarm' => 'Forçar Alarme',
+ 'ForceAlarm' => 'Forçar Alarme',
'Format' => 'Format',
'Frame' => 'Imagem',
'FrameId' => 'Id de Imagem',
@@ -291,7 +291,7 @@ $SLANG = array(
'FrameSkip' => 'Salto de Imagem',
'Frames' => 'Imagens',
'Func' => 'Func',
- 'Function' => 'Função',
+ 'Function' => 'Função',
'Gain' => 'Gain',
'General' => 'General',
'GenerateVideo' => 'Gerar Video',
@@ -315,7 +315,7 @@ $SLANG = array(
'HighBW' => 'Alta L/B',
'Home' => 'Home',
'Hour' => 'Hora',
- 'Hue' => 'Saturação',
+ 'Hue' => 'Saturação',
'Id' => 'Id',
'Idle' => 'Parado',
'Ignore' => 'Ignorar',
@@ -329,7 +329,7 @@ $SLANG = array(
'KeyString' => 'Key String',
'Label' => 'Label',
'Language' => 'Linguagem',
- 'Last' => 'Último',
+ 'Last' => 'Último',
'Layout' => 'Layout', // Added - 2009-02-08
'Level' => 'Level', // Added - 2011-06-16
'Libvlc' => 'Libvlc',
@@ -383,7 +383,7 @@ $SLANG = array(
'Message' => 'Message', // Added - 2011-06-16
'MinAlarmAreaLtMax' => 'Minimum alarm area should be less than maximum',
'MinAlarmAreaUnset' => 'You must specify the minimum alarm pixel count',
- 'MinBlobAreaLtMax' => 'A area minima de blob deve ser menor do que a area máxima de blob',
+ 'MinBlobAreaLtMax' => 'A area minima de blob deve ser menor do que a area máxima de blob',
'MinBlobAreaUnset' => 'You must specify the minimum blob pixel count',
'MinBlobLtMinFilter' => 'Minimum blob area should be less than or equal to minimum filter area',
'MinBlobsLtMax' => 'O minimo de Blobs deve ser menor que o maximo de blobs',
@@ -424,7 +424,7 @@ $SLANG = array(
'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection. Select the desired entry from the list below. Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor. ', // Added - 2009-03-31
'Monitors' => 'Monitores',
'Montage' => 'Montagem',
- 'Month' => 'Mês',
+ 'Month' => 'Mês',
'More' => 'More', // Added - 2011-06-16
'MotionFrameSkip' => 'Motion Frame Skip',
'Move' => 'Move',
@@ -437,7 +437,7 @@ $SLANG = array(
'MustBeLe' => 'deve ser menor ou igual a',
'MustConfirmPassword' => 'Voce deve Confirmar a senha',
'MustSupplyPassword' => 'Voce deve informar a senha',
- 'MustSupplyUsername' => 'Voce deve informar nome de usuário',
+ 'MustSupplyUsername' => 'Voce deve informar nome de usuário',
'Name' => 'Nome',
'Near' => 'Near',
'Network' => 'Rede',
@@ -446,16 +446,16 @@ $SLANG = array(
'NewLabel' => 'New Label',
'NewPassword' => 'Nova Senha',
'NewState' => 'Novo Estado',
- 'NewUser' => 'Novo Usuário',
- 'Next' => 'Próx',
- 'No' => 'Não',
+ 'NewUser' => 'Novo Usuário',
+ 'Next' => 'Próx',
+ 'No' => 'Não',
'NoDetectedCameras' => 'No Detected Cameras', // Added - 2009-03-31
- 'NoFramesRecorded' => 'Não há imagens gravadas neste evento',
+ 'NoFramesRecorded' => 'Não há imagens gravadas neste evento',
'NoGroup' => 'No Group',
'NoSavedFilters' => 'SemFiltrosSalvos',
- 'NoStatisticsRecorded' => 'Não há estatísticas gravadas neste evento/imagem',
+ 'NoStatisticsRecorded' => 'Não há estatÃsticas gravadas neste evento/imagem',
'None' => 'Nada',
- 'NoneAvailable' => 'Nada disponível',
+ 'NoneAvailable' => 'Nada disponÃvel',
'Normal' => 'Normal',
'Notes' => 'Notes',
'NumPresets' => 'Num Presets',
@@ -472,15 +472,15 @@ $SLANG = array(
'OpLtEq' => 'menor que ou igual a',
'OpMatches' => 'combina',
'OpNe' => 'diferente de',
- 'OpNotIn' => 'não no set',
- 'OpNotMatches' => 'não combina',
+ 'OpNotIn' => 'não no set',
+ 'OpNotMatches' => 'não combina',
'Open' => 'Open',
- 'OptionHelp' => 'OpçãoAjuda',
- 'OptionRestartWarning' => 'Reinicie o Zoneminder para que as mudanças tenham efeito',
- 'Options' => 'Opções',
+ 'OptionHelp' => 'OpçãoAjuda',
+ 'OptionRestartWarning' => 'Reinicie o Zoneminder para que as mudanças tenham efeito',
+ 'Options' => 'Opções',
'OrEnterNewName' => 'ou defina novo nome',
'Order' => 'Order',
- 'Orientation' => 'Orientação',
+ 'Orientation' => 'Orientação',
'Out' => 'Out',
'OverwriteExisting' => 'Sobrescrever Existente',
'Paged' => 'Paginado',
@@ -490,7 +490,7 @@ $SLANG = array(
'PanTilt' => 'Pan/Tilt',
'Parameter' => 'Parametro',
'Password' => 'Senha',
- 'PasswordsDifferent' => 'A nova senha e a de confirmação são diferentes',
+ 'PasswordsDifferent' => 'A nova senha e a de confirmação são diferentes',
'Paths' => 'Caminhos',
'Pause' => 'Pause',
'Phone' => 'Phone',
@@ -503,8 +503,8 @@ $SLANG = array(
'PleaseWait' => 'Por Favor Espere',
'Plugins' => 'Plugins',
'Point' => 'Point',
- 'PostEventImageBuffer' => 'Buffer de imagem pós evento',
- 'PreEventImageBuffer' => 'Buffer de imagem pré evento',
+ 'PostEventImageBuffer' => 'Buffer de imagem pós evento',
+ 'PreEventImageBuffer' => 'Buffer de imagem pré evento',
'PreserveAspect' => 'Preserve Aspect Ratio',
'Preset' => 'Preset',
'Presets' => 'Presets',
@@ -517,7 +517,7 @@ $SLANG = array(
'Rate' => 'Vel.',
'Real' => 'Real',
'Record' => 'Gravar',
- 'RefImageBlendPct' => 'Referência de imagem Blend %ge',
+ 'RefImageBlendPct' => 'Referência de imagem Blend %ge',
'Refresh' => 'Atualizar',
'Remote' => 'Remoto',
'RemoteHostName' => 'Nome do host remoto',
@@ -536,16 +536,16 @@ $SLANG = array(
'ResetEventCounts' => 'Resetar contagem de eventos',
'Restart' => 'Reiniciar',
'Restarting' => 'Reiniciando',
- 'RestrictedCameraIds' => 'Ids de camera proibídos',
+ 'RestrictedCameraIds' => 'Ids de camera proibÃdos',
'RestrictedMonitors' => 'Restricted Monitors',
'ReturnDelay' => 'Return Delay',
'ReturnLocation' => 'Return Location',
'Rewind' => 'Rewind',
- 'RotateLeft' => 'Rotacionar à esquerda ',
- 'RotateRight' => 'Rotacionar à direita',
+ 'RotateLeft' => 'Rotacionar à esquerda ',
+ 'RotateRight' => 'Rotacionar à direita',
'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25
- 'RunMode' => 'Modo de Execução',
- 'RunState' => 'Estado de Execução',
+ 'RunMode' => 'Modo de Execução',
+ 'RunState' => 'Estado de Execução',
'Running' => 'Rodando',
'Save' => 'Salvar',
'SaveAs' => 'Salvar Como',
@@ -562,7 +562,7 @@ $SLANG = array(
'Set' => 'Set',
'SetNewBandwidth' => 'Defina Nova L/B',
'SetPreset' => 'Set Preset',
- 'Settings' => 'Configurações',
+ 'Settings' => 'Configurações',
'ShowFilterWindow' => 'MostrarJanelaDeFiltros',
'ShowTimeline' => 'Show Timeline',
'SignalCheckColour' => 'Signal Check Colour',
@@ -595,7 +595,7 @@ $SLANG = array(
'Stills' => 'Imagens',
'Stop' => 'Parar',
'Stopped' => 'Parado',
- 'Stream' => 'Contínuo',
+ 'Stream' => 'ContÃnuo',
'StreamReplayBuffer' => 'Stream Replay Image Buffer',
'Submit' => 'Submit',
'System' => 'Sistema',
@@ -614,8 +614,8 @@ $SLANG = array(
'TimelineTip4' => 'Use the controls below to zoom out or navigate back and forward through the time range.', // Added 2013.08.15.
'Timestamp' => 'Tempo',
'TimestampLabelFormat' => 'Formato de etiqueta de tempo',
- 'TimestampLabelX' => 'posição de etiqueta X',
- 'TimestampLabelY' => 'posição de etiqueta Y',
+ 'TimestampLabelX' => 'posição de etiqueta X',
+ 'TimestampLabelY' => 'posição de etiqueta Y',
'Today' => 'Today',
'Tools' => 'Ferramentas',
'Total' => 'Total', // Added - 2011-06-16
@@ -631,35 +631,35 @@ $SLANG = array(
'Units' => 'Unidades',
'Unknown' => 'Desconhecido',
'Update' => 'Update',
- 'UpdateAvailable' => 'Um update ao zoneminder está disponível.',
- 'UpdateNotNecessary' => 'Não é necessário update.',
+ 'UpdateAvailable' => 'Um update ao zoneminder está disponÃvel.',
+ 'UpdateNotNecessary' => 'Não é necessário update.',
'Updated' => 'Updated', // Added - 2011-06-16
'Upload' => 'Upload', // Added - 2011-08-23
'UseFilter' => 'Use Filtro',
- 'UseFilterExprsPost' => ' expressões de filtragem', // This is used at the end of the phrase 'use N filter expressions'
+ 'UseFilterExprsPost' => ' expressões de filtragem', // This is used at the end of the phrase 'use N filter expressions'
'UseFilterExprsPre' => 'Use ', // This is used at the beginning of the phrase 'use N filter expressions'
'UsedPlugins' => 'Used Plugins',
- 'User' => 'Usuário',
- 'Username' => 'Nome de Usuário',
- 'Users' => 'Usuários',
+ 'User' => 'Usuário',
+ 'Username' => 'Nome de Usuário',
+ 'Users' => 'Usuários',
'V4L' => 'V4L', // Added - 2015-04-18
'V4LCapturesPerFrame' => 'Captures Per Frame', // Added - 2015-04-18
'V4LMultiBuffer' => 'Multi Buffering', // Added - 2015-04-18
'Value' => 'Valor',
- 'Version' => 'Versão',
- 'VersionIgnore' => 'Ignorar esta versão',
+ 'Version' => 'Versão',
+ 'VersionIgnore' => 'Ignorar esta versão',
'VersionRemindDay' => 'Lembre novamente em 1 dia',
'VersionRemindHour' => 'Lembre novamente em 1 hora',
- 'VersionRemindNever' => 'Nao lembrar novas versões',
+ 'VersionRemindNever' => 'Nao lembrar novas versões',
'VersionRemindWeek' => 'Lembrar novamente em 1 semana',
'Video' => 'Video',
'VideoFormat' => 'Video Format',
- 'VideoGenFailed' => 'Geração de Vídeo falhou!',
+ 'VideoGenFailed' => 'Geração de VÃdeo falhou!',
'VideoGenFiles' => 'Existing Video Files',
'VideoGenNoFiles' => 'No Video Files Found',
- 'VideoGenParms' => 'Parametros de geração de vídeo',
+ 'VideoGenParms' => 'Parametros de geração de vÃdeo',
'VideoGenSucceeded' => 'Video Generation Succeeded!',
- 'VideoSize' => 'Tamanho do vídeo',
+ 'VideoSize' => 'Tamanho do vÃdeo',
'View' => 'Ver',
'ViewAll' => 'Ver Tudo',
'ViewEvent' => 'View Event',
@@ -675,12 +675,12 @@ $SLANG = array(
'Wide' => 'Wide',
'X' => 'X',
'X10' => 'X10',
- 'X10ActivationString' => 'String de Ativação X10',
+ 'X10ActivationString' => 'String de Ativação X10',
'X10InputAlarmString' => 'String de Entrada de alarme X10',
- 'X10OutputAlarmString' => 'String de Saída de Alarme X10',
+ 'X10OutputAlarmString' => 'String de SaÃda de Alarme X10',
'Y' => 'Y',
'Yes' => 'Sim',
- 'YouNoPerms' => 'Você não tem permissões para acessar este recurso.',
+ 'YouNoPerms' => 'Você não tem permissões para acessar este recurso.',
'Zone' => 'Zona',
'ZoneAlarmColour' => 'Cor de Alarme (Red/Green/Blue)',
'ZoneArea' => 'Zone Area',
@@ -701,13 +701,13 @@ $SLANG = array(
// Complex replacements with formatting and/or placements, must be passed through sprintf
$CLANG = array(
- 'CurrentLogin' => 'Login atual é \'%1$s\'',
+ 'CurrentLogin' => 'Login atual é \'%1$s\'',
'EventCount' => '%1$s %2$s', // For example '37 Events' (from Vlang below)
- 'LastEvents' => 'Últimos %1$s %2$s', // For example 'Last 37 Events' (from Vlang below)
- 'LatestRelease' => 'A Última versão é v%1$s, você tem v%2$s.',
+ 'LastEvents' => 'Últimos %1$s %2$s', // For example 'Last 37 Events' (from Vlang below)
+ 'LatestRelease' => 'A Última versão é v%1$s, você tem v%2$s.',
'MonitorCount' => '%1$s %2$s', // For example '4 Monitors' (from Vlang below)
- 'MonitorFunction' => 'Monitor %1$s Funcção',
- 'RunningRecentVer' => 'Você está usando a versão mais recente do ZoneMinder, v%s.',
+ 'MonitorFunction' => 'Monitor %1$s Funcção',
+ 'RunningRecentVer' => 'Você está usando a versão mais recente do ZoneMinder, v%s.',
'VersionMismatch' => 'Version mismatch, system is version %1$s, database is %2$s.', // Added - 2011-05-25
);
diff --git a/web/lang/se_se.php b/web/lang/se_se.php
index 60b26d741..e624e5696 100644
--- a/web/lang/se_se.php
+++ b/web/lang/se_se.php
@@ -72,92 +72,92 @@
// Simple String Replacements
$SLANG = array(
- '24BitColour' => '24 bitars färg',
- '32BitColour' => '32 bitars färg', // Added - 2011-06-15
- '8BitGrey' => '8 bit gråskala',
+ '24BitColour' => '24 bitars färg',
+ '32BitColour' => '32 bitars färg', // Added - 2011-06-15
+ '8BitGrey' => '8 bit gråskala',
'Action' => 'Action',
'Actual' => 'Verklig',
'AddNewControl' => 'Ny kontroll',
'AddNewMonitor' => 'Ny bevakare',
- 'AddNewUser' => 'Ny användare',
+ 'AddNewUser' => 'Ny användare',
'AddNewZone' => 'Ny zon',
'Alarm' => 'Larm',
'AlarmBrFrames' => 'Larm ramar',
'AlarmFrame' => 'Larmram',
- 'AlarmFrameCount' => 'Larmramsräknare',
- 'AlarmLimits' => 'Larmgränser',
- 'AlarmMaximumFPS' => 'Max. ramar/s för larm',
+ 'AlarmFrameCount' => 'Larmramsräknare',
+ 'AlarmLimits' => 'Larmgränser',
+ 'AlarmMaximumFPS' => 'Max. ramar/s för larm',
'AlarmPx' => 'Larmpunkter',
- 'AlarmRGBUnset' => 'Du måste sätta en färg för RGB-larm',
+ 'AlarmRGBUnset' => 'Du måste sätta en färg för RGB-larm',
'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18
'Alert' => 'Varning',
'All' => 'Alla',
'AnalysisFPS' => 'Analysis FPS', // Added - 2015-07-22
'AnalysisUpdateDelay' => 'Analysis Update Delay', // Added - 2015-07-23
- 'Apply' => 'Lägg till',
- 'ApplyingStateChange' => 'Aktivera statusändring',
+ 'Apply' => 'Lägg till',
+ 'ApplyingStateChange' => 'Aktivera statusändring',
'ArchArchived' => 'Arkivera endast',
'ArchUnarchived' => 'Endast ej arkiverade',
'Archive' => 'Arkiv',
'Archived' => 'Arkiverad',
- 'Area' => 'Område',
- 'AreaUnits' => 'Område (px/%)',
+ 'Area' => 'Område',
+ 'AreaUnits' => 'Område (px/%)',
'AttrAlarmFrames' => 'Larmramar',
'AttrArchiveStatus' => 'Arkivstatus',
- 'AttrAvgScore' => 'Ung. värde',
+ 'AttrAvgScore' => 'Ung. värde',
'AttrCause' => 'Orsak',
'AttrDate' => 'Datum',
'AttrDateTime' => 'Datum/Tid',
'AttrDiskBlocks' => 'Diskblock',
'AttrDiskPercent' => 'Diskprocent',
- 'AttrDuration' => 'Längd',
+ 'AttrDuration' => 'Längd',
'AttrFrames' => 'Ramar',
'AttrId' => 'Id',
- 'AttrMaxScore' => 'Max. värde',
+ 'AttrMaxScore' => 'Max. värde',
'AttrMonitorId' => 'Bevakningsid',
'AttrMonitorName' => 'Bevakningsnamn',
'AttrName' => 'Namn',
'AttrNotes' => 'Notering',
'AttrSystemLoad' => 'Systemlast',
'AttrTime' => 'Tid',
- 'AttrTotalScore' => 'Totalvärde',
+ 'AttrTotalScore' => 'Totalvärde',
'AttrWeekday' => 'Veckodag',
'Auto' => 'Automatik',
- 'AutoStopTimeout' => 'Tidsutlösning för automatstop',
+ 'AutoStopTimeout' => 'Tidsutlösning för automatstop',
'Available' => 'Available', // Added - 2009-03-31
- 'AvgBrScore' => 'Ung. träff',
+ 'AvgBrScore' => 'Ung. träff',
'Background' => 'Bakgrund',
- 'BackgroundFilter' => 'Kör filter i bakgrunden',
- 'BadAlarmFrameCount' => 'Ramantalet för larm måste vara ett heltal, minsta värdet är 1',
- 'BadAlarmMaxFPS' => 'Larm för bilder/s måste vara ett positivt heltal eller ett flyttal',
+ 'BackgroundFilter' => 'Kör filter i bakgrunden',
+ 'BadAlarmFrameCount' => 'Ramantalet för larm måste vara ett heltal, minsta värdet är 1',
+ 'BadAlarmMaxFPS' => 'Larm för bilder/s måste vara ett positivt heltal eller ett flyttal',
'BadAnalysisFPS' => 'Analysis FPS must be a positive integer or floating point value', // Added - 2015-07-22
'BadAnalysisUpdateDelay'=> 'Analysis update delay must be set to an integer of zero or more', // Added - 2015-07-23
- 'BadChannel' => 'Kanalen måste vara ett heltal, noll eller högre',
+ 'BadChannel' => 'Kanalen måste vara ett heltal, noll eller högre',
'BadColours' => 'Target colour must be set to a valid value', // Added - 2011-06-15
- 'BadDevice' => 'Enheten måste sättas till ett giltigt värde',
- 'BadFPSReportInterval' => 'Buffern för ramintervallrapporten måste vara ett heltal på minst 0 eller högre',
- 'BadFormat' => 'Formatet måste vara ett heltal, noll eller högre',
- 'BadFrameSkip' => 'Värdet för ramöverhopp måste vara ett heltal på 0 eller högre',
- 'BadHeight' => 'Höjden måste sättas till ett giltigt värde',
- 'BadHost' => 'Detta fält ska innehålla en giltig ip-adress eller värdnamn, inkludera inte http://',
- 'BadImageBufferCount' => 'Bufferstorleken för avbilden måste vara ett heltal på minst 10 eller högre',
- 'BadLabelX' => 'Etiketten för X koordinaten måste sättas till ett heltal, 0 eller högre',
- 'BadLabelY' => 'Etiketten för Y koordinaten måste sättas till ett heltal, 0 eller högre',
- 'BadMaxFPS' => 'Max. ramar/s måste vara ett positivt heltal eller ett flyttal',
+ 'BadDevice' => 'Enheten måste sättas till ett giltigt värde',
+ 'BadFPSReportInterval' => 'Buffern för ramintervallrapporten måste vara ett heltal på minst 0 eller högre',
+ 'BadFormat' => 'Formatet måste vara ett heltal, noll eller högre',
+ 'BadFrameSkip' => 'Värdet för ramöverhopp måste vara ett heltal på 0 eller högre',
+ 'BadHeight' => 'Höjden måste sättas till ett giltigt värde',
+ 'BadHost' => 'Detta fält ska innehålla en giltig ip-adress eller värdnamn, inkludera inte http://',
+ 'BadImageBufferCount' => 'Bufferstorleken för avbilden måste vara ett heltal på minst 10 eller högre',
+ 'BadLabelX' => 'Etiketten för X koordinaten måste sättas till ett heltal, 0 eller högre',
+ 'BadLabelY' => 'Etiketten för Y koordinaten måste sättas till ett heltal, 0 eller högre',
+ 'BadMaxFPS' => 'Max. ramar/s måste vara ett positivt heltal eller ett flyttal',
'BadMotionFrameSkip' => 'Motion Frame skip count must be an integer of zero or more',
- 'BadNameChars' => 'Namn kan endast innehålla alfanumeriska tecken, utrymmen, bindestreck och understreck',
+ 'BadNameChars' => 'Namn kan endast innehålla alfanumeriska tecken, utrymmen, bindestreck och understreck',
'BadPalette' => 'Palette must be set to a valid value', // Added - 2009-03-31
- 'BadPath' => 'Sökvägen måste innehålla ett giltigt värde',
- 'BadPort' => 'Porten måste innehålla ett giltigt nummer',
- 'BadPostEventCount' => 'Räknaren för efterhändelsen måste vara ett heltal på 0 eller högre',
- 'BadPreEventCount' => 'Räknaren för för-händelsen måste vara ett heltal på 0 eller högre, och mindre än bufferstorleken på avbilden',
- 'BadRefBlendPerc' => 'Mixprocenten för referensen måste hara ett positivt heltal',
- 'BadSectionLength' => 'Sektionslängden måste vara ett heltal på minst 30 eller högre',
- 'BadSignalCheckColour' => 'Kontrollfärgen på signalen måste vara en giltig RGB färgsträng',
- 'BadStreamReplayBuffer'=> 'Buffern för strömmande uppspelning måste vara ett heltal på 0 eller högre',
- 'BadWarmupCount' => 'Uppvärmingsramen måste vara ett heltal på 0 eller högre',
- 'BadWebColour' => 'Webbfärgen måste vara en giltig sträng för webbfärg',
- 'BadWidth' => 'Bredden måste sättas til ett giltigt värde',
+ 'BadPath' => 'Sökvägen måste innehålla ett giltigt värde',
+ 'BadPort' => 'Porten måste innehålla ett giltigt nummer',
+ 'BadPostEventCount' => 'Räknaren för efterhändelsen måste vara ett heltal på 0 eller högre',
+ 'BadPreEventCount' => 'Räknaren för för-händelsen måste vara ett heltal på 0 eller högre, och mindre än bufferstorleken på avbilden',
+ 'BadRefBlendPerc' => 'Mixprocenten för referensen måste hara ett positivt heltal',
+ 'BadSectionLength' => 'Sektionslängden måste vara ett heltal på minst 30 eller högre',
+ 'BadSignalCheckColour' => 'Kontrollfärgen på signalen måste vara en giltig RGB färgsträng',
+ 'BadStreamReplayBuffer'=> 'Buffern för strömmande uppspelning måste vara ett heltal på 0 eller högre',
+ 'BadWarmupCount' => 'Uppvärmingsramen måste vara ett heltal på 0 eller högre',
+ 'BadWebColour' => 'Webbfärgen måste vara en giltig sträng för webbfärg',
+ 'BadWidth' => 'Bredden måste sättas til ett giltigt värde',
'Bandwidth' => 'Bandbredd',
'BandwidthHead' => 'Bandwidth', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing
'BlobPx' => 'Blob Px',
@@ -168,7 +168,7 @@ $SLANG = array(
'Buffers' => 'Buffrar',
'CSSDescription' => 'Change the default css for this computer', // Added - 2015-04-18
'CanAutoFocus' => 'Har autofokus',
- 'CanAutoGain' => 'Har autonivå',
+ 'CanAutoGain' => 'Har autonivå',
'CanAutoIris' => 'Har autoiris',
'CanAutoWhite' => 'Har autovitbalans.',
'CanAutoZoom' => 'Har autozoom',
@@ -176,23 +176,23 @@ $SLANG = array(
'CanFocusAbs' => 'Har absolut fokus',
'CanFocusCon' => 'Har kontinuerlig fokus',
'CanFocusRel' => 'Har relativ fokus',
- 'CanGain' => 'Har nivå',
- 'CanGainAbs' => 'Har absolut nivå',
- 'CanGainCon' => 'Har kontinuerlig nivå',
- 'CanGainRel' => 'Har relativ nivå',
+ 'CanGain' => 'Har nivå',
+ 'CanGainAbs' => 'Har absolut nivå',
+ 'CanGainCon' => 'Har kontinuerlig nivå',
+ 'CanGainRel' => 'Har relativ nivå',
'CanIris' => 'Har iris',
'CanIrisAbs' => 'Har absolut iris',
'CanIrisCon' => 'Har kontinuerlig iris',
'CanIrisRel' => 'Har relativ iris',
- 'CanMove' => 'Har förflyttning',
- 'CanMoveAbs' => 'Har absolut förflyttning',
- 'CanMoveCon' => 'Har kontinuerlig förflyttning',
- 'CanMoveDiag' => 'Har diagonal förflyttning',
- 'CanMoveMap' => 'Har mappad förflyttning',
- 'CanMoveRel' => 'Har relativ förflyttning',
+ 'CanMove' => 'Har förflyttning',
+ 'CanMoveAbs' => 'Har absolut förflyttning',
+ 'CanMoveCon' => 'Har kontinuerlig förflyttning',
+ 'CanMoveDiag' => 'Har diagonal förflyttning',
+ 'CanMoveMap' => 'Har mappad förflyttning',
+ 'CanMoveRel' => 'Har relativ förflyttning',
'CanPan' => 'Har panorering',
- 'CanReset' => 'Har återställning',
- 'CanSetPresets' => 'Har förinställningar',
+ 'CanReset' => 'Har återställning',
+ 'CanSetPresets' => 'Har förinställningar',
'CanSleep' => 'Kan vila',
'CanTilt' => 'Kan tilta',
'CanWake' => 'Kan vakna',
@@ -205,39 +205,39 @@ $SLANG = array(
'CanZoomAbs' => 'Kan zooma absolut',
'CanZoomCon' => 'Kan zooma kontinuerligt',
'CanZoomRel' => 'Kan zooma realativt',
- 'Cancel' => 'Ångra',
- 'CancelForcedAlarm' => 'Ångra tvingande larm',
- 'CaptureHeight' => 'Fångsthöjd',
+ 'Cancel' => 'Ã…ngra',
+ 'CancelForcedAlarm' => 'Ã…ngra tvingande larm',
+ 'CaptureHeight' => 'Fångsthöjd',
'CaptureMethod' => 'Capture Method', // Added - 2009-02-08
- 'CapturePalette' => 'Fångstpalett',
+ 'CapturePalette' => 'FÃ¥ngstpalett',
'CaptureResolution' => 'Capture Resolution', // Added - 2015-04-18
- 'CaptureWidth' => 'Fångstbredd',
+ 'CaptureWidth' => 'FÃ¥ngstbredd',
'Cause' => 'Orsak',
'CheckMethod' => 'Larmkontrollmetod',
'ChooseDetectedCamera' => 'Choose Detected Camera', // Added - 2009-03-31
- 'ChooseFilter' => 'Välj filter',
+ 'ChooseFilter' => 'Välj filter',
'ChooseLogFormat' => 'Choose a log format', // Added - 2011-06-17
'ChooseLogSelection' => 'Choose a log selection', // Added - 2011-06-17
- 'ChoosePreset' => 'Välj standard',
+ 'ChoosePreset' => 'Välj standard',
'Clear' => 'Clear', // Added - 2011-06-16
- 'Close' => 'Stäng',
- 'Colour' => 'Färg',
+ 'Close' => 'Stäng',
+ 'Colour' => 'Färg',
'Command' => 'Kommando',
'Component' => 'Component', // Added - 2011-06-16
'Config' => 'Konfigurera',
- 'ConfiguredFor' => 'Konfigurerad för',
- 'ConfirmDeleteEvents' => 'Är du säker på att du vill ta bort dom valda händelserna?',
- 'ConfirmPassword' => 'Bekräfta lösenord',
+ 'ConfiguredFor' => 'Konfigurerad för',
+ 'ConfirmDeleteEvents' => 'Är du säker på att du vill ta bort dom valda händelserna?',
+ 'ConfirmPassword' => 'Bekräfta lösenord',
'ConjAnd' => 'och',
'ConjOr' => 'eller',
'Console' => 'Konsoll',
- 'ContactAdmin' => 'Kontakta din administratör för detaljer.',
- 'Continue' => 'Fortsätt',
+ 'ContactAdmin' => 'Kontakta din administratör för detaljer.',
+ 'Continue' => 'Fortsätt',
'Contrast' => 'Kontrast',
'Control' => 'Kontroll',
'ControlAddress' => 'Kontrolladress',
- 'ControlCap' => 'Kontrollförmåga',
- 'ControlCaps' => 'Kontrollförmågor',
+ 'ControlCap' => 'Kontrollförmåga',
+ 'ControlCaps' => 'Kontrollförmågor',
'ControlDevice' => 'Kontrollenhet',
'ControlType' => 'Kontrolltyp',
'Controllable' => 'Kontrollerbar',
@@ -253,8 +253,8 @@ $SLANG = array(
'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18
'Delay' => 'Delay', // Added - 2015-04-18
'Delete' => 'Radera',
- 'DeleteAndNext' => 'Radera & Nästa',
- 'DeleteAndPrev' => 'Radera & Föreg.',
+ 'DeleteAndNext' => 'Radera & Nästa',
+ 'DeleteAndPrev' => 'Radera & Föreg.',
'DeleteSavedFilter' => 'Radera sparade filter',
'Description' => 'Beskrivning',
'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31
@@ -263,7 +263,7 @@ $SLANG = array(
'DeviceChannel' => 'Enhetskanal',
'DeviceFormat' => 'Enhetsformat',
'DeviceNumber' => 'Enhetsnummer',
- 'DevicePath' => 'Enhetssökväg',
+ 'DevicePath' => 'Enhetssökväg',
'Devices' => 'Enheter',
'Dimensions' => 'Dimensioner',
'DisableAlarms' => 'Avaktivera larm',
@@ -271,39 +271,39 @@ $SLANG = array(
'Display' => 'Display', // Added - 2011-01-30
'Displaying' => 'Displaying', // Added - 2011-06-16
'DoNativeMotionDetection'=> 'Do Native Motion Detection',
- 'Donate' => 'Var vänlig och donera',
+ 'Donate' => 'Var vänlig och donera',
'DonateAlready' => 'Nej, Jag har redan donerat',
- 'DonateEnticement' => 'Du har kört ZoneMinder ett tag nu och förhoppningsvis har du sett att det fungerar bra hemma eller på ditt företag. Även om ZoneMinder är, och kommer att vara, fri programvara och öppen kallkod, så kostar det pengar att utveckla och underhålla. Om du vill hjälpa till med framtida utveckling och nya funktioner så var vanlig och bidrag med en slant. Bidragen är naturligtvis en option men mycket uppskattade och du kan bidra med precis hur mycket du vill. Om du vill ge ett bidrag väljer du nedan eller surfar till http://www.zoneminder.com/donate.html. Tack för att du använder ZoneMinder, glöm inte att besöka forumen på ZoneMinder.com för support och förslag om hur du får din ZoneMinder att fungera lite bättre.',
- 'DonateRemindDay' => 'Inte än, påminn om 1 dag',
- 'DonateRemindHour' => 'Inte än, påminn om en 1 timme',
- 'DonateRemindMonth' => 'Inte än, påminn om 1 månad',
- 'DonateRemindNever' => 'Nej, Jag vill inte donera, påminn mig inte mer',
- 'DonateRemindWeek' => 'Inte än, påminn om 1 vecka',
- 'DonateYes' => 'Ja, jag vill gärna donera nu',
+ 'DonateEnticement' => 'Du har kört ZoneMinder ett tag nu och förhoppningsvis har du sett att det fungerar bra hemma eller på ditt företag. Även om ZoneMinder är, och kommer att vara, fri programvara och öppen kallkod, så kostar det pengar att utveckla och underhålla. Om du vill hjälpa till med framtida utveckling och nya funktioner så var vanlig och bidrag med en slant. Bidragen är naturligtvis en option men mycket uppskattade och du kan bidra med precis hur mycket du vill. Om du vill ge ett bidrag väljer du nedan eller surfar till http://www.zoneminder.com/donate.html. Tack för att du använder ZoneMinder, glöm inte att besöka forumen på ZoneMinder.com för support och förslag om hur du får din ZoneMinder att fungera lite bättre.',
+ 'DonateRemindDay' => 'Inte än, påminn om 1 dag',
+ 'DonateRemindHour' => 'Inte än, påminn om en 1 timme',
+ 'DonateRemindMonth' => 'Inte än, påminn om 1 månad',
+ 'DonateRemindNever' => 'Nej, Jag vill inte donera, påminn mig inte mer',
+ 'DonateRemindWeek' => 'Inte än, påminn om 1 vecka',
+ 'DonateYes' => 'Ja, jag vill gärna donera nu',
'Download' => 'Ladda ner',
'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31
- 'Duration' => 'Längd',
+ 'Duration' => 'Längd',
'Edit' => 'Redigera',
'Email' => 'E-post',
'EnableAlarms' => 'Aktivera larm',
'Enabled' => 'Aktiverad',
'EnterNewFilterName' => 'Mata in nytt filternamn',
'Error' => 'Fel',
- 'ErrorBrackets' => 'Fel, kontrollera att du har samma antal vänster som höger-hakar',
- 'ErrorValidValue' => 'Fel, kontrollera att alla parametrar har giltligt värde',
+ 'ErrorBrackets' => 'Fel, kontrollera att du har samma antal vänster som höger-hakar',
+ 'ErrorValidValue' => 'Fel, kontrollera att alla parametrar har giltligt värde',
'Etc' => 'etc',
- 'Event' => 'Händelse',
- 'EventFilter' => 'Händelsefilter',
- 'EventId' => 'Händelse nr',
- 'EventName' => 'Händelsenamn',
- 'EventPrefix' => 'Händelseprefix',
- 'Events' => 'Händelser',
+ 'Event' => 'Händelse',
+ 'EventFilter' => 'Händelsefilter',
+ 'EventId' => 'Händelse nr',
+ 'EventName' => 'Händelsenamn',
+ 'EventPrefix' => 'Händelseprefix',
+ 'Events' => 'Händelser',
'Exclude' => 'Exkludera',
- 'Execute' => 'Utför',
+ 'Execute' => 'Utför',
'Export' => 'Exportera',
- 'ExportDetails' => 'Exportera händelsedetaljer',
+ 'ExportDetails' => 'Exportera händelsedetaljer',
'ExportFailed' => 'Exporten misslyckades',
- 'ExportFormat' => 'Filformat för exporter',
+ 'ExportFormat' => 'Filformat för exporter',
'ExportFormatTar' => 'Tar',
'ExportFormatZip' => 'Zip',
'ExportFrames' => 'Exportera ramdetaljer',
@@ -323,20 +323,20 @@ $SLANG = array(
'Ffmpeg' => 'Ffmpeg', // Added - 2009-02-08
'File' => 'Fil',
'Filter' => 'Filter', // Added - 2015-04-18
- 'FilterArchiveEvents' => 'Arkivera alla träffar',
- 'FilterDeleteEvents' => 'Radera alla träffar',
- 'FilterEmailEvents' => 'Skicka e-post med detaljer om alla träffar',
- 'FilterExecuteEvents' => 'Utför kommando på alla träffar',
+ 'FilterArchiveEvents' => 'Arkivera alla träffar',
+ 'FilterDeleteEvents' => 'Radera alla träffar',
+ 'FilterEmailEvents' => 'Skicka e-post med detaljer om alla träffar',
+ 'FilterExecuteEvents' => 'Utför kommando på alla träffar',
'FilterLog' => 'Filter log', // Added - 2015-04-18
- 'FilterMessageEvents' => 'Meddela detaljer om alla träffar',
+ 'FilterMessageEvents' => 'Meddela detaljer om alla träffar',
'FilterPx' => 'Filter Px',
- 'FilterUnset' => 'Du måste specificera filtrets bredd och höjd',
- 'FilterUploadEvents' => 'Ladda upp alla träffar',
- 'FilterVideoEvents' => 'Skapa video för alla träffar',
+ 'FilterUnset' => 'Du måste specificera filtrets bredd och höjd',
+ 'FilterUploadEvents' => 'Ladda upp alla träffar',
+ 'FilterVideoEvents' => 'Skapa video för alla träffar',
'Filters' => 'Filter',
- 'First' => 'Först',
- 'FlippedHori' => 'Vänd horisontellt',
- 'FlippedVert' => 'Vänd vertikalt',
+ 'First' => 'Först',
+ 'FlippedHori' => 'Vänd horisontellt',
+ 'FlippedVert' => 'Vänd vertikalt',
'FnMocord' => 'Mocord', // Added 2013.08.16.
'FnModect' => 'Modect', // Added 2013.08.16.
'FnMonitor' => 'Monitor', // Added 2013.08.16.
@@ -349,31 +349,31 @@ $SLANG = array(
'Frame' => 'Ram',
'FrameId' => 'Ram id',
'FrameRate' => 'Ram hastighet',
- 'FrameSkip' => 'Hoppa över ram',
+ 'FrameSkip' => 'Hoppa över ram',
'Frames' => 'Ramar',
'Func' => 'Funk',
'Function' => 'Funktion',
- 'Gain' => 'Nivå',
+ 'Gain' => 'Nivå',
'General' => 'Generell',
'GenerateVideo' => 'Skapa video',
'GeneratingVideo' => 'Skapar video',
- 'GoToZoneMinder' => 'Gå till ZoneMinder.com',
- 'Grey' => 'Grå',
+ 'GoToZoneMinder' => 'GÃ¥ till ZoneMinder.com',
+ 'Grey' => 'Grå',
'Group' => 'Grupp',
'Groups' => 'Grupper',
'HasFocusSpeed' => 'Har focushastighet',
- 'HasGainSpeed' => 'Har nivåhastighet',
- 'HasHomePreset' => 'Har normalinställning',
+ 'HasGainSpeed' => 'Har nivåhastighet',
+ 'HasHomePreset' => 'Har normalinställning',
'HasIrisSpeed' => 'Har irishastighet',
'HasPanSpeed' => 'Har panoramahastighet',
- 'HasPresets' => 'Har förinställningar',
+ 'HasPresets' => 'Har förinställningar',
'HasTiltSpeed' => 'Har tilthastighet',
'HasTurboPan' => 'Har turbopanorering',
'HasTurboTilt' => 'Har turbotilt',
'HasWhiteSpeed' => 'Har vitbalanshastighet',
'HasZoomSpeed' => 'Har Zoomhastighet',
- 'High' => 'Hög',
- 'HighBW' => 'Hög bandbredd',
+ 'High' => 'Hög',
+ 'HighBW' => 'Hög bandbredd',
'Home' => 'Hem',
'Hour' => 'Timme',
'Hue' => 'Hue',
@@ -387,17 +387,17 @@ $SLANG = array(
'Include' => 'Inkludera',
'Inverted' => 'Inverterad',
'Iris' => 'Iris',
- 'KeyString' => 'Nyckelsträng',
+ 'KeyString' => 'Nyckelsträng',
'Label' => 'Etikett',
- 'Language' => 'Språk',
+ 'Language' => 'Språk',
'Last' => 'Sist',
'Layout' => 'Layout', // Added - 2009-02-08
'Level' => 'Level', // Added - 2011-06-16
'Libvlc' => 'Libvlc',
'LimitResultsPost' => 'resultaten;', // This is used at the end of the phrase 'Limit to first N results only'
- 'LimitResultsPre' => 'Begränsa till första', // This is used at the beginning of the phrase 'Limit to first N results only'
+ 'LimitResultsPre' => 'Begränsa till första', // This is used at the beginning of the phrase 'Limit to first N results only'
'Line' => 'Line', // Added - 2011-06-16
- 'LinkedMonitors' => 'Länkade övervakare',
+ 'LinkedMonitors' => 'Länkade övervakare',
'List' => 'Lista',
'Load' => 'Belastning',
'Local' => 'Lokal',
@@ -408,8 +408,8 @@ $SLANG = array(
'Login' => 'Logga in',
'Logout' => 'Logga ut',
'Logs' => 'Logs', // Added - 2011-06-17
- 'Low' => 'Låg',
- 'LowBW' => 'Låg bandbredd',
+ 'Low' => 'LÃ¥g',
+ 'LowBW' => 'LÃ¥g bandbredd',
'Main' => 'Huvudmeny',
'Man' => 'Man',
'Manual' => 'Manuell',
@@ -417,75 +417,75 @@ $SLANG = array(
'Max' => 'Max',
'MaxBandwidth' => 'Max bandbredd',
'MaxBrScore' => 'Max. Score',
- 'MaxFocusRange' => 'Max fokusområde',
+ 'MaxFocusRange' => 'Max fokusområde',
'MaxFocusSpeed' => 'Max fokushastighet',
'MaxFocusStep' => 'Max fokussteg',
- 'MaxGainRange' => 'Max nivåområde',
- 'MaxGainSpeed' => 'Max nivåhastighet',
- 'MaxGainStep' => 'Max nivåsteg',
- 'MaxIrisRange' => 'Max irsiområde',
+ 'MaxGainRange' => 'Max nivåområde',
+ 'MaxGainSpeed' => 'Max nivåhastighet',
+ 'MaxGainStep' => 'Max nivåsteg',
+ 'MaxIrisRange' => 'Max irsiområde',
'MaxIrisSpeed' => 'Max irishastighet',
'MaxIrisStep' => 'Max irissteg',
- 'MaxPanRange' => 'Max panoramaområde',
+ 'MaxPanRange' => 'Max panoramaområde',
'MaxPanSpeed' => 'Max panoramahastighet',
'MaxPanStep' => 'Max panoramasteg',
- 'MaxTiltRange' => 'Max tiltområde',
+ 'MaxTiltRange' => 'Max tiltområde',
'MaxTiltSpeed' => 'Max tilthastighet',
'MaxTiltStep' => 'Max tiltsteg',
- 'MaxWhiteRange' => 'Max vitbalansområde',
+ 'MaxWhiteRange' => 'Max vitbalansområde',
'MaxWhiteSpeed' => 'Max vitbalanshastighet',
'MaxWhiteStep' => 'Max vitbalanssteg',
- 'MaxZoomRange' => 'Max zoomområde',
+ 'MaxZoomRange' => 'Max zoomområde',
'MaxZoomSpeed' => 'Max zoomhastighet',
'MaxZoomStep' => 'Max zoomsteg',
'MaximumFPS' => 'Max ramar/s',
'Medium' => 'Mellan',
'MediumBW' => 'Mellan bandbredd',
'Message' => 'Message', // Added - 2011-06-16
- 'MinAlarmAreaLtMax' => 'Minsta larmarean skall vara mindre än största',
- 'MinAlarmAreaUnset' => 'Du måste ange minsta antal larmbildpunkter',
- 'MinBlobAreaLtMax' => 'Minsta blobarean skall vara mindre än högsta',
- 'MinBlobAreaUnset' => 'Du måste ange minsta antalet blobpixlar',
- 'MinBlobLtMinFilter' => 'Minsta blobarean skall vara mindre än eller lika med minsta filterarean',
- 'MinBlobsLtMax' => 'Minsta antalet blobbar skall vara mindre än största',
- 'MinBlobsUnset' => 'Du måste ange minsta antalet blobbar',
- 'MinFilterAreaLtMax' => 'Minsta filterarean skall vara mindre än högsta',
- 'MinFilterAreaUnset' => 'Du måste ange minsta antal filterbildpunkter',
- 'MinFilterLtMinAlarm' => 'Minsta filterarean skall vara mindre än eller lika med minsta larmarean',
- 'MinFocusRange' => 'Min fokusområde',
+ 'MinAlarmAreaLtMax' => 'Minsta larmarean skall vara mindre än största',
+ 'MinAlarmAreaUnset' => 'Du måste ange minsta antal larmbildpunkter',
+ 'MinBlobAreaLtMax' => 'Minsta blobarean skall vara mindre än högsta',
+ 'MinBlobAreaUnset' => 'Du måste ange minsta antalet blobpixlar',
+ 'MinBlobLtMinFilter' => 'Minsta blobarean skall vara mindre än eller lika med minsta filterarean',
+ 'MinBlobsLtMax' => 'Minsta antalet blobbar skall vara mindre än största',
+ 'MinBlobsUnset' => 'Du måste ange minsta antalet blobbar',
+ 'MinFilterAreaLtMax' => 'Minsta filterarean skall vara mindre än högsta',
+ 'MinFilterAreaUnset' => 'Du måste ange minsta antal filterbildpunkter',
+ 'MinFilterLtMinAlarm' => 'Minsta filterarean skall vara mindre än eller lika med minsta larmarean',
+ 'MinFocusRange' => 'Min fokusområde',
'MinFocusSpeed' => 'Min fokushastighet',
'MinFocusStep' => 'Min fokussteg',
- 'MinGainRange' => 'Min nivåområde',
- 'MinGainSpeed' => 'Min nivåhastighet',
- 'MinGainStep' => 'Min nivåsteg',
- 'MinIrisRange' => 'Min irisområde',
+ 'MinGainRange' => 'Min nivåområde',
+ 'MinGainSpeed' => 'Min nivåhastighet',
+ 'MinGainStep' => 'Min nivåsteg',
+ 'MinIrisRange' => 'Min irisområde',
'MinIrisSpeed' => 'Min irishastighet',
'MinIrisStep' => 'Min irissteg',
- 'MinPanRange' => 'Min panoramaområde',
+ 'MinPanRange' => 'Min panoramaområde',
'MinPanSpeed' => 'Min panoramahastighet',
'MinPanStep' => 'Min panoramasteg',
- 'MinPixelThresLtMax' => 'Minsta tröskelvärde för bildpunkter ska vara mindre än högsta',
- 'MinPixelThresUnset' => 'Du måste ange minsta tröskelvärde för bildpunkter',
- 'MinTiltRange' => 'Min tiltområde',
+ 'MinPixelThresLtMax' => 'Minsta tröskelvärde för bildpunkter ska vara mindre än högsta',
+ 'MinPixelThresUnset' => 'Du måste ange minsta tröskelvärde för bildpunkter',
+ 'MinTiltRange' => 'Min tiltområde',
'MinTiltSpeed' => 'Min tilthastighet',
'MinTiltStep' => 'Min tiltsteg',
- 'MinWhiteRange' => 'Min vitbalansområde',
+ 'MinWhiteRange' => 'Min vitbalansområde',
'MinWhiteSpeed' => 'Min vitbalanshastighet',
'MinWhiteStep' => 'Min vitbalanssteg',
- 'MinZoomRange' => 'Min zoomområde',
+ 'MinZoomRange' => 'Min zoomområde',
'MinZoomSpeed' => 'Min zoomhastighet',
'MinZoomStep' => 'Min zoomsteg',
- 'Misc' => 'Övrigt',
+ 'Misc' => 'Övrigt',
'Mode' => 'Mode', // Added - 2015-04-18
'Monitor' => 'Bevakning',
'MonitorIds' => 'Bevakningsnr',
- 'MonitorPreset' => 'Förinställd bevakning',
- 'MonitorPresetIntro' => 'Välj en förinställning från listan. Var medveten om att detta kan skriva över inställningar du redan gjort för denna bevakare. ',
+ 'MonitorPreset' => 'Förinställd bevakning',
+ 'MonitorPresetIntro' => 'Välj en förinställning från listan. Var medveten om att detta kan skriva över inställningar du redan gjort för denna bevakare. ',
'MonitorProbe' => 'Monitor Probe', // Added - 2009-03-31
'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection. Select the desired entry from the list below. Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor. ', // Added - 2009-03-31
'Monitors' => 'Bevakare',
'Montage' => 'Montera',
- 'Month' => 'Månad',
+ 'Month' => 'MÃ¥nad',
'More' => 'More', // Added - 2011-06-16
'MotionFrameSkip' => 'Motion Frame Skip',
'Move' => 'Flytta',
@@ -494,65 +494,65 @@ $SLANG = array(
'Mtg3widgrx' => '3-wide grid, scaled, enlarge on alarm', // Added 2013.08.15.
'Mtg4widgrd' => '4-wide grid', // Added 2013.08.15.
'MtgDefault' => 'Default', // Added 2013.08.15.
- 'MustBeGe' => 'måste vara större än eller lika med',
- 'MustBeLe' => 'måste vara mindre än eller lika med',
- 'MustConfirmPassword' => 'Du måste bekräfta lösenordet',
- 'MustSupplyPassword' => 'Du måste ange ett lösenord',
- 'MustSupplyUsername' => 'Du måste ange ett användarnamn',
+ 'MustBeGe' => 'måste vara större än eller lika med',
+ 'MustBeLe' => 'måste vara mindre än eller lika med',
+ 'MustConfirmPassword' => 'Du måste bekräfta lösenordet',
+ 'MustSupplyPassword' => 'Du måste ange ett lösenord',
+ 'MustSupplyUsername' => 'Du måste ange ett användarnamn',
'Name' => 'Namn',
- 'Near' => 'Nära',
- 'Network' => 'Nätverk',
+ 'Near' => 'Nära',
+ 'Network' => 'Nätverk',
'New' => 'Ny',
'NewGroup' => 'Ny grupp',
'NewLabel' => 'Ny etikett',
- 'NewPassword' => 'Nytt lösenord',
- 'NewState' => 'Nytt läge',
- 'NewUser' => 'Ny användare',
- 'Next' => 'Nästa',
+ 'NewPassword' => 'Nytt lösenord',
+ 'NewState' => 'Nytt läge',
+ 'NewUser' => 'Ny användare',
+ 'Next' => 'Nästa',
'No' => 'Nej',
'NoDetectedCameras' => 'No Detected Cameras', // Added - 2009-03-31
- 'NoFramesRecorded' => 'Det finns inga ramar inspelade för denna händelse',
+ 'NoFramesRecorded' => 'Det finns inga ramar inspelade för denna händelse',
'NoGroup' => 'Ingen grupp',
'NoSavedFilters' => 'Inga sparade filter',
- 'NoStatisticsRecorded' => 'Det finns ingen statistik inspelad för denna händelse/ram',
+ 'NoStatisticsRecorded' => 'Det finns ingen statistik inspelad för denna händelse/ram',
'None' => 'Ingen',
- 'NoneAvailable' => 'Ingen tillgänglig',
+ 'NoneAvailable' => 'Ingen tillgänglig',
'Normal' => 'Normal',
'Notes' => 'Not.',
- 'NumPresets' => 'Antal förinställningar',
+ 'NumPresets' => 'Antal förinställningar',
'Off' => 'Av',
- 'On' => 'På',
+ 'On' => 'PÃ¥',
'OnvifCredentialsIntro'=> 'Please supply user name and password for the selected camera. If no user has been created for the camera then the user given here will be created with the given password. ', // Added - 2015-04-18
'OnvifProbe' => 'ONVIF', // Added - 2015-04-18
'OnvifProbeIntro' => 'The list below shows detected ONVIF cameras and whether they are already being used or available for selection. Select the desired entry from the list below. Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor. ', // Added - 2015-04-18
'OpEq' => 'lika med',
- 'OpGt' => 'större än',
- 'OpGtEq' => 'större än eller lika med',
+ 'OpGt' => 'större än',
+ 'OpGtEq' => 'större än eller lika med',
'OpIn' => 'in set',
- 'OpLt' => 'mindre än',
- 'OpLtEq' => 'mindre än eller lika med',
+ 'OpLt' => 'mindre än',
+ 'OpLtEq' => 'mindre än eller lika med',
'OpMatches' => 'matchar',
'OpNe' => 'inte lika med',
'OpNotIn' => 'inte i set',
'OpNotMatches' => 'matchar inte',
- 'Open' => 'Öppna',
- 'OptionHelp' => 'Optionhjälp',
- 'OptionRestartWarning' => 'Dessa ändringar kommer inte att vara implementerade\nnär systemet körs. När du är klar starta om\n ZoneMinder.',
+ 'Open' => 'Öppna',
+ 'OptionHelp' => 'Optionhjälp',
+ 'OptionRestartWarning' => 'Dessa ändringar kommer inte att vara implementerade\nnär systemet körs. När du är klar starta om\n ZoneMinder.',
'Options' => 'Alternativ',
'OrEnterNewName' => 'eller skriv in nytt namn',
'Order' => 'Sortera',
'Orientation' => 'Orientation',
'Out' => 'Ut',
- 'OverwriteExisting' => 'Skriv över',
+ 'OverwriteExisting' => 'Skriv över',
'Paged' => 'Paged',
'Pan' => 'Panorera',
- 'PanLeft' => 'Panorera vänster',
- 'PanRight' => 'Panorera höger',
+ 'PanLeft' => 'Panorera vänster',
+ 'PanRight' => 'Panorera höger',
'PanTilt' => 'Pan/Tilt',
'Parameter' => 'Parameter',
- 'Password' => 'Lösenord',
- 'PasswordsDifferent' => 'Lösenorden skiljer sig åt',
- 'Paths' => 'Sökvägar',
+ 'Password' => 'Lösenord',
+ 'PasswordsDifferent' => 'Lösenorden skiljer sig åt',
+ 'Paths' => 'Sökvägar',
'Pause' => 'Paus',
'Phone' => 'Mobil',
'PhoneBW' => 'Mobil bandbredd',
@@ -561,15 +561,15 @@ $SLANG = array(
'Pixels' => 'bildpunkter',
'Play' => 'Spela',
'PlayAll' => 'Visa alla',
- 'PleaseWait' => 'Vänta...',
+ 'PleaseWait' => 'Vänta...',
'Plugins' => 'Plugins',
'Point' => 'Punkt',
'PostEventImageBuffer' => 'Post Event Image Count',
'PreEventImageBuffer' => 'Pre Event Image Count',
- 'PreserveAspect' => 'Bevara lägesförhållande',
- 'Preset' => 'Förinställning',
- 'Presets' => 'Förinställningar',
- 'Prev' => 'Föreg.',
+ 'PreserveAspect' => 'Bevara lägesförhållande',
+ 'Preset' => 'Förinställning',
+ 'Presets' => 'Förinställningar',
+ 'Prev' => 'Föreg.',
'Probe' => 'Probe', // Added - 2009-03-31
'ProfileProbe' => 'Stream Probe', // Added - 2015-04-18
'ProfileProbeIntro' => 'The list below shows the existing stream profiles of the selected camera . Select the desired entry from the list below. Please note that ZoneMinder cannot configure additional profiles and that choosing a camera here may overwrite any values you already have configured for the current monitor. ', // Added - 2015-04-18
@@ -580,51 +580,51 @@ $SLANG = array(
'Record' => 'Spela in',
'RefImageBlendPct' => 'Reference Image Blend %ge',
'Refresh' => 'Uppdatera',
- 'Remote' => 'Fjärr',
- 'RemoteHostName' => 'Fjärrnamn',
- 'RemoteHostPath' => 'Fjärrsökväg',
- 'RemoteHostPort' => 'Fjärrport',
+ 'Remote' => 'Fjärr',
+ 'RemoteHostName' => 'Fjärrnamn',
+ 'RemoteHostPath' => 'Fjärrsökväg',
+ 'RemoteHostPort' => 'Fjärrport',
'RemoteHostSubPath' => 'Remote Host SubPath', // Added - 2009-02-08
- 'RemoteImageColours' => 'Fjärrbildfärger',
+ 'RemoteImageColours' => 'Fjärrbildfärger',
'RemoteMethod' => 'Remote Method', // Added - 2009-02-08
'RemoteProtocol' => 'Remote Protocol', // Added - 2009-02-08
'Rename' => 'Byt namn',
'Replay' => 'Repris',
- 'ReplayAll' => 'Alla händelser',
+ 'ReplayAll' => 'Alla händelser',
'ReplayGapless' => 'Gapless Events',
- 'ReplaySingle' => 'Ensam händelse',
- 'Reset' => 'Återställ',
- 'ResetEventCounts' => 'Återställ händelseräknare',
- 'Restart' => 'Återstart',
- 'Restarting' => 'Återstartar',
- 'RestrictedCameraIds' => 'Begränsade kameranr.',
- 'RestrictedMonitors' => 'Begränsade bevakare',
- 'ReturnDelay' => 'Fördröjd retur',
- 'ReturnLocation' => 'Återvänd till position',
+ 'ReplaySingle' => 'Ensam händelse',
+ 'Reset' => 'Återställ',
+ 'ResetEventCounts' => 'Återställ händelseräknare',
+ 'Restart' => 'Ã…terstart',
+ 'Restarting' => 'Ã…terstartar',
+ 'RestrictedCameraIds' => 'Begränsade kameranr.',
+ 'RestrictedMonitors' => 'Begränsade bevakare',
+ 'ReturnDelay' => 'Fördröjd retur',
+ 'ReturnLocation' => 'Återvänd till position',
'Rewind' => 'Backa',
- 'RotateLeft' => 'Rotera vänster',
- 'RotateRight' => 'Rotera höger',
+ 'RotateLeft' => 'Rotera vänster',
+ 'RotateRight' => 'Rotera höger',
'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25
- 'RunMode' => 'Körläge',
- 'RunState' => 'Körläge',
- 'Running' => 'Körs',
+ 'RunMode' => 'Körläge',
+ 'RunState' => 'Körläge',
+ 'Running' => 'Körs',
'Save' => 'Spara',
'SaveAs' => 'Spara som',
'SaveFilter' => 'Spara filter',
'Scale' => 'Skala',
'Score' => 'Resultat',
'Secs' => 'Sek',
- 'Sectionlength' => 'Sektionslängd',
- 'Select' => 'Välj',
+ 'Sectionlength' => 'Sektionslängd',
+ 'Select' => 'Välj',
'SelectFormat' => 'Select Format', // Added - 2011-06-17
'SelectLog' => 'Select Log', // Added - 2011-06-17
- 'SelectMonitors' => 'Välj bevakare',
- 'SelfIntersecting' => 'Polygonändarna får inte överlappa',
- 'Set' => 'Ställ in',
- 'SetNewBandwidth' => 'Ställ in ny bandbredd',
- 'SetPreset' => 'Ställ in förinställning',
- 'Settings' => 'Inställningar',
- 'ShowFilterWindow' => 'Visa fönsterfilter',
+ 'SelectMonitors' => 'Välj bevakare',
+ 'SelfIntersecting' => 'Polygonändarna får inte överlappa',
+ 'Set' => 'Ställ in',
+ 'SetNewBandwidth' => 'Ställ in ny bandbredd',
+ 'SetPreset' => 'Ställ in förinställning',
+ 'Settings' => 'Inställningar',
+ 'ShowFilterWindow' => 'Visa fönsterfilter',
'ShowTimeline' => 'Visa tidslinje',
'SignalCheckColour' => 'Signal Check Colour',
'Size' => 'Storlek',
@@ -633,31 +633,31 @@ $SLANG = array(
'SortAsc' => 'Stigande',
'SortBy' => 'Sortera',
'SortDesc' => 'Fallande',
- 'Source' => 'Källa',
+ 'Source' => 'Källa',
'SourceColours' => 'Source Colours', // Added - 2009-02-08
'SourcePath' => 'Source Path', // Added - 2009-02-08
- 'SourceType' => 'Källtyp',
+ 'SourceType' => 'Källtyp',
'Speed' => 'Hastighet',
- 'SpeedHigh' => 'Höghastighet',
- 'SpeedLow' => 'Låghastighet',
+ 'SpeedHigh' => 'Höghastighet',
+ 'SpeedLow' => 'LÃ¥ghastighet',
'SpeedMedium' => 'Normalhastighet',
'SpeedTurbo' => 'Turbohastighet',
'Start' => 'Start',
- 'State' => 'Läge',
+ 'State' => 'Läge',
'Stats' => 'Statistik',
'Status' => 'Status',
'Step' => 'Steg',
- 'StepBack' => 'Stepga bakåt',
- 'StepForward' => 'Stega framåt',
+ 'StepBack' => 'Stepga bakåt',
+ 'StepForward' => 'Stega framåt',
'StepLarge' => 'Stora steg',
'StepMedium' => 'Normalsteg',
'StepNone' => 'Inga steg',
- 'StepSmall' => 'Små steg',
+ 'StepSmall' => 'Små steg',
'Stills' => 'Stillbilder',
'Stop' => 'Stopp',
'Stopped' => 'Stoppad',
- 'Stream' => 'Strömmande',
- 'StreamReplayBuffer' => 'Buffert för strömmande uppspelning',
+ 'Stream' => 'Strömmande',
+ 'StreamReplayBuffer' => 'Buffert för strömmande uppspelning',
'Submit' => 'Skicka',
'System' => 'System',
'SystemLog' => 'System Log', // Added - 2011-06-16
@@ -667,22 +667,22 @@ $SLANG = array(
'Tilt' => 'Tilt',
'Time' => 'Tid',
'TimeDelta' => 'tidsdelta',
- 'TimeStamp' => 'Tidsstämpel',
+ 'TimeStamp' => 'Tidsstämpel',
'Timeline' => 'Tidslinje',
'TimelineTip1' => 'Pass your mouse over the graph to view a snapshot image and event details.', // Added 2013.08.15.
'TimelineTip2' => 'Click on the coloured sections of the graph, or the image, to view the event.', // Added 2013.08.15.
'TimelineTip3' => 'Click on the background to zoom in to a smaller time period based around your click.', // Added 2013.08.15.
'TimelineTip4' => 'Use the controls below to zoom out or navigate back and forward through the time range.', // Added 2013.08.15.
- 'Timestamp' => 'Tidsstämpel',
- 'TimestampLabelFormat' => 'Format på tidsstämpel',
- 'TimestampLabelX' => 'Värde på tidsstämpel X',
- 'TimestampLabelY' => 'Värde på tidsstämpel Y',
+ 'Timestamp' => 'Tidsstämpel',
+ 'TimestampLabelFormat' => 'Format på tidsstämpel',
+ 'TimestampLabelX' => 'Värde på tidsstämpel X',
+ 'TimestampLabelY' => 'Värde på tidsstämpel Y',
'Today' => 'Idag',
'Tools' => 'Verktyg',
'Total' => 'Total', // Added - 2011-06-16
'TotalBrScore' => 'Total Score',
- 'TrackDelay' => 'Spårfördröjning',
- 'TrackMotion' => 'Spåra rörelse',
+ 'TrackDelay' => 'Spårfördröjning',
+ 'TrackMotion' => 'Spåra rörelse',
'Triggers' => 'Triggers',
'TurboPanSpeed' => 'Turbo panoramahastighet',
'TurboTiltSpeed' => 'Turbo tilthastighet',
@@ -690,63 +690,63 @@ $SLANG = array(
'Unarchive' => 'Packa upp',
'Undefined' => 'Undefined', // Added - 2009-02-08
'Units' => 'Enheter',
- 'Unknown' => 'Okänd',
+ 'Unknown' => 'Okänd',
'Update' => 'Uppdatera',
- 'UpdateAvailable' => 'En uppdatering till ZoneMinder finns tillgänglig.',
- 'UpdateNotNecessary' => 'Ingen uppdatering behövs.',
+ 'UpdateAvailable' => 'En uppdatering till ZoneMinder finns tillgänglig.',
+ 'UpdateNotNecessary' => 'Ingen uppdatering behövs.',
'Updated' => 'Updated', // Added - 2011-06-16
'Upload' => 'Upload', // Added - 2011-08-23
- 'UseFilter' => 'Använd filter',
+ 'UseFilter' => 'Använd filter',
'UseFilterExprsPost' => ' filter expressions', // This is used at the end of the phrase 'use N filter expressions'
- 'UseFilterExprsPre' => 'Använd ', // This is used at the beginning of the phrase 'use N filter expressions'
+ 'UseFilterExprsPre' => 'Använd ', // This is used at the beginning of the phrase 'use N filter expressions'
'UsedPlugins' => 'Used Plugins',
- 'User' => 'Användare',
- 'Username' => 'Användarnamn',
- 'Users' => 'Användare',
+ 'User' => 'Användare',
+ 'Username' => 'Användarnamn',
+ 'Users' => 'Användare',
'V4L' => 'V4L', // Added - 2015-04-18
'V4LCapturesPerFrame' => 'Captures Per Frame', // Added - 2015-04-18
'V4LMultiBuffer' => 'Multi Buffering', // Added - 2015-04-18
- 'Value' => 'Värde',
+ 'Value' => 'Värde',
'Version' => 'Version',
'VersionIgnore' => 'Ignorera denna version',
- 'VersionRemindDay' => 'Påminn om 1 dag',
- 'VersionRemindHour' => 'Påminn om 1 timme',
- 'VersionRemindNever' => 'Påminn inte om nya versioner',
- 'VersionRemindWeek' => 'Påminn om en 1 vecka',
+ 'VersionRemindDay' => 'PÃ¥minn om 1 dag',
+ 'VersionRemindHour' => 'PÃ¥minn om 1 timme',
+ 'VersionRemindNever' => 'PÃ¥minn inte om nya versioner',
+ 'VersionRemindWeek' => 'PÃ¥minn om en 1 vecka',
'Video' => 'Video',
'VideoFormat' => 'Videoformat',
'VideoGenFailed' => 'Videogenereringen misslyckades!',
'VideoGenFiles' => 'Befintliga videofiler',
'VideoGenNoFiles' => 'Inga videofiler',
- 'VideoGenParms' => 'Inställningar för videogenerering',
+ 'VideoGenParms' => 'Inställningar för videogenerering',
'VideoGenSucceeded' => 'Videogenereringen lyckades!',
'VideoSize' => 'Videostorlek',
'View' => 'Visa',
'ViewAll' => 'Visa alla',
- 'ViewEvent' => 'Visa händelse',
+ 'ViewEvent' => 'Visa händelse',
'ViewPaged' => 'Visa Paged',
'Wake' => 'Vakna',
- 'WarmupFrames' => 'Värm upp ramar',
+ 'WarmupFrames' => 'Värm upp ramar',
'Watch' => 'Se',
'Web' => 'Webb',
- 'WebColour' => 'Webbfärg',
+ 'WebColour' => 'Webbfärg',
'Week' => 'Vecka',
'White' => 'Vit',
'WhiteBalance' => 'Vitbalans',
'Wide' => 'Vid',
'X' => 'X',
'X10' => 'X10',
- 'X10ActivationString' => 'X10 aktiveringssträng',
- 'X10InputAlarmString' => 'X10 larmingångssträng',
- 'X10OutputAlarmString' => 'X10 larmutgångssträng',
+ 'X10ActivationString' => 'X10 aktiveringssträng',
+ 'X10InputAlarmString' => 'X10 larmingångssträng',
+ 'X10OutputAlarmString' => 'X10 larmutgångssträng',
'Y' => 'J',
'Yes' => 'Ja',
- 'YouNoPerms' => 'Du har inte tillstånd till denna resurs.',
+ 'YouNoPerms' => 'Du har inte tillstånd till denna resurs.',
'Zone' => 'Zon',
- 'ZoneAlarmColour' => 'Larmfärg (Röd/Grön/Blå)',
+ 'ZoneAlarmColour' => 'Larmfärg (Röd/Grön/Blå)',
'ZoneArea' => 'Zonarea',
'ZoneExtendAlarmFrames' => 'Extend Alarm Frame Count',
- 'ZoneFilterSize' => 'Filterbredd/höjd (pixlar)',
+ 'ZoneFilterSize' => 'Filterbredd/höjd (pixlar)',
'ZoneMinMaxAlarmArea' => 'Min/Max larmarea',
'ZoneMinMaxBlobArea' => 'Min/Max blobbarea',
'ZoneMinMaxBlobs' => 'Min/Max blobbar',
@@ -762,13 +762,13 @@ $SLANG = array(
// Complex replacements with formatting and/or placements, must be passed through sprintf
$CLANG = array(
- 'CurrentLogin' => 'Aktuell inloggning är \'%1$s\'',
+ 'CurrentLogin' => 'Aktuell inloggning är \'%1$s\'',
'EventCount' => '%1$s %2$s', // For example '37 Events' (from Vlang below)
'LastEvents' => 'Senaste %1$s %2$s', // For example 'Last 37 Events' (from Vlang below)
- 'LatestRelease' => 'Aktuell version är v%1$s, du har v%2$s.',
+ 'LatestRelease' => 'Aktuell version är v%1$s, du har v%2$s.',
'MonitorCount' => '%1$s %2$s', // For example '4 Monitors' (from Vlang below)
'MonitorFunction' => 'Bevakare %1$s funktion',
- 'RunningRecentVer' => 'Du använder den senaste versionen av ZoneMinder, v%s.',
+ 'RunningRecentVer' => 'Du använder den senaste versionen av ZoneMinder, v%s.',
'VersionMismatch' => 'Version mismatch, system is version %1$s, database is %2$s.', // Added - 2011-05-25
);
@@ -806,7 +806,7 @@ $CLANG = array(
// Variable arrays expressing plurality, see the zmVlang description above
$VLANG = array(
- 'Event' => array( 0=>'Händelser', 1=>'Händelsen', 2=>'Händelserna' ),
+ 'Event' => array( 0=>'Händelser', 1=>'Händelsen', 2=>'Händelserna' ),
'Monitor' => array( 0=>'Bevakare', 1=>'Bevakare', 2=>'Bevakare' ),
);
@@ -826,7 +826,7 @@ function zmVlang( $langVarArray, $count )
return( $value );
}
}
- die( 'Fel, kan inte relatera variabel språksträng' );
+ die( 'Fel, kan inte relatera variabel språksträng' );
}
// This is an version that could be used in the Russian example above
@@ -886,8 +886,8 @@ function zmVlang( $langVarArray, $count )
// These overrides are in the form show below where the array key represents the option name minus the initial ZM_
$OLANG = array(
'LANG_DEFAULT' => array(
- 'Prompt' => "Välj språk för ZoneMinder",
- 'Help' => "ZoneMinder kan använda annat språk än engelska i menyer och texter. Välj här det språk du vill använda till ZoneMinder."
+ 'Prompt' => "Välj språk för ZoneMinder",
+ 'Help' => "ZoneMinder kan använda annat språk än engelska i menyer och texter. Välj här det språk du vill använda till ZoneMinder."
),
'OPTIONS_FFMPEG' => array(
'Help' => "Parameters in this field are passed on to FFmpeg. Multiple parameters can be separated by ,~~ ".
diff --git a/web/skins/classic/css/base/views/server.css b/web/skins/classic/css/base/views/server.css
new file mode 100644
index 000000000..4fd2806fd
--- /dev/null
+++ b/web/skins/classic/css/base/views/server.css
@@ -0,0 +1,3 @@
+input[type="text"] {
+ width: 100%;
+}
diff --git a/web/skins/classic/css/classic/views/watch.css b/web/skins/classic/css/classic/views/watch.css
index 4ebb30dda..247be4f05 100644
--- a/web/skins/classic/css/classic/views/watch.css
+++ b/web/skins/classic/css/classic/views/watch.css
@@ -38,13 +38,6 @@
text-align: center;
}
-#dvrControls input {
- height: 20px;
- width: 28px;
- padding-bottom: 3px;
- margin: 0 3px;
-}
-
#dvrControls input[disabled] {
color: #aaaaaa;
}
diff --git a/web/skins/classic/includes/export_functions.php b/web/skins/classic/includes/export_functions.php
index 879fd82c9..4234709de 100644
--- a/web/skins/classic/includes/export_functions.php
+++ b/web/skins/classic/includes/export_functions.php
@@ -18,21 +18,19 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
-function exportHeader( $title )
-{
+function exportHeader($title) {
?>
-
-
-
-
-
-
-
+
+
-
+ });
+ // ]]>
+
+
Id() );
+function exportEventDetail($event, $exportFrames, $exportImages) {
+ ob_start();
+ exportHeader(translate('Event').' '.$event->Id());
$otherlinks = '';
if( $exportFrames ) $otherlinks .= ''.translate('Frames').' ,';
if( $exportImages ) $otherlinks .= ''.translate('Images').' ,';
$otherlinks = substr($otherlinks,0,-1);
-
-
?>
@@ -139,22 +133,20 @@ function exportEventDetail( $event, $exportFrames, $exportImages )