diff options
| -rw-r--r-- | www/js/DataModel.js | 7 | ||||
| -rw-r--r-- | www/js/LoginCtrl.js | 3 | ||||
| -rw-r--r-- | www/js/TimelineCtrl.js | 266 | ||||
| -rw-r--r-- | www/lang/README.md | 3 | ||||
| -rw-r--r-- | www/lang/locale-en.json | 1 | ||||
| -rw-r--r-- | www/lang/locale-pl.json | 373 | ||||
| -rw-r--r-- | www/templates/timeline.html | 3 |
7 files changed, 577 insertions, 79 deletions
diff --git a/www/js/DataModel.js b/www/js/DataModel.js index ad1aaff6..e6af8baa 100644 --- a/www/js/DataModel.js +++ b/www/js/DataModel.js @@ -1493,6 +1493,9 @@ angular.module('zmApp.controllers') }, + getLocalTimeZoneNow: function() { + return moment.tz.guess(); + }, //returns TZ value immediately (sync) getTimeZoneNow: function() { @@ -1507,10 +1510,10 @@ angular.module('zmApp.controllers') return isTzSupported; }, - getTimeZone: function() { + getTimeZone: function(isForce) { var d = $q.defer(); - if (!tz) { + if (!tz || isForce) { log("First invocation of TimeZone, asking server"); var apiurl = loginData.apiurl + '/host/getTimeZone.json'; diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js index 4e4efc0a..db0440b4 100644 --- a/www/js/LoginCtrl.js +++ b/www/js/LoginCtrl.js @@ -606,10 +606,13 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r // possible image digits changed between servers NVRDataModel.getKeyConfigParams(0); + NVRDataModel.log("Validating APIs at " + apiurl); $http.get(apiurl) .success(function (data) { + + NVRDataModel.getTimeZone(true); var loginStatus = $translate.instant('kExploreEnjoy') + " " + $rootScope.appName + "!"; EventServer.refresh(); diff --git a/www/js/TimelineCtrl.js b/www/js/TimelineCtrl.js index 523c6d5d..0f67b085 100644 --- a/www/js/TimelineCtrl.js +++ b/www/js/TimelineCtrl.js @@ -96,7 +96,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla }); } - + // helps to navigate to current time quickly + // after a night of heavy navigation + $scope.gotoNow = function() + { + timeline.moveTo(timeline.getCurrentTime()); + }; $scope.move = function(percentage) { move(percentage); @@ -308,7 +313,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla $scope.$on('$ionicView.afterEnter', function() { $scope.monitors = message; - console.log("***AFTER ENTER"); + //console.log("***AFTER ENTER"); $scope.follow = { 'time': NVRDataModel.getLogin().followTimeLine }; @@ -353,11 +358,11 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla - console.log ("MONITORS:"+JSON.stringify($scope.monitors)); + //console.log ("MONITORS:"+JSON.stringify($scope.monitors)); if ($rootScope.customTimelineRange) { $scope.currentMode = 'custom'; - console.log("***** CUSTOM RANGE"); + //console.log("***** CUSTOM RANGE"); if (moment($rootScope.fromString).isValid() && moment($rootScope.toString).isValid()) { // console.log("FROM & TO IS CUSTOM"); @@ -368,15 +373,34 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla drawGraph(fromDate, toDate, maxItems); } else { console.log ("From:"+$rootScope.fromString + " To:"+$rootScope.toString); - console.log("FROM & TO IS CUSTOM INVALID"); - fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); + //console.log("FROM & TO IS CUSTOM INVALID"); + + if (NVRDataModel.getLogin().useLocalTimeZone) + { + fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); + } + else + { + fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); + } + drawGraph(fromDate, toDate, maxItems); } } else { $scope.currentMode = 'day'; - fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); + + if (NVRDataModel.getLogin().useLocalTimeZone) + { + fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); + } + else + { + fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); + } drawGraph(fromDate, toDate, maxItems); } @@ -449,8 +473,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla // fromDate and toDate will be used to plot the range for the graph // We start in day mode - var fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); - var toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); + // + var fromDate, toDate; + + + fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); @@ -566,8 +594,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla $scope.currentMode = "week"; $rootScope.customTimelineRange = false; NVRDataModel.log("Week view"); - toDate = moment().format("YYYY-MM-DD HH:mm:ss"); - fromDate = moment().subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).format("YYYY-MM-DD HH:mm:ss"); + fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss"); $scope.fromDate = fromDate; $scope.toDate = toDate; drawGraph(fromDate, toDate, maxItems); @@ -578,8 +606,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla $rootScope.customTimelineRange = false; NVRDataModel.log("Day view"); //toDate = moment().format("YYYY-MM-DD HH:mm:ss"); - fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss"); - toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss"); + fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss"); + toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss"); $scope.fromDate = fromDate; $scope.toDate = toDate; drawGraph(fromDate, toDate, maxItems); @@ -607,16 +635,24 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla var ld = NVRDataModel.getLogin(); // check for last 2 minutes to account for late DB updates and what not. 5 mins was likely enough - var from = moment(lastTimeForEvent).subtract(2, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss"); - var to = moment().locale('en').format("YYYY-MM-DD HH:mm:ss"); - lastTimeForEvent = moment(); + // + + + // make sure these are server time + var from = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); + from = from.subtract(2, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss"); + + var to = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); + to = to.locale('en').format("YYYY-MM-DD HH:mm:ss"); + + lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()); // FIXME: totally ignoring event pages - hoping it wont be more than 100 or 150 whatever // the events per page limit is. Why? laziness. // - var completedEvents = ld.apiurl + '/events/index/StartTime >=:' + from; + var completedEvents = ld.apiurl + '/events/index/EndTime >=:' + from; // we can add alarmCount as this is really for completed events - completedEvents = completedEvents + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0); + //completedEvents = completedEvents + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0); completedEvents = completedEvents + ".json"; @@ -625,11 +661,15 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla // so, lets limiy to 15 m // - var st = moment().subtract (10,'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss"); + var st = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow()); + st = st.subtract (10,'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss"); var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:'+st+'/EndTime =:.json'; //NVRDataModel.debug("Getting incremental events using: " + completedEvents); + NVRDataModel.debug ("Completed events API:"+completedEvents); + NVRDataModel.debug ("Ongoing events API:+"+ongoingEvents); + isProcessNewEventsWaiting = true; var $httpApi = $http.get(completedEvents); @@ -651,60 +691,81 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla for (var j = 0; j < myevents.length; j++) { - // get rid of the moment js deprecation notice - myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'); + // these are all in server timezone but no TZ + + myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss'); - myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'); + myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss'); var itm = graphData.get(myevents[j].Event.Id); if (itm) { - console.log(myevents[j].Event.Id + " already exists, updating params"); + // console.log(myevents[j].Event.Id + " already exists, updating params"); - var content = "<span class='my-vis-font'>" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>"; + var content = "<span class='my-vis-font'>" + "("+myevents[j].Event.Id+")"+myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>"; var style; var recordingInProgress = false; if (moment(myevents[j].Event.EndTime).isValid()) // recording over { - - content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + myevents[j].Event.Notes + "</span>"; + //console.log ("EVENT "+myevents[j].Event.Id+" emded at "+myevents[j].Event.EndTime); + + content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + " ("+myevents[j].Event.Id+") "+ myevents[j].Event.Notes + "</span>"; style = "background-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length] + ";border-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length]; } else // still recording { - myevents[j].Event.EndTime = moment.tz(moment(), NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'); + + var tze; + tze = moment().tz(NVRDataModel.getTimeZoneNow()); + + myevents[j].Event.EndTime = tze.format('YYYY-MM-DD HH:mm:ss'); + + //console.log ("END TIME = "+ myevents[j].Event.EndTime); + style = "background-color:orange"; recordingInProgress = true; } - if (moment(options.max).isBefore(moment())) { - // console.log("Adjusting Range to fit in new event"); - options.max = moment().add('1', 'hours').locale('en').format("YYYY-MM-DD HH:mm:ss"); - timeline.setOptions(options); - } - // data.update({id: 2, group: 1}); - // update end time - is it needed to be updated? - // - + + // right at this point we need to decide if we keep or remove this event // if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress) { // remove - NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have" + myevents[j].Event.AlarmFrames + " alarm frames"); + NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have " + myevents[j].Event.AlarmFrames + " alarm frames"); + // var old = timeline.getWindow(); graphData.remove(myevents[j].Event.Id); + // timeline.setWindow (old.start, old.end); } else { + + var tzs1, tze1; + if (NVRDataModel.getLogin().useLocalTimeZone) + { + tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + } + else + { + tzs1 = moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow()); + tze1 = moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow()); + } + + //tzs1 = tzs1.format("YYYY-MM-DD HH:mm:ss"); + //tze1 = tze1.format("YYYY-MM-DD HH:mm:ss"); + + NVRDataModel.debug("Updating Event:" + myevents[j].Event.Id + "StartTime:"+tzs1.format()+" EndTime:" + tze1.format()); graphData.update({ id: myevents[j].Event.Id, content: content, - start:moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow()), + start:tzs1, // start: myevents[j].Event.StartTime, // end: myevents[j].Event.EndTime, - end:moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow()), - group: myevents[j].Event.MonitorId, + end:tze1, + //group: myevents[j].Event.MonitorId, //type: "range", style: style, myframes: myevents[j].Event.Frames, @@ -716,7 +777,10 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla }); - timeline.focus(myevents[j].Event.Id); + //timeline.focus(myevents[j].Event.Id); + // + timeline.moveTo(timeline.getCurrentTime()); + //console.log ("Focus EID="+myevents[j].Event.Id); localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),'; @@ -754,12 +818,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla // console.log (JSON.stringify(myevents[j])); myevents[j].Event.DefaultVideo = ""; - if (NVRDataModel.getLogin().useLocalTimeZone) { - //console.log ("CHANGING TZ"); - myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'); - //2016-08-15 17:40:00 - myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'); - } + // now lets make sure we don't infinitely increase @@ -778,48 +837,69 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla // since this is a new add its possible dates are not defined if (!moment(myevents[j].Event.StartTime).isValid()) { - NVRDataModel.debug("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen "); + NVRDataModel.log("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen "); } if (!moment(myevents[j].Event.EndTime).isValid()) { - // NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, likely recording, so fixing" ); - myevents[j].Event.EndTime = moment.tz(moment(), NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'); + var t1 = moment().tz(NVRDataModel.getTimeZoneNow()); + + + + myevents[j].Event.EndTime = t1.format('YYYY-MM-DD HH:mm:ss'); + + NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, setting to current time"); + isBeingRecorded = true; } // if range doesn't allow for current time, we need to fix that - if (moment(options.max).isBefore(moment())) { + /*if (moment(options.max).isBefore(moment())) { // console.log("Adjusting Range to fit in new event"); options.max = moment().add('1', 'hours').locale('en').format("YYYY-MM-DD HH:mm:ss"); timeline.setOptions(options); - } + }*/ var eventText = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || ' unknown ') + ") " + myevents[j].Event.Notes + "</span>"; if (isBeingRecorded) { - eventText = "<span class='my-vis-font'>" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>"; + eventText = "<span class='my-vis-font'>" + "("+myevents[j].Event.Id+") "+ myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>"; } // since we concated, its possible events may be repeated if (!graphData.get(myevents[j].Event.Id)) { - NVRDataModel.debug(">>> "+myevents[j].Event.Id + " at " + myevents[j].Event.StartTime + " New event updating graph"); + localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),'; + var tzs2, tze2; + if (NVRDataModel.getLogin().useLocalTimeZone) + { + tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + } + else + { + tzs2 = moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow()); + tze2 = moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow()); + } + + //tzs2 = tzs2.format("YYYY-MM-DD HH:mm:ss"); + //tze2 = tze2.format("YYYY-MM-DD HH:mm:ss"); + NVRDataModel.debug(">>> "+myevents[j].Event.Id + " New event updating graph " + " from:" + tzs2.format()+" to:"+tze2.format() ); graphData.add({ id: myevents[j].Event.Id, content: eventText, - start:moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow()), + start:tzs2, //start: myevents[j].Event.StartTime, // end: myevents[j].Event.EndTime, - end:moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow()), + end:tze2, group: myevents[j].Event.MonitorId, style: "background-color:orange", //type: "range", @@ -833,11 +913,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla }); graphIndex++; + //timeline.focus(myevents[j].Event.Id); + timeline.moveTo(timeline.getCurrentTime()); } //options.max = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss"); - timeline.focus(myevents[j].Event.Id); + } //idfound @@ -918,21 +1000,48 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla //console.log ("AFTER VIS"); + var tzs, tze; + + // lets scope the time graph to either local or remote time zone + + if (NVRDataModel.getLogin().useLocalTimeZone) + { + tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + } + else + { + tzs = moment.tz(fromDate,NVRDataModel.getTimeZoneNow()); + tze = moment.tz(toDate,NVRDataModel.getTimeZoneNow()); + } + + //tzs = tzs.format("YYYY-MM-DD HH:mm:ss"); + //tze = tze.format("YYYY-MM-DD HH:mm:ss"); options = { showCurrentTime: true, editable: false, + moment: function (date) { + + //var t; + if (NVRDataModel.getLogin().useLocalTimeZone) + //if (0) + return moment.tz(date,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + else + // typecast to server time zone - its in server time anyway + return moment.tz(date,NVRDataModel.getTimeZoneNow()); + }, //throttleRedraw: 100, moveable: true, zoomable: true, selectable: true, - start: moment.tz(fromDate,NVRDataModel.getTimeZoneNow()), - end: moment.tz(toDate,NVRDataModel.getTimeZoneNow()), + start: tzs, + end: tze, orientation: 'top', - min: moment.tz(fromDate,NVRDataModel.getTimeZoneNow()), - max: moment.tz(toDate,NVRDataModel.getTimeZoneNow()), - zoomMin: 1 * 60 * 1000, // 1 min + min: tzs, + //max: tze, + zoomMin: 5 * 60 * 1000, // 1 min stack: false, format: { minorLabels: { @@ -1046,25 +1155,30 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla // console.log (JSON.stringify(myevents[i])); myevents[i].Event.DefaultVideo = ""; - if (NVRDataModel.getLogin().useLocalTimeZone) { - //console.log ("CHANGING TZ"); - myevents[i].Event.StartTime = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'); - //2016-08-15 17:40:00 - myevents[i].Event.EndTime = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'); - } - + //console.log ("ADDING "+myevents[i].Event.StartTime+"->"+myevents[i].Event.EndTime); - console.log ("ADDING "+myevents[i].Event.StartTime+"->"+myevents[i].Event.EndTime); + var tzs, tze; + if (NVRDataModel.getLogin().useLocalTimeZone) + { + tzs = moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + tze = moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow()); + } + else + { + tzs = moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow()); + tze = moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow()); + } + //console.log ("ADDED "+tzs+" " +tze); graphData.add({ //id: graphIndex, id: myevents[i].Event.Id, - content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") " + myevents[i].Event.Notes + "</span>", + content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") "+ "("+myevents[j].Event.Id+") " + myevents[i].Event.Notes + "</span>", - start:moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow()), + start:tzs, //start: myevents[i].Event.StartTime, //end: myevents[i].Event.EndTime, - end:moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow()), + end:tze, group: myevents[i].Event.MonitorId, //type: "range", style: "background-color:" + colors[parseInt(myevents[i].Event.MonitorId) % colors.length] + @@ -1132,7 +1246,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla } - lastTimeForEvent = moment(); + lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()); updateInterval = $interval(function() { processNewEvents(); }.bind(this), 10 * 1000); diff --git a/www/lang/README.md b/www/lang/README.md index bf5f23f3..1f7dfd31 100644 --- a/www/lang/README.md +++ b/www/lang/README.md @@ -1,6 +1,7 @@ ####Adding a new language +* Languages translations are available [here](https://github.com/pliablepixels/zmNinja/tree/master/www/lang) * To contribute a new language, add a new ``locale-xx.json`` (where `xx` is your language code). -* Ideally, you should also provide a language translation for the zmNinja help file inside ``lang/help`` +* Ideally, you should also provide a language translation for the zmNinja help file inside [lang/help](https://github.com/pliablepixels/zmNinja/tree/master/www/lang/help) The best way is to simply look at an existing language translation and follow the same model for yours. If any language translation keywords are missed, it will fallback to English. diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json index 78175511..6e999e49 100644 --- a/www/lang/locale-en.json +++ b/www/lang/locale-en.json @@ -210,6 +210,7 @@ "kNoMonitors" :"No monitors to display", "kNoMoreEvents" :"no more events", "kNormalPlay" :"normal play", + "kNow" :"now", "kOff" :"off", "kOn" :"on", "kOnTapNavigate" :"on tap, navigate to", diff --git a/www/lang/locale-pl.json b/www/lang/locale-pl.json new file mode 100644 index 00000000..68384173 --- /dev/null +++ b/www/lang/locale-pl.json @@ -0,0 +1,373 @@ +{ + "k1DaySummary" :"1 dzień zbiorczo", + "k1HourSummary" :"1 godzina zbiorczo", + "k1MonthSummary" :"1 miesiąc zbiorczo", + "k1WeekSummary" :"1 tydzień zbiorczo", + "kAlarmAPIError" :"błąd - upewnij się, że Twoje API obsługuje tą funkcję", + "kAlarmFrameCount" :"Ilość Klatek Alarmu", + "kAlarmMaxFPS" :"Max FPS Alarmu", + "kAlarms" :"Alarmy", + "kAll" :"Wszystko", + "kAnalyze" :"Analizuj", + "kApiUrl" :"Adres url API ZM", + "kApplyingChanges" :"Stosuję zmiany. Proszę czekać", + "kArrangingImages" :"układam obrazki", + "kAt" :"przy", + "kAuthSuccess" :"uwierzytelniono", + "kAuthenticating" :"uwierzytelniam", + "kAutoSwitchBW" :"automatyczna zmiana prędkości", + "kAwake1" :"Utrzymuj włączony ekran", + "kAwake2" :"(w trakcie oglądania materiału)", + "kBannerAPICheckFailed" :"błąd sprawdzania API", + "kBannerCannotDeleteNeedOne" :"Nie mogę usunąć, potrzebuję przynajmniej jednego", + "kBannerPinMismatch" :"błąd w kodzie PIN", + "kBannerPleaseCheck" :"Proszę sprawdzić ustawienia", + "kBodyPortalNotConfigured" :"Przed próbą detekcji ścieżki CGI proszę wprowadzić dane logowania oraz adres URL strony, a następnie wcisnąć ZAPISZ.", + "kButtonCancel" :"Anuluj", + "kButtonClear" :"Wyczyść", + "kButtonNo" :"Nie", + "kButtonOk" :"OK", + "kButtonSave" :"ZAPISZ", + "kButtonYes" :"Tak", + "kCalcEventSize" :"kalkuluję rozmiar Zdarzenia", + "kCancellingAlarm" :"usuwam Alarm", + "kChangeSettingsFor" :"Zmień ustawienia dla", + "kChangeState" :"Zmień Stan", + "kCheckCredentials" :"Proszę sprawdzić dane logowania", + "kChromeMax" :"maksimum 5 monitorów - limit chrome", + "kCleaningUp" :"czyszczenie", + "kClear" :"Wyczyść", + "kCollapse" :"zwiń", + "kConfiguration" :"Konfiguracja", + "kControl" :"kontrola", + "kCredentialsBody" :"Wprowadź swoje dane logowania ZoneMinder", + "kCredentialsTitle" :"Wymagane dane logowania", + "kCurrentState" :"obecny stan", + "kCustomRange" :"Zakres niestandardowy", + "kCycleMonitors" :"cykl monitorów", + "kCycleMonitorsInterval" :"interwał cyklu monitora", + "kDay" :"Dzień", + "kDecreaseSize" :"zmniejsz rozmiar", + "kDelete" :"Usuń", + "kDeleteEventError1" :"Nie można usunąc Zdarzenia", + "kDeleteEventError2" :"proszę sprawdzić logi", + "kDeleteEventSuccess" :"usunięte Zdarzenia", + "kDeleteLogsConfirm" :"Jesteś pewien, że chcesz usunąć logi?", + "kDeletingEvent" :"usuwam Zdarzenie", + "kDevOptions" :"Ustawienia zaawansowane", + "kDeveloperOptionsFor" :"Opcje zaawansowane dla", + "kDisableAlarmMontage" :"Wyłącz alarm API w Podglądzie", + "kDisableAlarmMontageSub" :"może pomóc jeśli serwer się przeciąży", + "kDisableNative" :"Wyłącz natywne przejścia", + "kDisableNativeSub" :"Włącz jeśli manu się blokuje", + "kDisablePush" :"wyłącz APNS/GCM", + "kDisableSamsung" :"Jeśli jesteś na urządzeniu Samsung i masz problem z wypełnianiem pól, czasowo wyłącz autokorektę", + "kDiscovering" :"wykrywam", + "kDiscoveringAPI" :"wykrywam API", + "kDiscoveringCGI" :"wykrywam CGI", + "kDiscoveringPortal" :"wykrywam portal", + "kDone" :"gotowe", + "kEnable24hr" :"włącz format czasu 24 godz.", + "kEnableDebug" :"Włącz dzienniki debugowania", + "kEnableLogs" :"Włącz dziennik", + "kEnableNewsUpdates" :"Włącz informację o aktualizacji", + "kEnterPin" :"Wprowadź PIN", + "kError" :"Błąd", + "kErrorChangingMonitors" :"Błąd zmiany monitorów. Proszę sprawdzić logi", + "kErrorFrameBanner" :"nie mogłem odczytać właściwości klatki", + "kErrorPleaseTryAgain" :"spróbuj jeszcze raz", + "kErrorRetrievingFrames" :"błąd odczytu klatki", + "kErrorRetrievingState" :"błąd odczytu stanu", + "kErrorSave" :"Błąd - nie mogłem zapisać", + "kEvent" :"zdarzenie", + "kEventHistFaster" :"szybciej", + "kEventHistHrs" :"godzin temu", + "kEventHistPause" :"pauza", + "kEventHistPlay" :"play", + "kEventHistShowFrom" :"Pokaż od", + "kEventHistSlower" :"wolniej", + "kEventMontage" :"Podgląd Zdarzeń", + "kEventMontageImageScale" :"Skalowanie obrazu Podglądu Zdarzeń", + "kEventNavVidFeeds" :"Nawigacja Zdarzeń nie jest możliwa z materiałem wideo. ZoneMinder jeszcze tego nie wspiera", + "kEventRecording" :"Nagrywanie Zdarzenia", + "kEventServer" :"Serwer Zdarzeń", + "kEventServerConfig1" :"Upewnij się, że ustawienia ZM są skonfigurowane i zapisane zanim zaczniesz konfigurować Serwer Zdarzeń", + "kEventServerVersionBody1" :"Używasz wersji", + "kEventServerVersionBody2" :"Aktualizuj do", + "kEventServerVersionTitle" :"Nie wspierana wersja Serwera Zdarzeń", + "kEventSingleImageScale" :"Skalowanie pojedynczego ekranu Zdarzenia", + "kEventView" :"Podgląd Zdarzenia", + "kEvents" :"zdarzenia", + "kEventsCap" :"Zdarzenia", + "kExampleServer" :"np. Mój Dom", + "kExitAppBackground" :"wyjdź z aplikacji w tle", + "kExitEventView" :"opuść podgląd zdarzenia", + "kExitFullScreen" :"wyłącz pełny ekran", + "kExitLiveView" :"opuść podgląd na żywo", + "kExpert" :"Ekspert", + "kExploreEnjoy" :"Przeglądaj menu i ciesz się życiem", + "kFallback" :"Konfiguracja awaryjna", + "kFallback2Configs" :"Potrzebujesz przynajmniej 2 osobnych konfiguracji dla konfiguracji awaryjnej", + "kFastForward" :"szybko w przód", + "kFastRewind" :"szybko w tył", + "kFillScreen" :"wypełnij ekran", + "kFilterByDateTime" :"Filtruj po Dacie/Godzinie", + "kFilterEvents" :"Filtruj Zdarzenia", + "kFilterEventsBetween1" :"Przeglądasz Zdarzenia między", + "kFilterEventsBetween2" :"Czy chcesz usunąć ten filtr?", + "kFilterOn" :"Filtr włączony", + "kFilterSettings" :"Ustawienia filtra", + "kFitScreen" :"dopasuj do ekranu", + "kFootage" :"Materiał", + "kForceAlarmConfirm" :"Czy na pewno chcesz wymusić alarm dla Monitora:", + "kForceImagePath" :"Zmuś Zdarzenia do użycia ścieżki pliku", + "kForcingAlarm" :"wymuszanie alarmu", + "kFrame" :"klatka", + "kFrameUpdate" :"Aktualizacja klatki", + "kFrames" :"klatki", + "kFrom" :"Od", + "kFromDate" :"Od Daty", + "kFromTime" :"Od Godziny", + "kGlobalConfiguration" :"Konfiguracja Główna", + "kGraphAlarmed" :"zaalarmowane", + "kGraphAll" :"wszystko", + "kGraphError" :"wystąpił błąd w trakcie reenderowania grafiki. Proszę sprawdzić logi", + "kH264VideoSupport" :"Wsparcie dla Video H264", + "kHideMonsWithoutEvents" :"Ukryj Monitory bez Zdarzeń", + "kHideTip" :"ukryj podpowiedź", + "kHighBWDisplay" :"wysoka przepustowość", + "kId" :"Id", + "kImages" :"Obrazy", + "kImpMsg1" :"Ważna Wiadomość", + "kImpMsg2" :"Będę wdzięczny jeśli aktualizujesz ZoneMinder", + "kImpMsg3" :"Działasz na", + "kImpMsg4" :"posiada ważne poprawki poprawiające pracę API z innymi funkcjami. Jest to niezbędne do działania nowych alarmów API i innych funkcji", + "kImpMsg5" :"Zgłoszona Wersja", + "kImpMsg6" :"Rekomendowana Wersja", + "kImpMsg7" :"Ok, załapałem", + "kIncreaseSize" :"zwiększ rozmiar", + "kLanguage" :"Język", + "kLatestEvents" :"ostatnie zdarzenia", + "kLiveView" :"Podgląd na żywo", + "kLoad" :"załaduj", + "kLoading" :"ładuję", + "kLoadingGraph" :"ładuję grafikę", + "kLoadingMonitors" :"ładuję monitory", + "kLocalTimeZone" :"użyj lokalnej strefy czasowej", + "kLoginStatusNoCgi" :"Login potwierdzony, ale nie mogłem potwierdzić ścieżki cgi. Jeśli podgląd na żywo nie działa, sprawdź ścieżkę cgi-bin lub użyj funkcji wykrywania.", + "kLoginStatusNoCgiAlt" :"Ścieżka cgi-bin którą wprowadziłeś może być niewłaściwa. Nie jestem pewien, ale jeśli Twój podgląd na żywo nie działa, sprawdź ścieżkę cgi lub spróbuj użyć funkcji wykrywania.", + "kLoginValidAPIFailedTitle" :"Login potwierdzony ale API zawiodło", + "kLoginValidatedTitle" :"Login Potwierdzony", + "kLogs" :"Logi", + "kLowBWDisplay" :"niska przepustowość", + "kLowBandwidth" :"tryb niskiej przepustowości", + "kManageServerGroups" :"Zarządzaj Serwerem Grup", + "kMaxFPS" :"Maksimum FPS", + "kMaxItemsForTimeline" :"Maks.szt. na Osi Czasu", + "kMaxMonitorsMontage" :"Maksimum monitorów w Podglądzie", + "kMenuDevSettings" :"Ustawienia Zaawansowane", + "kMenuEventMontage" :"Podgląd Zdarzeń", + "kMenuEvents" :"Zdarzenia", + "kMenuExit" :"Wyjdź", + "kMenuHelp" :"Pomoc", + "kMenuLogs" :"Logi", + "kMenuMonitors" :"Monitory", + "kMenuMontage" :"Podgląd", + "kMenuNews" :"Wiadomości", + "kMenuOptions" :"Menu", + "kMenuSystemStatus" :"Stan Systemu", + "kMenuTimeline" :"Oś czasu", + "kMenuTitle" :"Opcje", + "kMenuWizard" :"Kreator", + "kMenuZMSettings" :"Ustawienia", + "kMinAlarmCount" :"Minimalna ilość alarmów", + "kMinVersion" :"Minimalna Wymagana Wersja", + "kMinimumIntervals" :"minimalna przerwa", + "kMode" :"Tryb", + "kMonAlarmed" :"zaalarmowany", + "kMonAlert" :"alert", + "kMonIdle" :"bezczynny", + "kMonMocord" :"Mocord", + "kMonModect" :"Modect", + "kMonMonitor" :"Monitor", + "kMonNodect" :"Nodect", + "kMonNone" :"Żaden", + "kMonPreAlarm" :"pre-alarm", + "kMonRecord" :"Record", + "kMonitorSingleImageScale" :"Skalowanie pojedynczego obrazy Podglądu na żywo", + "kMonitors" :"Monitory", + "kMontage" :"Podgląd", + "kMontageImageScale" :"Skalowanie obrazu Podglądu", + "kMonth" :"Miesiąc", + "kMore" :"więcej", + "kNeedToKnow" :"Żeby rozpocząć muszę znać dane ścieżki i login Twojego ZoneMinder'a", + "kNegotiatingStreamAuth" :"negocjowanie uwierzytelnienia źródła", + "kNews" :"Wiadomości", + "kNext" :"Następny", + "kNextEvent" :"następne zdarzenie", + "kNextMonitor" :"następny monitor", + "kNoEvents" :"Brak Zdarzeń do wyświetlenia", + "kNoMonitors" :"Brak Monitorów do wyświetlenia", + "kNoMoreEvents" :"koniec Zdarzeń", + "kNormalPlay" :"normalne odtwarzanie", + "kOff" :"wyłącz", + "kOn" :"włącz", + "kOnTapNavigate" :"przyciskając przejdź do", + "kOneAuth" :"Musisz włączyć co najmniej jeden mechanizm uwierzytelniający", + "kOnlyUseWebSocket" :"użyj tylko websockets", + "kOperationInProgressBody" :"Poprzednia operacja nadal trwa. Czekaj", + "kOperationInProgressTitle" :"Operacja trwa", + "kPTZ" :"pan/tilt/zoom", + "kPTZNotReady" :"Nie gotowy na PTZ", + "kPTZnotConfigured" :"PTZ nie skonfigurowany dla tego Monitora", + "kPassword" :"hasło", + "kPathToCgi" :"ścieżka do cgi-bin", + "kPause" :"pauza", + "kPaused" :"wstrzymane", + "kPersistHidden" :"Utrzymuj ukryte Monitory", + "kPinProtect" :"Ochrona PIN", + "kPlaceHolderBasicAuthPass" :"hasło prostego uwierzytelniania", + "kPlaceHolderBasicAuthUser" :"użytkownik zwykłego uwierzytelniania", + "kPlaceHolderZMAuthPass" :"hasło uwierzytelniania ZM", + "kPlaceHolderZMAuthUser" :"użytkownik uwierzytelniania ZM", + "kPlaybackInterval" :"Interwał Odtwarzania", + "kPleaseCheckCredentials" :"Sprawdź dane logowania", + "kPleaseConfirm" :"Proszę Potwierdzić", + "kPleaseSave" :"Proszę Zapisać", + "kPleaseTryAgain" :"spróbuj jeszcze raz", + "kPleaseWait" :"proszę czekać", + "kPortal" :"Portal", + "kPortalAPIFailed" :"Błąd wykrywania API", + "kPortalCgiBinFailed" :"Błąd wykrywania ścieżki cgi-bin", + "kPortalDetectionFailed" :"Portal: błąd wykrywania", + "kPortalEmpty" :"Ścieżka Portalu url nie może być pusta", + "kPortalInvalidUrl" :"URL wygląda niewłaściwie (nie wykryto protokołu)", + "kPortalLoginUnsuccessful" :"Logowanie do Portalu nieudane. Wróć i sprawdź swoje ustawienia", + "kPortalNoMonitorFound" :"Nie znaleziono skonfigurowanego/włączonego Monitora", + "kPortalNoProto" :"Nie ustalono protokołu", + "kPortalNotice" :"Jeśli ten ekran po chwili nie zniknie, to możliwe, że Twoje APIs nie jest skonfigurowane prawidłowo", + "kPortalNoticeSub" :"(Przesuń w prawo by wejść do menu)", + "kPortalPleaseSelect" :"Proszę wybrać", + "kPortalUrl" :"ZM portal url", + "kPresets" :"ustawienia", + "kPrev" :"Poprz", + "kPrevEvent" :"poprz.zdarz.", + "kPrevMonitor" :"poprz.monitor", + "kProfileChangeNotification" :"Zmieniłeś z {{oldName}} na {{newName}}. Zapisz wcześniej ten profil.", + "kProtect" :"zabezpiecz", + "kPullToReload" :"przeciągnij by przeładować dane", + "kReAuthenticating" :"ponowne uwierzytelnianie", + "kReachability" :"Włącz Osiągalność", + "kRecaptcha" :"Wygląda na to, że właczyłeś reCaptcha. Powinna być wyłączona, żeby aplikacja działała.", + "kReconfirmPin" :"Potwierdź PIN", + "kRecordingProgress" :"trwa nagrywanie", + "kRefresh" :"odśwież", + "kRefreshedView" :"odśwież podgl.", + "kReportEvents" :"raportuj zdarzenie", + "kReportedVersion" :"Zgłoszona Wersja", + "kReset" :"Reset", + "kResolution" :"Rozdzielczość", + "kRestart" :"Restart", + "kResumeDelay" :"opóźnienie wznowienia", + "kSave" :"Zapisz", + "kSavingSnapshot" :"zapisuję obraz", + "kScore" :"punkty", + "kScrub" :"Scrub", + "kSearch" :"szukaj", + "kSearchCancelled" :"szukaj anulowane", + "kSec" :"sek", + "kSelectFallback" :"Wybierz alternatywę", + "kSelectLanguage" :"Wybierz język", + "kSelectRunState" :"Wybierz działający stan", + "kSendingPTZ" :"Wysyła PTZ", + "kSensitiveBody" :"Tworząc finalny log zmodyfikuję dane, aby usunąć wrażliwe dane jak linki czy hasła. Jednak upewnienie się, że dane zostały usunięte, to Twoja odpowiedzialność. Upewnij się, że przeglądnąłeś i edytowałeś log przed jego wysłaniem", + "kSensitiveTitle" :"Dane Wrażliwe", + "kServerAdd" :"Dodaj", + "kServerEmptyError" :"Nazwa serwera nie może być pusta", + "kServerName" :"Nazwa serwera", + "kServerTimeZone" :"serwer TZ", + "kSettings" :"Ustawienia", + "kSettingsSaved" :"Ustawienia Zapisane", + "kShowAlarmedEvents" :"Pokaż zaalarmowane Zdarzenia", + "kShowAllEvents" :"Pokaż wszystkie Zdarzenia", + "kShowAllFrames" :"wszystko", + "kShowTimeDiffFrames" :"unikatowe czasy", + "kShowTip" :"pokaż podpowiedź", + "kShowing" :"Pokazywanie", + "kShowingEvent" :"pokazywanie zdarzenia", + "kSleep" :"Uśpij", + "kSoundOnPush" :"Dźwięk przycisku", + "kSpeed" :"prędkość", + "kStart" :"Start", + "kStateAreYouSure" :"Jesteś pewien, że chcesz ", + "kStateHideControls" :"Ukryj Przyciski ZoneMinder", + "kStateShowControls" :"Pokaż Przyciski ZoneMinder", + "kStatus" :"Stan", + "kStop" :"Stop", + "kSuccess" :"Sukces", + "kSwipeToChangeMon" :"Przesuń, by zmienić Monitory", + "kSwitchingEvents" :"przełączam zdarzenia", + "kSystemStatus" :"Stan Systemu", + "kTapEvents" :"Zdarzenia", + "kTapLiveMonitor" :"Podgląd na żywo", + "kTapMontage" :"Podgląd", + "kThanksForUsing" :"Dziękuję za używanie", + "kTime" :"czas", + "kTimeZoneNotSupported" :"twoje API tego nie obsługuje", + "kTimeline" :"Oś czasu", + "kTimelineControlDisplay" :"stuknięcie:podgl.zdarzenia, podw.stuknięcie:podgl.wykresu klatek", + "kTimelineMessage" :"podw. stuknięcie - wyjście. dotknięcie i przesuwanie elementów pozwala przeglądać klatki", + "kTimelineOnlyDisplaying1" :"wyświetla tylko {{maxItemsVal}} ostatnich zdarzeń", + "kTitleNotLoggedIn" :"Nie zalogowany", + "kTitleNotLoggedInBody" :"Nie wygląda jakbyś był zalogowany. Żeby wykrywanie działało, musisz wypełnić dane logowania, portal URL i wcisnąć ZAPISZ. Wtedy możesz tu wrócić.", + "kTitlePortalNotConfigured" :"Portal nie skonfigurowany", + "kTo" :"do", + "kToDate" :"Do Daty", + "kToTime" :"Do Czasu", + "kToastSearchingPage" :"szuka strony ", + "kTrying" :"próbuję", + "kType" :"typ", + "kUnknown" :"(nieznany)", + "kUpdateTimeline" :"aktualizacja dynamiczna", + "kUseEventServer" :"Użyj serwera Zdarzeń", + "kUseSSL" :"Użyj SSL", + "kUseVideoControls" :"Użyj przełączników wideo odtwarzacza dla Zdarzeń H264. ZoneMinder jeszcze nie wspiera przełączników zms", + "kUseZmAuth" :"użyj uwierzytelniania ZM", + "kUserName" :"nazwa użytkownika", + "kValidNameBasicAuth" :"Wprowadź włąściwego użytkownika i hasło dla prostego uwierzytelniania", + "kValidNameZMAuth" :"Wprowadź włąściwego użytkownika i hasło dla uwierzytelniania ZM", + "kVersion" :"Wersja", + "kVersionIncompatible" :"Jestem niekompatybilny z wersją Twojego ZoneMinder'a", + "kVibrateOnPush" :"Wibruj przy dotknięciu", + "kVideo" :"Wideo", + "kVideoError" : "Wideo nie odtwarzalne.", + "kVideoErrorMobile" : "Wideo nie odtwarzalne. Spróbuj włączyć 'wymuś ścieżkę obrazu dla zdarzenia' w Ustawieniach Zaawansowanych. Format może być też niekompatybilny z przeglądarką systemu mobilnego", + "kWake" :"Wybudź", + "kWarningLargeTimeline" :"Wysoka wartość może wpłynąć na prędkość osi czasu. Jeśli oś czasu będzie zbyt wolna, spróbuj zredukować wartość do 200 i powoli zwiększaj do pożądanego efektu.", + "kWeek" :"Tydzień", + "kWelcomeWizard" :"Witamy w Kreatorze", + "kWizAuthText1" :"Skołowany? Uwierzytelnianie ZM, to uwierzytelnianie używane kiedy włączysz OPT_USE_AUTH w oknie opcji konsoli ZM.", + "kWizAuthText2" :"Uwierzytelnianie prostego używamy wtedy, kiedy skonfigurujesz użytkownika i hasło w przeglądarce internetowej. Jeśli używasz uwierzytelniania LDAP, wtedy raczej jest to uwierzytelnianie proste.", + "kWizBasicAuth" :"Używam uwierzytelniania prostego", + "kWizConfigPain" :"Konfiguracja ZoneMinder'a może być bolesnym przeżyciem. Sprawdźmy czy zmWizard pomoże.", + "kWizGotoLogin" :"Idź do ekranu logowania", + "kWizNextStep1" :"Gdy auto-detekcja zostanie zakończona, można albo", + "kWizNextStep2" :"Wróć do poprzednich kroków i popraw", + "kWizNextStep3" :"Idź do ekranu logowania z tymi automatycznie wprowadzonymi wartościami", + "kWizPasswdNote" :"uwaga: jeśli Twoje hasło ma znaki specjalne, takie jak #?@ czy ampersand, kreator może nie wykryć cgi. Najlepiej tymczasowo zmień hasło na jakieś proste, przejdź kreatora, a następnie przywróć swoje poprzednie hasło", + "kWizPortalAuth" :"Uwierzytelnianie portalu", + "kWizPortalText" :"Pomówmy o tym jak skonfigurowałeś uwierzytelnianie. Jeśli włączyłeś uwierzytelnianie, przełącz ten przycisk", + "kWizPortalTip" :"Skołowany? Możesz łatwo znaleźć adres URL portalu notując adres, który widzisz w swojej przeglądarce gdy używasz Konsoli ZoneMinder.", + "kWizPortalUrl" :"Jaki jest adres portalu Zoneminder?", + "kWizResults" :"Rezultat autodetekcji", + "kWizTip" :"Podpowiedź", + "kWizUseAuth" :"Używam uwierzytelniania", + "kWizZMAuth" :"Używam uwierzytelniania ZM", + "kWizard" :"Kreator", + "kWorkingOnGraph" :"Pracuję na danych graficznych", + "kZMRunning" :"pracuję", + "kZMSettingsFor" :"Ustawienia ZoneMinder dla", + "kZMStopped" :"zatrzymane", + "kZMUndetermined" :"nieokreślone", + "kZMUpgradeNeeded" :"Potrzebna aktualizacja ZoneMinder'a" +} diff --git a/www/templates/timeline.html b/www/templates/timeline.html index ab9d8030..d2ada69d 100644 --- a/www/templates/timeline.html +++ b/www/templates/timeline.html @@ -37,6 +37,9 @@ <button ng-click="toggleFollowTime()" ng-class="follow.time? 'button button-small button-balanced':'button button-small button-assertive'"> {{'kUpdateTimeline' | translate}}: {{follow.time}} </button> + <button ng-click="gotoNow()" class="button button-small button-balanced"> + {{'kNow' | translate}} + </button> <div ng-if="follow.time"> <p>{{newEvents}}</p> </div> |
