timekpr-next/000775 001750 001750 00000000000 14064575714 015212 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/bin/000775 001750 001750 00000000000 13716566163 015763 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/bin/timekprc000775 001750 001750 00000000115 13716566163 017524 0ustar00bezvfedubezvfedu000000 000000 #!/usr/bin/python3 /usr/lib/python3/dist-packages/timekpr/client/timekprc.py timekpr-next/bin/timekprd000775 001750 001750 00000000115 13716566163 017525 0ustar00bezvfedubezvfedu000000 000000 #!/usr/bin/python3 /usr/lib/python3/dist-packages/timekpr/server/timekprd.py timekpr-next/bin/timekpra000775 001750 001750 00000000115 13716566163 017522 0ustar00bezvfedubezvfedu000000 000000 #!/usr/bin/python3 /usr/lib/python3/dist-packages/timekpr/client/timekpra.py timekpr-next/server/000775 001750 001750 00000000000 14017261747 016514 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/config/000775 001750 001750 00000000000 14064575714 017765 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/config/configprocessor.py000664 001750 001750 00000204356 14064575714 023556 0ustar00bezvfedubezvfedu000000 000000 """ Created on Jan 17, 2019 @author: mjasnik """ # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.utils.config import timekprUserConfig from timekpr.common.utils.config import timekprUserControl from timekpr.common.utils.config import timekprConfig from timekpr.common.constants import messages as msg # imports from datetime import datetime import dbus class timekprUserConfigurationProcessor(object): """Validate and update configuration data for timekpr user""" def __init__(self, pUserName, pTimekprConfig): """Initialize all stuff for user""" # set up initial variables self._configDir = pTimekprConfig.getTimekprConfigDir() self._workDir = pTimekprConfig.getTimekprWorkDir() self._userName = pUserName self._timekprUserConfig = None self._timekprUserControl = None def loadAndCheckUserConfiguration(self): """Load the user configuration (to verify whether user config exists and is readable)""" # result result = 0 message = "" # user config self._timekprUserConfig = timekprUserConfig(self._configDir, self._userName) # result if not self._timekprUserConfig.loadConfiguration(True): # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_USERCONFIG_NOTFOUND") % (self._userName) # result return result, message def loadAndCheckUserControl(self): """Load the user control saved state (to verify whether user control exists and is readable)""" # result result = 0 message = "" # user config self._timekprUserControl = timekprUserControl(self._workDir, self._userName) # result if not self._timekprUserControl.loadControl(True): # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_USERCONTROL_NOTFOUND") % (self._userName) # result return result, message def calculateAdjustedDatesForUserControl(self, pCheckDate): """Calculate and save proper dates in control file, in case they wastly differ from what as saved""" # control date components changed dayChanged, weekChanged, monthChanged = self._timekprUserControl.getUserDateComponentChanges(pCheckDate) # set defaults in case day changed if dayChanged: # balance and day must be changed self._timekprUserControl.setUserTimeSpentDay(0) self._timekprUserControl.setUserTimeSpentBalance(0) # set defaults in case week changed if weekChanged: # balance and day must be changed self._timekprUserControl.setUserTimeSpentWeek(0) # set defaults in case month changed if monthChanged: # balance and day must be changed self._timekprUserControl.setUserTimeSpentMonth(0) # save user control file if dates changed if dayChanged or weekChanged or monthChanged: # last check date self._timekprUserControl.setUserLastChecked(pCheckDate) # save self._timekprUserControl.saveControl() def calculateTimeAvailableFromSavedConfiguration(self): """Calculate available time for today from saved config""" # current day currDay = str(datetime.now().isoweekday()) # get available hours for today allowedHours = self._timekprUserConfig.getUserAllowedHours(currDay) # allowed week days allowedWeekDays = self._timekprUserConfig.getUserAllowedWeekdays() # limits per week days allowedWeekDayLimits = self._timekprUserConfig.getUserLimitsPerWeekdays() # time now dtn = datetime.now().replace(microsecond=0) #### normalize days # get max of days / limits limitLen = min(len(allowedWeekDays), len(allowedWeekDayLimits)) # remove excess elements for i in range(limitLen, len(allowedWeekDays)): allowedWeekDays.pop() # remove excess elements for i in range(limitLen, len(allowedWeekDayLimits)): allowedWeekDayLimits.pop() # calc availableSeconds = 0 availableSecondsAlt = 0 # count available seconds for intervals starting this hour for rHour in range(dtn.hour, 24): # calc from now if str(rHour) in allowedHours: # for current hour we have to take care of time in progress at the moment if rHour == dtn.hour: availableSeconds += max((max(allowedHours[str(rHour)][cons.TK_CTRL_EMIN], dtn.minute) - max(allowedHours[str(rHour)][cons.TK_CTRL_SMIN], dtn.minute)) * 60 - dtn.second, 0) # for the rest of hours, current secs and mins are not important else: availableSeconds += ((allowedHours[str(rHour)][cons.TK_CTRL_EMIN] - allowedHours[str(rHour)][cons.TK_CTRL_SMIN]) * 60) # calculate available seconds from todays limit if currDay in allowedWeekDays: availableSecondsAlt = allowedWeekDayLimits[allowedWeekDays.index(currDay)] # calculate how much is actually left (from intervals left, time spent and available as well as max that's possible to have) availableSeconds = max(min(min(availableSeconds, availableSecondsAlt - self._timekprUserControl.getUserTimeSpentBalance()), cons.TK_LIMIT_PER_DAY), 0) # available seconds return availableSeconds def calculatePlayTimeAvailableFromSavedConfiguration(self): """Calculate available PlayTime for today from saved config""" # current day currDay = str(datetime.now().isoweekday()) # calc availableSeconds = None # allowed week days allowedWeekDays = self._timekprUserConfig.getUserPlayTimeAllowedWeekdays() # only if we have PlayTime information if allowedWeekDays is not None: # calc availableSeconds = 0 # limits per week days allowedWeekDayLimits = self._timekprUserConfig.getUserPlayTimeLimitsPerWeekdays() #### normalize days # get max of days / limits limitLen = min(len(allowedWeekDays), len(allowedWeekDayLimits)) # remove excess elements for i in range(limitLen, len(allowedWeekDays)): allowedWeekDays.pop() # remove excess elements for i in range(limitLen, len(allowedWeekDayLimits)): allowedWeekDayLimits.pop() # calculate available seconds from todays limit if currDay in allowedWeekDays: availableSeconds = allowedWeekDayLimits[allowedWeekDays.index(currDay)] # calculate how much is actually left (from intervals left, time spent and avilable as well as max that's possible to have) availableSeconds = max(min(availableSeconds - self._timekprUserControl.getUserPlayTimeSpentBalance(), cons.TK_LIMIT_PER_DAY), 0) # available seconds return availableSeconds def getSavedUserInformation(self, pInfoLvl, pIsUserLoggedIn): """Get saved user configuration""" """This operates on saved user configuration, it will return all config as big dict""" # defaults result = 0 message = "" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # initialize username storage userConfigurationStore = {} # if we are still fine if result != 0: # result pass # for full and saved info only else: # check if we have this user result, message = self.loadAndCheckUserControl() # if we are still fine if result != 0: # result pass else: # this goes for full information if pInfoLvl == cons.TK_CL_INF_FULL: # allowed hours per weekdays param = "ALLOWED_HOURS" for rDay in cons.TK_ALLOWED_WEEKDAYS.split(";"): # if there is a day if rDay != "": # fill up hours allowedHours = self._timekprUserConfig.getUserAllowedHours(rDay) userConfigurationStore["%s_%s" % (param, rDay)] = allowedHours if len(allowedHours) > 0 else dbus.Dictionary(signature="sv") # allowed week days allowedWeekDays = self._timekprUserConfig.getUserAllowedWeekdays() userConfigurationStore["ALLOWED_WEEKDAYS"] = list(map(dbus.String, allowedWeekDays)) if len(allowedWeekDays) > 0 else dbus.Array(signature="s") # limits per week days allowedWeekDayLimits = self._timekprUserConfig.getUserLimitsPerWeekdays() userConfigurationStore["LIMITS_PER_WEEKDAYS"] = list(map(dbus.Int32, allowedWeekDayLimits)) if len(allowedWeekDayLimits) > 0 else dbus.Array(signature="i") # track inactive userConfigurationStore["TRACK_INACTIVE"] = self._timekprUserConfig.getUserTrackInactive() # hide icon userConfigurationStore["HIDE_TRAY_ICON"] = self._timekprUserConfig.getUserHideTrayIcon() # restriction / lockout type userConfigurationStore["LOCKOUT_TYPE"] = self._timekprUserConfig.getUserLockoutType() # add wake up intervals if type is wake if userConfigurationStore["LOCKOUT_TYPE"] == cons.TK_CTRL_RES_W: # wake up intervals userConfigurationStore["WAKEUP_HOUR_INTERVAL"] = ";".join(self._timekprUserConfig.getUserWakeupHourInterval()) # limit per week userConfigurationStore["LIMIT_PER_WEEK"] = self._timekprUserConfig.getUserWeekLimit() # limit per month userConfigurationStore["LIMIT_PER_MONTH"] = self._timekprUserConfig.getUserMonthLimit() # ## PlayTime config (if enabled) ## userConfigurationStore["PLAYTIME_ENABLED"] = self._timekprUserConfig.getUserPlayTimeEnabled() # PlayTime override enabled userConfigurationStore["PLAYTIME_LIMIT_OVERRIDE_ENABLED"] = self._timekprUserConfig.getUserPlayTimeOverrideEnabled() # PlayTime allowed during unaccounted intervals userConfigurationStore["PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED"] = self._timekprUserConfig.getUserPlayTimeUnaccountedIntervalsEnabled() # PlayTime allowed week days allowedWeekDays = self._timekprUserConfig.getUserPlayTimeAllowedWeekdays() userConfigurationStore["PLAYTIME_ALLOWED_WEEKDAYS"] = list(map(dbus.String, allowedWeekDays)) if len(allowedWeekDays) > 0 else dbus.Array(signature="s") # PlayTime limits per week days allowedWeekDayLimits = self._timekprUserConfig.getUserPlayTimeLimitsPerWeekdays() userConfigurationStore["PLAYTIME_LIMITS_PER_WEEKDAYS"] = list(map(dbus.Int32, allowedWeekDayLimits)) if len(allowedWeekDayLimits) > 0 else dbus.Array(signature="i") # PlayTime activities playTimeActivities = self._timekprUserConfig.getUserPlayTimeActivities() userConfigurationStore["PLAYTIME_ACTIVITIES"] = playTimeActivities if len(playTimeActivities) > 0 else dbus.Array(signature="aas") # this goes for full and saved info if pInfoLvl in (cons.TK_CL_INF_FULL, cons.TK_CL_INF_SAVED): # before return results, we need to check whether user was active and dates did not change since then # this makes sense only of user is NOT currently logged in if not pIsUserLoggedIn: # calculate self.calculateAdjustedDatesForUserControl(datetime.now().replace(microsecond=0)) # get saved values # time spent userConfigurationStore["TIME_SPENT_BALANCE"] = self._timekprUserControl.getUserTimeSpentBalance() # time spent userConfigurationStore["TIME_SPENT_DAY"] = self._timekprUserControl.getUserTimeSpentDay() # time spent userConfigurationStore["TIME_SPENT_WEEK"] = self._timekprUserControl.getUserTimeSpentWeek() # time spent userConfigurationStore["TIME_SPENT_MONTH"] = self._timekprUserControl.getUserTimeSpentMonth() # time available today userConfigurationStore["TIME_LEFT_DAY"] = self.calculateTimeAvailableFromSavedConfiguration() # PlayTime left userConfigurationStore["PLAYTIME_LEFT_DAY"] = self.calculatePlayTimeAvailableFromSavedConfiguration() # PlayTime spent userConfigurationStore["PLAYTIME_SPENT_DAY"] = self._timekprUserControl.getUserPlayTimeSpentDay() # result return result, message, userConfigurationStore def checkAndSetAllowedDays(self, pDayList): """Validate and set up allowed days for the user""" """Validate allowed days for the user server expects only the days that are allowed, sorted in ascending order""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pDayList is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_DAYLIST_NONE") % (self._userName) else: # days days = [] # parse config try: for rDay in pDayList: # empty if str(rDay) != "": # try to convert day tmp = int(rDay) # only if day is in proper interval if rDay not in cons.TK_ALLOWED_WEEKDAYS: tmp = 1/0 else: days.append(tmp) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_DAYLIST_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserAllowedWeekdays(days) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_DAYLIST_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetAllowedHours(self, pDayNumber, pHourList): """Validate set up allowed hours for the user""" """Validate allowed hours for user for particular day server expects only the hours that are needed, hours must be sorted in ascending order please note that this is using 24h format, no AM/PM nonsense expected minutes can be specified in brackets after hour, like: 16[00-45], which means until 16:45""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # pre-check day number isDayNumberValid = False # pre-check day number if pDayNumber is not None: # check for i in range(1, 7+1): if pDayNumber == str(i): isDayNumberValid = True break # if we are still fine if result != 0: # result pass # if we have no days elif pDayNumber is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_ALLOWEDHOURS_DAY_NONE") % (self._userName) # if days are crazy elif pDayNumber != "ALL" and not isDayNumberValid: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_ALLOWEDHOURS_DAY_INVALID") % (self._userName) else: # parse config try: # check the days if pDayNumber != "ALL": dayNumbers = [] dayNumber = str(pDayNumber) else: dayNumbers = ["2", "3", "4", "5", "6", "7"] dayNumber = "1" # create dict of specific day (maybe I'll support more days in a row at some point, though, I think it's a burden to users who'll use CLI) dayLimits = {dayNumber: {}} # minutes can be specified in brackets after hour for rHour in list(map(str, pHourList)): # reset minuten minutesStart = pHourList[rHour][cons.TK_CTRL_SMIN] minutesEnd = pHourList[rHour][cons.TK_CTRL_EMIN] hourUnaccounted = pHourList[rHour][cons.TK_CTRL_UACC] # get our dict done dayLimits[dayNumber][rHour] = {cons.TK_CTRL_SMIN: minutesStart, cons.TK_CTRL_EMIN: minutesEnd, cons.TK_CTRL_UACC: hourUnaccounted} # fill all days (if needed) for rDay in dayNumbers: dayLimits[rDay] = dayLimits[dayNumber] # set up config # check and parse is happening in set procedure down there, so that's a validation and set in one call self._timekprUserConfig.setUserAllowedHours(dayLimits) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_ALLOWEDHOURS_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetTimeLimitForDays(self, pDayLimits): """Validate and set up new timelimits for each day for the user""" """Validate allowable time to user server always expects 7 limits, for each day of the week, in the list""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pDayLimits is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_DAILYLIMITS_NONE") % (self._userName) else: # limits limits = [] # parse config try: for rLimit in pDayLimits: # empty if str(rLimit) != "": # try to convert seconds in day and normalize seconds in proper interval limits.append(max(min(int(rLimit), cons.TK_LIMIT_PER_DAY), 0)) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_DAILYLIMITS_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserLimitsPerWeekdays(limits) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_DAILYLIMITS_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetTrackInactive(self, pTrackInactive): """Validate and set track inactive sessions for the user""" """Validate whether inactive user sessions are tracked true - logged in user is always tracked (even if switched to console or locked or ...) false - user time is not tracked if he locks the session, session is switched to another user, etc.""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pTrackInactive is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_TRACKINACTIVE_NONE") % (self._userName) else: # parse config try: if bool(pTrackInactive): pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_TRACKINACTIVE_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserTrackInactive(pTrackInactive) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_TRACKINACTIVE_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetHideTrayIcon(self, pHideTrayIcon): """Validate and set hide tray icon for the user""" """Validate whether icon will be hidden from user true - icon and notifications are NOT shown to user false - icon and notifications are shown to user""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pHideTrayIcon is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_HIDETRAYICON_NONE") % (self._userName) else: # parse config try: if bool(pHideTrayIcon): pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_HIDETRAYICON_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserHideTrayIcon(pHideTrayIcon) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_HIDETRAYICON_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetLockoutType(self, pLockoutType, pWakeFrom=None, pWakeTo=None): """Validate and set restriction / lockout type for the user""" """Validate the restricton / lockout type: lock - lock the screen suspend - suspend the computer suspendwake - suspend the computer terminate - terminate sessions (default) shutdown - shutdown computer""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pLockoutType is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_LOCKOUTTYPE_NONE") % (self._userName) # parse config elif pLockoutType not in (cons.TK_CTRL_RES_L, cons.TK_CTRL_RES_S, cons.TK_CTRL_RES_W, cons.TK_CTRL_RES_T, cons.TK_CTRL_RES_D) or not (pWakeFrom.isnumeric() if pWakeFrom is not None else True) or not (pWakeTo.isnumeric() if pWakeTo is not None else True): # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_LOCKOUTTYPE_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserLockoutType(pLockoutType) if pWakeFrom is not None and pWakeTo is not None: self._timekprUserConfig.setUserWakeupHourInterval([pWakeFrom, pWakeTo]) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_LOCKOUTTYPE_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetTimeLimitForWeek(self, pTimeLimitWeek): """Validate and set up new timelimit for week for the user""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pTimeLimitWeek is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_WEEKLYALLOWANCE_NONE") % (self._userName) else: # parse config try: # verification weekLimit = max(min(int(pTimeLimitWeek), cons.TK_LIMIT_PER_WEEK), 0) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_WEEKLYALLOWANCE_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserWeekLimit(weekLimit) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_WEEKLYALLOWANCE_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetTimeLimitForMonth(self, pTimeLimitMonth): """Validate and set up new timelimit for month for the user""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pTimeLimitMonth is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_MONTHLYALLOWANCE_NONE") % (self._userName) else: # parse config try: # verification monthLimit = max(min(int(pTimeLimitMonth), cons.TK_LIMIT_PER_MONTH), 0) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_MONTHLYALLOWANCE_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserMonthLimit(monthLimit) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_MONTHLYALLOWANCE_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetTimeLeft(self, pOperation, pTimeLeft): """Validate and set time left for today for the user""" """Validate time limits for user for this moment: if pOperation is "+" - more time left is addeed if pOperation is "-" time is subtracted if pOperation is "=" or empty, the time is set as it is""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result == 0: # check if we have this user result, message = self.loadAndCheckUserControl() # if we are still fine if result != 0: # result pass # if we have no days elif pOperation not in ("+", "-", "="): # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_TIMELIMIT_OPERATION_INVALID") % (self._userName) else: # parse config try: if int(pTimeLeft) > 0: pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_TIMELIMIT_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # defaults setLimit = 0 try: # get actual time limit for this day timeLimit = self._timekprUserConfig.getUserLimitsPerWeekdays()[datetime.date(datetime.now()).isoweekday()-1] # decode time left (operations are actually technicall reversed, + for ppl is please add more time and minus is subtract, # but actually it's reverse, because we are dealing with time spent not time left) if pOperation == "+": setLimit = min(max(min(self._timekprUserControl.getUserTimeSpentBalance(), timeLimit) - pTimeLeft, -cons.TK_LIMIT_PER_DAY), cons.TK_LIMIT_PER_DAY) elif pOperation == "-": setLimit = min(max(min(self._timekprUserControl.getUserTimeSpentBalance(), timeLimit) + pTimeLeft, -cons.TK_LIMIT_PER_DAY), cons.TK_LIMIT_PER_DAY) elif pOperation == "=": setLimit = min(max(timeLimit - pTimeLeft, -cons.TK_LIMIT_PER_DAY), cons.TK_LIMIT_PER_DAY) # set up config for day self._timekprUserControl.setUserTimeSpentBalance(setLimit) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_TIMELIMIT_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserControl.saveControl() # result return result, message # ## PlayTime methods ## def checkAndSetPlayTimeEnabled(self, pPlayTimeEnabled): """Validate and set whether PlayTime is available for the user""" """Validate whether PlayTime is available true - PlayTime enabled for the user false - PlayTime disabled for the user""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pPlayTimeEnabled is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_ENABLE_FLAG_NONE") % (self._userName) else: # parse config try: if bool(pPlayTimeEnabled): pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_ENABLE_FLAG_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserPlayTimeEnabled(pPlayTimeEnabled) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_ENABLE_FLAG_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetPlayTimeLimitOverride(self, pPlayTimeLimitOverride): """Validate and set whether PlayTime override is available for the user""" """Validate whether PlayTime override is available true - PlayTime override enabled for the user false - PlayTime override disabled for the user""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pPlayTimeLimitOverride is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_OVERRIDE_FLAG_NONE") % (self._userName) else: # parse config try: if bool(pPlayTimeLimitOverride): pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_OVERRIDE_FLAG_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserPlayTimeOverrideEnabled(pPlayTimeLimitOverride) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_OVERRIDE_FLAG_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetPlayTimeUnaccountedIntervalsEnabled(self, pPlayTimeUnaccountedIntervalsEnabled): """Validate and set whether PlayTime is allowed during unaccounted intervals for the user""" """Validate whether PlayTime allowed during unaccounted intervals true - PlayTime allowed during unaccounted intervals enabled for the user false - PlayTime allowed during unaccounted intervals disabled for the user""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pPlayTimeUnaccountedIntervalsEnabled is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_UNACC_INT_FLAG_NONE") % (self._userName) else: # parse config try: if bool(pPlayTimeUnaccountedIntervalsEnabled): pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_UNACC_INT_FLAG_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserPlayTimeUnaccountedIntervalsEnabled(pPlayTimeUnaccountedIntervalsEnabled) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_UNACC_INT_FLAG_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetPlayTimeAllowedDays(self, pPlayTimeAllowedDays): """Validate and set up allowed PlayTime days for the user""" """Validate allowed PlayTime days for the user server expects only the days that are allowed, sorted in ascending order""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pPlayTimeAllowedDays is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_DAYLIST_NONE") % (self._userName) else: # days days = [] # parse config try: for rDay in pPlayTimeAllowedDays: # empty if str(rDay) != "": # try to convert day tmp = int(rDay) # only if day is in proper interval if rDay not in cons.TK_ALLOWED_WEEKDAYS: tmp = 1/0 else: days.append(tmp) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_DAYLIST_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserPlayTimeAllowedWeekdays(days) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_DAYLIST_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetPlayTimeLimitsForDays(self, pPlayTimeLimits): """Validate and set up new PlayTime limits for each day for the user""" """Validate allowable PlayTime for the user server always expects 7 limits, for each day of the week, in the list""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pPlayTimeLimits is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_DAYLIMITS_NONE") % (self._userName) else: # limits limits = [] # parse config try: for rLimit in pPlayTimeLimits: # empty if str(rLimit) != "": # try to convert seconds in day and normalize seconds in proper interval limits.append(max(min(int(rLimit), cons.TK_LIMIT_PER_DAY), 0)) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_DAYLIMITS_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserPlayTimeLimitsPerWeekdays(limits) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_DAYLIMITS_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetPlayTimeActivities(self, pPlayTimeActivities): """Validate and set up allowed PlayTime activities for the user""" """Validate allowed PlayTime activities for the user server expects array of array of masks/descriptions""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result != 0: # result pass # if we have no days elif pPlayTimeActivities is None: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_ACTIVITIES_NONE") % (self._userName) else: # days activities = [] # parse config try: for rAct in pPlayTimeActivities: # set up act act = (rAct[0], rAct[1]) # add to list activities.append(act) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_ACTIVITIES_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprUserConfig.setUserPlayTimeAcitivityList(activities) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_ACTIVITIES_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserConfig.saveUserConfiguration() # result return result, message def checkAndSetPlayTimeLeft(self, pOperation, pTimeLeft): """Validate and set time left for today for the user""" """Validate time limits for user for this moment: if pOperation is "+" - more time left is addeed if pOperation is "-" time is subtracted if pOperation is "=" or empty, the time is set as it is""" # check if we have this user result, message = self.loadAndCheckUserConfiguration() # if we are still fine if result == 0: # check if we have this user result, message = self.loadAndCheckUserControl() # if we are still fine if result != 0: # result pass # if we have no days elif pOperation not in ("+", "-", "="): # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_TIMELIMIT_OPERATION_INVALID") % (self._userName) else: # parse config try: if int(pTimeLeft) > 0: pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_TIMELIMIT_INVALID") % (self._userName) # if all is correct, we update the configuration if result == 0: # defaults setLimit = 0 try: # get actual time limit for this day playTimeLimit = self._timekprUserConfig.getUserPlayTimeLimitsPerWeekdays()[datetime.date(datetime.now()).isoweekday()-1] # decode time left (operations are actually technicall reversed, + for ppl is please add more time and minus is subtract, # but actually it's reverse, because we are dealing with time spent not time left) if pOperation == "+": setLimit = min(max(min(self._timekprUserControl.getUserPlayTimeSpentBalance(), playTimeLimit) - pTimeLeft, -cons.TK_LIMIT_PER_DAY), cons.TK_LIMIT_PER_DAY) elif pOperation == "-": setLimit = min(max(min(self._timekprUserControl.getUserPlayTimeSpentBalance(), playTimeLimit) + pTimeLeft, -cons.TK_LIMIT_PER_DAY), cons.TK_LIMIT_PER_DAY) elif pOperation == "=": setLimit = min(max(playTimeLimit - pTimeLeft, -cons.TK_LIMIT_PER_DAY), cons.TK_LIMIT_PER_DAY) # set up config for day self._timekprUserControl.setUserPlayTimeSpentBalance(setLimit) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_USER_ADMIN_CHK_PT_TIMELIMIT_INVALID_SET") % (self._userName) # if we are still fine if result == 0: # save config self._timekprUserControl.saveControl() # result return result, message class timekprConfigurationProcessor(object): """Validate and update configuration data for timekpr server""" def __init__(self): """Initialize all stuff for user""" # configuration init self._timekprConfig = timekprConfig() def loadTimekprConfiguration(self): """Load timekpr config""" # configuration load self._configLoaded = self._timekprConfig.loadMainConfiguration() # if fail if not self._configLoaded: result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_ERROR_GENERIC") else: result = 0 message = "" # result return result, message def getSavedTimekprConfiguration(self): """Get saved user configuration""" """This operates on saved user configuration, it will return all config as big dict""" # initialize username storage timekprConfigurationStore = {} # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass else: # ## load config ## # log level timekprConfigurationStore["TIMEKPR_LOGLEVEL"] = self._timekprConfig.getTimekprLogLevel() # poll time timekprConfigurationStore["TIMEKPR_POLLTIME"] = self._timekprConfig.getTimekprPollTime() # save time timekprConfigurationStore["TIMEKPR_SAVE_TIME"] = self._timekprConfig.getTimekprSaveTime() # termination time timekprConfigurationStore["TIMEKPR_TERMINATION_TIME"] = self._timekprConfig.getTimekprTerminationTime() # final warning time timekprConfigurationStore["TIMEKPR_FINAL_WARNING_TIME"] = self._timekprConfig.getTimekprFinalWarningTime() # final notification time timekprConfigurationStore["TIMEKPR_FINAL_NOTIFICATION_TIME"] = self._timekprConfig.getTimekprFinalNotificationTime() # sessions to track timekprConfigurationStore["TIMEKPR_SESSION_TYPES_CTRL"] = self._timekprConfig.getTimekprSessionsCtrl() # sessions to exclude timekprConfigurationStore["TIMEKPR_SESSION_TYPES_EXCL"] = self._timekprConfig.getTimekprSessionsExcl() # users to exclude timekprConfigurationStore["TIMEKPR_USERS_EXCL"] = self._timekprConfig.getTimekprUsersExcl() # PlayTime enabled timekprConfigurationStore["TIMEKPR_PLAYTIME_ENABLED"] = self._timekprConfig.getTimekprPlayTimeEnabled() # PlayTime enhanced activity monitor enabled timekprConfigurationStore["TIMEKPR_PLAYTIME_ENHANCED_ACTIVITY_MONITOR_ENABLED"] = self._timekprConfig.getTimekprPlayTimeEnhancedActivityMonitorEnabled() # result return result, message, timekprConfigurationStore def checkAndSetTimekprLogLevel(self, pLogLevel): """Validate and set log level""" """ In case we have something to validate, we'll do it here""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pLogLevel is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_LOGLEVEL_NONE") else: # parse try: # try to convert if int(pLogLevel) > 0: pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_LOGLEVEL_INVALID") % (str(pLogLevel)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprLogLevel(pLogLevel) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_LOGLEVEL_INVALID_SET") % (str(pLogLevel)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprPollTime(self, pPollTimeSecs): """Validate and Set polltime for timekpr""" """ set in-memory polling time (this is the accounting precision of the time""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pPollTimeSecs is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_POLLTIME_NONE") else: # parse try: # try to convert if int(pPollTimeSecs) > 0: pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_POLLTIME_INVALID") % (str(pPollTimeSecs)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprPollTime(pPollTimeSecs) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_POLLTIME_INVALID_SET") % (str(pPollTimeSecs)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprSaveTime(self, pSaveTimeSecs): """Check and set save time for timekpr""" """Set the interval at which timekpr saves user data (time spent, etc.)""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pSaveTimeSecs is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_SAVETIME_NONE") else: # parse try: # try to convert if int(pSaveTimeSecs) > 0: pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_SAVETIME_INVALID") % (str(pSaveTimeSecs)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprSaveTime(pSaveTimeSecs) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_SAVETIME_INVALID_SET") % (str(pSaveTimeSecs)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprTrackInactive(self, pTrackInactive): """Check and set default value for tracking inactive sessions""" """Note that this is just the default value which is configurable at user level""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pTrackInactive is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_TRACKINACTIVE_NONE") else: # parse try: # try to convert if bool(pTrackInactive): pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_TRACKINACTIVE_INVALID") % (str(pTrackInactive)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprTrackInactive(pTrackInactive) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_TRACKINACTIVE_INVALID_SET") % (str(pTrackInactive)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprTerminationTime(self, pTerminationTimeSecs): """Check and set up user termination time""" """ User temination time is how many seconds user is allowed in before he's thrown out This setting applies to users who log in at inappropriate time according to user config """ # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pTerminationTimeSecs is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_TERMTIME_NONE") else: # parse try: # try to convert if int(pTerminationTimeSecs) > 0: pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_TERMTIME_INVALID") % (str(pTerminationTimeSecs)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprTerminationTime(pTerminationTimeSecs) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_TERMTIME_INVALID_SET") % (str(pTerminationTimeSecs)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprFinalWarningTime(self, pFinalWarningTimeSecs): """Check and set up final warning time for users""" """ Final warning time is the countdown lenght (in seconds) for the user before he's thrown out""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pFinalWarningTimeSecs is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_FINALWARNTIME_NONE") else: # parse try: # try to convert if int(pFinalWarningTimeSecs) > 0: pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_FINALWARNTIME_INVALID") % (str(pFinalWarningTimeSecs)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprFinalWarningTime(pFinalWarningTimeSecs) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_FINALWARNTIME_INVALID_SET") % (str(pFinalWarningTimeSecs)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprFinalNotificationTime(self, pFinalNotificationTimeSecs): """Check and set up final notification time for users""" """ Final notification time is the time prior to ending sessions when final notification is sent out""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pFinalNotificationTimeSecs is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_FINALNOTIFTIME_NONE") else: # parse try: # try to convert if int(pFinalNotificationTimeSecs) > 0: pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_FINALNOTIFTIME_INVALID") % (str(pFinalNotificationTimeSecs)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprFinalNotificationTime(pFinalNotificationTimeSecs) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_FINALNOTIFTIME_INVALID_SET") % (str(pFinalNotificationTimeSecs)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprSessionsCtrl(self, pSessionsCtrl): """Check and set accountable session types for users""" """ Accountable sessions are sessions which are counted as active, there are handful of them, but predefined""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pSessionsCtrl is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_CTRLSESSIONS_NONE") else: # limits sessionsCtrl = [] # parse config try: for rSession in pSessionsCtrl: # try to convert seconds in day and normalize seconds in proper interval sessionsCtrl.append(rSession) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_CTRLSESSIONS_INVALID") # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprSessionsCtrl(sessionsCtrl) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_CTRLSESSIONS_INVALID_SET") # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprSessionsExcl(self, pSessionsExcl): """Check and set NON-accountable session types for users""" """ NON-accountable sessions are sessions which are explicitly ignored during session evaluation, there are handful of them, but predefined""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pSessionsExcl is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_EXCLSESSIONW_NONE") else: # limits sessionsExcl = [] # parse config try: for rSession in pSessionsExcl: # try to convert seconds in day and normalize seconds in proper interval sessionsExcl.append(rSession) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_EXCLSESSIONS_INVALID") # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprSessionsExcl(sessionsExcl) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_EXCLSESSIONS_INVALID_SET") # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprUsersExcl(self, pUsersExcl): """Check and set excluded usernames for timekpr""" """ Excluded usernames are usernames which are excluded from accounting Pre-defined values containt all graphical login managers etc., please do NOT add actual end-users here, You can, but these users will never receive any notifications about time, icon will be in connecting state forever """ # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pUsersExcl is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_EXCLUSERS_NONE") else: # limits usersExcl = [] # parse config try: for rUser in pUsersExcl: # try to convert seconds in day and normalize seconds in proper interval usersExcl.append(rUser) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_EXCLUSERS_INVALID") # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprUsersExcl(usersExcl) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_EXCLUSERS_INVALID_SET") # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprPlayTimeEnabled(self, pPlayTimeEnabled): """Check and set the PlayTime global switch""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pPlayTimeEnabled is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_PLAYTIMEENABLED_NONE") else: # parse try: # try to convert if bool(pPlayTimeEnabled): pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_PLAYTIMEENABLED_INVALID") % (str(pPlayTimeEnabled)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprPlayTimeEnabled(pPlayTimeEnabled) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_PLAYTIMEENABLED_INVALID_SET") % (str(pPlayTimeEnabled)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message def checkAndSetTimekprPlayTimeEnhancedActivityMonitorEnabled(self, pPlayTimeAdvancedSearchEnabled): """Check and set the PlayTime global enhanced activity monitor switch""" # load config result, message = self.loadTimekprConfiguration() # if we are still fine if result != 0: # result pass elif pPlayTimeAdvancedSearchEnabled is None: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_PLAYTIME_ENH_ACT_MON_ENABLED_NONE") else: # parse try: # try to convert if bool(pPlayTimeAdvancedSearchEnabled): pass except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_PLAYTIME_ENH_ACT_MON_ENABLED_INVALID") % (str(pPlayTimeAdvancedSearchEnabled)) # if all is correct, we update the configuration if result == 0: # set up config try: self._timekprConfig.setTimekprPlayTimeEnhancedActivityMonitorEnabled(pPlayTimeAdvancedSearchEnabled) except Exception: # result result = -1 message = msg.getTranslation("TK_MSG_ADMIN_CHK_PLAYTIME_ENH_ACT_MON_ENABLED_INVALID_SET") % (str(pPlayTimeAdvancedSearchEnabled)) # if we are still fine if result == 0: # save config self._timekprConfig.saveTimekprConfiguration() # result return result, message timekpr-next/server/config/userhelper.py000664 001750 001750 00000015520 14017261747 022514 0ustar00bezvfedubezvfedu000000 000000 """ Created on Feb 05, 2019 @author: mjasnik """ # imports import fileinput import re import os import pwd import re from glob import glob # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.common.utils.config import timekprConfig from timekpr.common.utils.config import timekprUserConfig from timekpr.common.utils.config import timekprUserControl from timekpr.common.utils.misc import getNormalizedUserNames # user limits _limitsConfig = {} _loginManagers = [result.strip(None) for result in cons.TK_USERS_LOGIN_MANAGERS.split(";")] # load limits with fileinput.input(cons.TK_USER_LIMITS_FILE) as rLimitsFile: # read line and do manipulations for rLine in rLimitsFile: # get min/max uids if re.match("^UID_M(IN|AX)[ \t]+[0-9]+$", rLine): # find our config x = re.findall(r"^([A-Z_]+)[ \t]+([0-9]+).*$", rLine) # save min/max uuids _limitsConfig[x[0][0]] = int(x[0][1]) def verifyNormalUserID(pUserId): """Return min user id""" global _limitsConfig # to test in VMs default user (it may have UID of 999, -1 from limit), this should work fine for any other case return((_limitsConfig["UID_MIN"]-1 <= int(pUserId) <= _limitsConfig["UID_MAX"])) def getTimekprLoginManagers(): """Get login manager names""" global _loginManagers return(_loginManagers) def setWakeUpByRTC(pWkeUpTimeEpoch): """Set wakeup time for computer""" res = False # first check that we can access rtc if os.path.isfile(cons.TK_CTRL_WKUPF): try: # now write wakeup timer with open(cons.TK_CTRL_WKUPF, "w") as wakeFile: # write time wakeFile.write(str(pWkeUpTimeEpoch)) # success res = True except: # we only care about this, at least for now, if it succeeds res = False # result return res class timekprUserStore(object): """Class will privide methods to help managing users, like intialize the config for them""" def __init__(self): """Initialize timekprsystemusers""" log.log(cons.TK_LOG_LEVEL_DEBUG, "initializing timekprUserStore") def __del__(self): """Deinitialize timekprsystemusers""" log.log(cons.TK_LOG_LEVEL_DEBUG, "de-initializing timekprUserStore") def checkAndInitUsers(self): """Initialize all users present in the system as per particular config""" # config users = {} # iterate through all usernames for rUser in pwd.getpwall(): # check userid if rUser.pw_uid is not None and rUser.pw_uid != "" and not ("/nologin" in rUser.pw_shell or "/false" in rUser.pw_shell): # save our user, if it mactches if verifyNormalUserID(rUser.pw_uid): # get processed usernames userFName = getNormalizedUserNames(pUser=rUser)[1] # save () users[rUser.pw_name] = [rUser.pw_uid, userFName] # get user config timekprConfigManager = timekprConfig() # load user config timekprConfigManager.loadMainConfiguration() # go through our users for rUser in users: # get path of file file = os.path.join(timekprConfigManager.getTimekprConfigDir(), cons.TK_USER_CONFIG_FILE % (rUser)) # check if we have config for them if not os.path.isfile(file): log.log(cons.TK_LOG_LEVEL_INFO, "setting up user \"%s\" with id %i" % (rUser, users[rUser][0])) # user config timekprUserConfig(timekprConfigManager.getTimekprConfigDir(), rUser).initUserConfiguration() # user control timekprUserControl(timekprConfigManager.getTimekprWorkDir(), rUser).initUserControl() log.log(cons.TK_LOG_LEVEL_DEBUG, "finishing setting up users") # user list return users def getSavedUserList(self, pConfigDir=None): """ Get user list, this will get user list from config files present in the system: no config - no user leftover config - please set up non-existent user (maybe pre-defined one?) """ # initialize username storage filterExistingOnly = False # this is to filter only existing local users (currently just here, not decided on what to do) userList = [] # prepare all users in the system users = self.checkAndInitUsers() # in case we don't have a dir yet if pConfigDir is None: # get user config timekprConfigManager = timekprConfig() # load user config timekprConfigManager.loadMainConfiguration() # config dir configDir = timekprConfigManager.getTimekprConfigDir() else: # use passed value configDir = pConfigDir log.log(cons.TK_LOG_LEVEL_DEBUG, "listing user config files") # now list the config files userConfigFiles = glob(os.path.join(configDir, cons.TK_USER_CONFIG_FILE % ("*"))) log.log(cons.TK_LOG_LEVEL_DEBUG, "traversing user config files") # now walk the list for rUserConfigFile in sorted(userConfigFiles): # exclude standard sample file if "timekpr.USER.conf" not in rUserConfigFile: # first get filename and then from filename extract username part (as per cons.TK_USER_CONFIG_FILE) user = re.sub(cons.TK_USER_CONFIG_FILE.replace(".%s.", r"\.(.*)\."), r"\1", os.path.basename(rUserConfigFile)) # whether user is valid in config file userNameValidated = False # try to read the first line with username with open(rUserConfigFile, "r") as confFile: # read first (x) lines and try to get username for i in range(0, cons.TK_UNAME_SRCH_LN_LMT): # check whether we have correct username if "[%s]" % (user) in confFile.readline(): # user validated userNameValidated = True # found break # validate user against valid (existing) users in the system if userNameValidated and (not filterExistingOnly or user in users): # get actual user name if user in users: # add user name and full name userList.append([user, users[user][1]]) else: # add user name and full name userList.append([user, ""]) log.log(cons.TK_LOG_LEVEL_DEBUG, "finishing user list") # finish return(userList) timekpr-next/server/user/000775 001750 001750 00000000000 14064575714 017476 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/user/userdata.py000664 001750 001750 00000145054 14064575714 021671 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # import section from datetime import datetime, timedelta, timezone import random import string import math # timekpr imports from timekpr.common.log import log from timekpr.common.constants import constants as cons from timekpr.server.interface.dbus.logind.user import timekprUserManager from timekpr.common.utils.notifications import timekprNotificationManager from timekpr.common.utils.config import timekprUserConfig from timekpr.common.utils.config import timekprUserControl class timekprUser(object): """Contains all the data for timekpr user""" def __init__(self, pBusName, pUserId, pUserName, pUserPath, pTimekprConfig, pPlayTimeConfig): """Initialize all stuff for user""" log.log(cons.TK_LOG_LEVEL_INFO, "start init timekprUser") # init limit structure self._timekprUserData = self._initUserLimits() # set user data self._timekprUserData[cons.TK_CTRL_UID] = pUserId self._timekprUserData[cons.TK_CTRL_UNAME] = pUserName self._timekprUserData[cons.TK_CTRL_UPATH] = pUserPath # global server config self._timekprConfig = pTimekprConfig # PlayTime option self._timekprPlayTimeConfig = pPlayTimeConfig # set up user properties self._timekprUserData[cons.TK_CTRL_SCR_N] = False # is screensaver running self._timekprUserData[cons.TK_CTRL_SCR_K] = None # verification key # save the bus self._timekprUserManager = timekprUserManager(self._timekprUserData[cons.TK_CTRL_UNAME], self._timekprUserData[cons.TK_CTRL_UPATH]) # user config self._timekprUserConfig = timekprUserConfig(self._timekprConfig.getTimekprConfigDir(), self._timekprUserData[cons.TK_CTRL_UNAME]) # user control self._timekprUserControl = timekprUserControl(self._timekprConfig.getTimekprWorkDir(), self._timekprUserData[cons.TK_CTRL_UNAME]) # user notification self._timekprUserNotification = timekprNotificationManager(pBusName, self._timekprUserData[cons.TK_CTRL_UNAME], pTimekprConfig) log.log(cons.TK_LOG_LEVEL_INFO, "finish init timekprUser") def refreshTimekprRuntimeVariables(self): """Calcualte variables before each method which uses them (idea is not to repeat the calculations)""" # establish current time self._effectiveDatetime = datetime.now().replace(microsecond=0) # get DOW self._currentDOW = str(datetime.date(self._effectiveDatetime).isoweekday()) # get HOD self._currentHOD = self._effectiveDatetime.hour # get HOD self._currentMOH = self._effectiveDatetime.minute # get seconds left in day self._secondsLeftDay = ((datetime(self._effectiveDatetime.year, self._effectiveDatetime.month, self._effectiveDatetime.day) + timedelta(days=1)) - self._effectiveDatetime).total_seconds() # get seconds left in hour self._secondsLeftHour = ((self._effectiveDatetime + timedelta(hours=1)).replace(microsecond=0, second=0, minute=0) - self._effectiveDatetime).total_seconds() # how many seconds are in this hour self._secondsInHour = (self._effectiveDatetime - self._effectiveDatetime.replace(microsecond=0, second=0, minute=0)).total_seconds() def _initUserLimits(self): """Initialize default limits for the user""" # the config works as follows: # we have cons.LIMIT, this limit is either time allowed per day or if that is not used, all seconds in allowed hours # in hour section (0 is the sample in config), we have whether one is allowed to work in particular hour and then we have time spent (which can be paused as well) # the rest must be easy # define structure for limits # day: next day | limit | left per day + hours 0 - 23 (0 hour sample included) limits = { # per day values # -- see the loop below initial assignment -- # additional limits cons.TK_CTRL_LIMITW : None, # this is limit per week cons.TK_CTRL_LIMITM : None, # this is limit per month # global time acconting values cons.TK_CTRL_LEFT : 0, # this is how much time left is countinously cons.TK_CTRL_LEFTW : 0, # this is left per week cons.TK_CTRL_LEFTM : 0, # this is left per month cons.TK_CTRL_SPENTD : 0, # this is spent per day cons.TK_CTRL_SPENTW : 0, # this is spent per week cons.TK_CTRL_SPENTM : 0, # this is spent per month # checking values cons.TK_CTRL_LCHECK : datetime.now().replace(microsecond=0), # this is last checked time cons.TK_CTRL_LSAVE : datetime.now().replace(microsecond=0), # this is last save time (physical save will be less often as check) cons.TK_CTRL_LMOD : datetime.now().replace(microsecond=0), # this is last control save time cons.TK_CTRL_LCMOD : datetime.now().replace(microsecond=0), # this is last config save time # user values cons.TK_CTRL_UID : None, # user id (not used, but still saved) cons.TK_CTRL_UNAME : "", # user name, this is the one we need cons.TK_CTRL_UPATH : "", # this is for DBUS communication purposes # user session values (comes directly from user session) cons.TK_CTRL_SCR_N : False, # actual value cons.TK_CTRL_SCR_K : None, # verification key value cons.TK_CTRL_SCR_R : 0 # retry count for verification } # fill up every day and hour # loop through days for i in range(1, 7+1): # fill up day limits[str(i)] = {cons.TK_CTRL_NDAY: str(i + 1 if i < 7 else 1), cons.TK_CTRL_PDAY: str(i - 1 if i > 1 else 7), cons.TK_CTRL_LIMITD: None, cons.TK_CTRL_SPENTBD: None, cons.TK_CTRL_LEFTD: None, "0": {cons.TK_CTRL_ACT: True, cons.TK_CTRL_SPENTH: 0, cons.TK_CTRL_SLEEP: 0, cons.TK_CTRL_SMIN: 0, cons.TK_CTRL_EMIN: 60}} # loop through hours for j in range(0, 23+1): # initial limit is whole hour limits[str(i)][str(j)] = {cons.TK_CTRL_ACT: False, cons.TK_CTRL_SPENTH: 0, cons.TK_CTRL_SLEEP: 0, cons.TK_CTRL_SMIN: 0, cons.TK_CTRL_EMIN: 60, cons.TK_CTRL_UACC: False} # ## this section adds additional features ## # PlayTime limits[cons.TK_CTRL_PTCNT] = {} limits[cons.TK_CTRL_PTCNT][cons.TK_CTRL_PTLSTC] = 0 # loop through days for i in range(1, 7+1): # adding days and allowances limits[cons.TK_CTRL_PTCNT][str(i)] = {cons.TK_CTRL_LIMITD: 0, cons.TK_CTRL_LEFTD: 0, cons.TK_CTRL_SPENTBD: 0, cons.TK_CTRL_SPENTD: 0} # return limits return limits def deInitUser(self): """De-initialize timekpr user""" # logging log.log(cons.TK_LOG_LEVEL_INFO, "de-initialization of \"%s\" DBUS connections" % (self.getUserName())) # deinit self._timekprUserNotification.deInitUser() def recalculateTimeLeft(self): """Recalculate time left based on spent and configuration""" # reset "lefts" self._timekprUserData[cons.TK_CTRL_LEFT] = 0 # calculate time left for week self._timekprUserData[cons.TK_CTRL_LEFTW] = self._timekprUserData[cons.TK_CTRL_LIMITW] - self._timekprUserData[cons.TK_CTRL_SPENTW] # calculate time left for month self._timekprUserData[cons.TK_CTRL_LEFTM] = self._timekprUserData[cons.TK_CTRL_LIMITM] - self._timekprUserData[cons.TK_CTRL_SPENTM] # account PlayTime for this day self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_LEFTD] = self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_LIMITD] - self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTBD] # continous time contTime = True # calculate "lefts" timesLeft = {cons.TK_CTRL_LEFTD: 0, cons.TK_CTRL_LEFTW: self._timekprUserData[cons.TK_CTRL_LEFTW], cons.TK_CTRL_LEFTM: self._timekprUserData[cons.TK_CTRL_LEFTM]} # go through days for i in (self._currentDOW, self._timekprUserData[self._currentDOW][cons.TK_CTRL_NDAY]): # reset "lefts" self._timekprUserData[i][cons.TK_CTRL_LEFTD] = 0 # how many seconds left for that day (not counting hours limits yet) timesLeft[cons.TK_CTRL_LEFTD] = self._timekprUserData[i][cons.TK_CTRL_LIMITD] - self._timekprUserData[i][cons.TK_CTRL_SPENTBD] # left is least of the limits secondsLeft = max(min(timesLeft[cons.TK_CTRL_LEFTD], timesLeft[cons.TK_CTRL_LEFTW], timesLeft[cons.TK_CTRL_LEFTM]), 0) # this is it (no time or there will be no continous time for this day) if secondsLeft <= 0 or not contTime: break # determine current HOD currentHOD = self._currentHOD if self._currentDOW == i else 0 # go through hours for this day for j in range(currentHOD, 23+1): # reset seconds to add secondsToAddHour = secondsLeftHour = 0 # calculate only if hour is enabled if self._timekprUserData[i][str(j)][cons.TK_CTRL_ACT]: # certain values need to be calculated as per this hour if self._currentDOW == i and self._currentHOD == j: # this is how many seconds are actually left in hour (as per generic time calculations) secondsLeftHour = self._secondsLeftHour # calculate how many seconds are left in this hour as per configuration secondsLeftHourLimit = (self._timekprUserData[i][str(j)][cons.TK_CTRL_EMIN] * 60 - self._currentMOH * 60 - self._effectiveDatetime.second) if (self._timekprUserData[i][str(j)][cons.TK_CTRL_SMIN] * 60 <= self._currentMOH * 60 + self._effectiveDatetime.second) else 0 else: # full hour available secondsLeftHour = 3600 # calculate how many seconds are left in this hour as per configuration secondsLeftHourLimit = (self._timekprUserData[i][str(j)][cons.TK_CTRL_EMIN] - self._timekprUserData[i][str(j)][cons.TK_CTRL_SMIN]) * 60 # continous time check for start of the hour (needed to see whether any of next hours are continous before adding to available time) contTime = (contTime and self._timekprUserData[i][str(j)][cons.TK_CTRL_SMIN] == 0) # save seconds to subtract for this hour secondsToAddHour = max(min(secondsLeftHour, secondsLeftHourLimit, secondsLeft), 0) # debug if log.isDebugEnabled(cons.TK_LOG_LEVEL_EXTRA_DEBUG): log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "currentDOW: %s, currentHOD: %i, secondsLeftHour: %i, currentMOH: %i, currentSOM: %i, secondsLeftHourLimit: %i, secondsToAddHour: %i, secondsLeft: %i" % (i, j, secondsLeftHour, self._currentMOH, self._effectiveDatetime.second, secondsLeftHourLimit, secondsToAddHour, secondsLeft)) # hour is disabled else: # time is over already from the start (it won't be added to current session, but we'll count the rest of hours allowed) contTime = False # debug if log.isDebugEnabled(cons.TK_LOG_LEVEL_EXTRA_DEBUG): log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "day: %s, hour: %i, enabled: %s, addToHour: %i, contTime: %i, leftD: %i, leftWk: %i, leftMon: %i" % (i, j, self._timekprUserData[i][str(j)][cons.TK_CTRL_ACT], secondsToAddHour, contTime, timesLeft[cons.TK_CTRL_LEFTD], self._timekprUserData[cons.TK_CTRL_LEFTW], self._timekprUserData[cons.TK_CTRL_LEFTM])) # adjust left continously self._timekprUserData[cons.TK_CTRL_LEFT] += secondsToAddHour if contTime else 0 # adjust left this hour self._timekprUserData[i][cons.TK_CTRL_LEFTD] += secondsToAddHour # recalculate "lefts" timesLeft[cons.TK_CTRL_LEFTD] -= secondsToAddHour timesLeft[cons.TK_CTRL_LEFTW] -= secondsToAddHour timesLeft[cons.TK_CTRL_LEFTM] -= secondsToAddHour secondsLeft -= secondsToAddHour # recalculate whether time is continous after accounting the time (handles the end of hour) # time previously was previously continous (no break) # seconds to add must be at least equal to the seconds left in this hour (all hour is available) # total seconds left this day cannot be 0 unless it's the end of the day (when seconds for the day ends, the only plausible case is the end of the day) contTime = True if (contTime and not secondsToAddHour < secondsLeftHour and not (secondsLeft <= 0 and j != 23)) else False # this is it (time over) if secondsLeft <= 0 or (not contTime and self._currentDOW != i): # time is over break # debug if log.isDebugEnabled(cons.TK_LOG_LEVEL_EXTRA_DEBUG): log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "leftInRow: %i, leftDay: %i, lefDay+1: %i" % (self._timekprUserData[cons.TK_CTRL_LEFT], self._timekprUserData[self._currentDOW][cons.TK_CTRL_LEFTD], self._timekprUserData[self._timekprUserData[self._currentDOW][cons.TK_CTRL_NDAY]][cons.TK_CTRL_LEFTD])) def adjustLimitsFromConfig(self, pSilent=True): """Adjust limits as per loaded configuration""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start adjustLimitsFromConfig") # load config self._timekprUserConfig.loadConfiguration() # load the configuration into working structures allowedDays = self._timekprUserConfig.getUserAllowedWeekdays() limitsPerWeekday = self._timekprUserConfig.getUserLimitsPerWeekdays() # limits per week & day # we do not have value (yet) for week self._timekprUserData[cons.TK_CTRL_LIMITW] = self._timekprUserConfig.getUserWeekLimit() # we do not have value (yet) for month self._timekprUserData[cons.TK_CTRL_LIMITM] = self._timekprUserConfig.getUserMonthLimit() # load PlayTime configuration into working structures allowedDaysPT = self._timekprUserConfig.getUserPlayTimeAllowedWeekdays() limitsPerWeekdayPT = self._timekprUserConfig.getUserPlayTimeLimitsPerWeekdays() # for allowed weekdays for rDay in cons.TK_ALLOWED_WEEKDAYS.split(";"): # days index idx = allowedDays.index(rDay) if rDay in allowedDays else -1 # limits index idx = idx if idx >= 0 and len(limitsPerWeekday) > idx else -1 # set up limits self._timekprUserData[rDay][cons.TK_CTRL_LIMITD] = limitsPerWeekday[idx] if idx >= 0 else 0 # we do not have value (yet) for day if self._timekprUserData[rDay][cons.TK_CTRL_SPENTBD] is None: # no value means 0 self._timekprUserData[rDay][cons.TK_CTRL_SPENTBD] = 0 # only if not initialized if self._timekprUserData[rDay][cons.TK_CTRL_LEFTD] is None: # initialize left as limit, since we just loaded the configuration self._timekprUserData[rDay][cons.TK_CTRL_LEFTD] = self._timekprUserData[rDay][cons.TK_CTRL_LIMITD] - self._timekprUserData[rDay][cons.TK_CTRL_SPENTBD] # get hours for particular day allowedHours = self._timekprUserConfig.getUserAllowedHours(rDay) # check if it is enabled as per config dayAllowed = rDay in allowedDays # loop through all days for rHour in range(0, 23+1): # if day is disabled, it does not matter whether hour is (order of this if is important) if not dayAllowed: # disallowed hourAllowed = False # if hour is allowed elif str(rHour) in allowedHours: # disallowed hourAllowed = True # set up minutes self._timekprUserData[rDay][str(rHour)][cons.TK_CTRL_SMIN] = allowedHours[str(rHour)][cons.TK_CTRL_SMIN] self._timekprUserData[rDay][str(rHour)][cons.TK_CTRL_EMIN] = allowedHours[str(rHour)][cons.TK_CTRL_EMIN] self._timekprUserData[rDay][str(rHour)][cons.TK_CTRL_UACC] = allowedHours[str(rHour)][cons.TK_CTRL_UACC] # disallowed else: hourAllowed = False # set up in structure self._timekprUserData[rDay][str(rHour)][cons.TK_CTRL_ACT] = hourAllowed # days index idx = allowedDaysPT.index(rDay) if rDay in allowedDaysPT else -1 # limits index idx = idx if idx >= 0 and len(limitsPerWeekdayPT) > idx else -1 # set up PlayTime limits self._timekprUserData[cons.TK_CTRL_PTCNT][rDay][cons.TK_CTRL_LIMITD] = limitsPerWeekdayPT[idx] if idx >= 0 else 0 # process filters only when PT enabled if self._timekprUserConfig.getUserPlayTimeEnabled(): # set up process filters self._timekprPlayTimeConfig.processPlayTimeFilters(self._timekprUserData[cons.TK_CTRL_UID], self._timekprUserConfig.getUserPlayTimeActivities()) # set up last config mod time self._timekprUserData[cons.TK_CTRL_LCMOD] = self._timekprUserConfig.getUserConfigLastModified() # debug if log.isDebugEnabled(cons.TK_LOG_LEVEL_EXTRA_DEBUG): log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "adjustLimitsFromConfig structure: %s" % (str(self._timekprUserData))) # get time limits and send them out if needed self.getTimeLimits() # inform user about change if not pSilent: # inform self._timekprUserNotification.timeConfigurationChangedNotification(cons.TK_PRIO_IMPORTANT_INFO) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish adjustLimitsFromConfig") def adjustTimeSpentFromControl(self, pSilent=True, pPreserveSpent=False): """Adjust limits as per loaded configuration""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start adjustTimeSpentFromControl") def _getPlayTimeBalanceSpent(pTimeSpentBeforeReload): """Get PlayTime spent balance""" # def bal = spent = 0 # in case day changed if dayChanged: # get PT status isPTEna, isPTAcc, isPTAct = self._isPlayTimeEnabledAccountedActive(pSilent=True, pCheckActive=True) # if PlayTime is enabled and active, we need to account spent for those seconds (if not active, it will be left as 0) if isPTEna and isPTAct: # seconds in hour for spent spent = spentHour # balance is accounted only when not in override if isPTAcc: bal = spentHour else: # just get the balance bal = self._timekprUserControl.getUserPlayTimeSpentBalance() spent = self._timekprUserControl.getUserPlayTimeSpentDay() + pTimeSpentBeforeReload # balance is adjusted if PT is accounted (not in override mode) if self._isPlayTimeEnabledAccountedActive(pSilent=True)[1]: bal += pTimeSpentBeforeReload # result return bal, spent # in case we force reload the file, we need to account the time which was spent before reload too if pPreserveSpent: # get time spent which was calculated timeSpentBeforeReload = max(self._timekprUserData[self._currentDOW][cons.TK_CTRL_SPENTBD] - self._timekprUserControl.getUserTimeSpentBalance(), 0) # check whether we need to change PT as well timeSpentBeforeReloadPT = max(self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTD] - self._timekprUserControl.getUserPlayTimeSpentDay(), 0) else: # no additional time timeSpentBeforeReload = timeSpentBeforeReloadPT = 0 # read from config self._timekprUserControl.loadControl() # spent this hour spentHour = self._timekprUserData[self._currentDOW][str(self._currentHOD)][cons.TK_CTRL_SPENTH] # control date components changed dayChanged, weekChanged, monthChanged = self._timekprUserControl.getUserDateComponentChanges(self._effectiveDatetime) # if day has changed adjust balance self._timekprUserData[self._currentDOW][cons.TK_CTRL_SPENTBD] = spentHour if dayChanged else self._timekprUserControl.getUserTimeSpentBalance() + timeSpentBeforeReload # if day has changed self._timekprUserData[cons.TK_CTRL_SPENTD] = spentHour if dayChanged else self._timekprUserControl.getUserTimeSpentDay() + timeSpentBeforeReload # if week changed changed self._timekprUserData[cons.TK_CTRL_SPENTW] = spentHour if weekChanged else self._timekprUserControl.getUserTimeSpentWeek() + timeSpentBeforeReload # if month changed self._timekprUserData[cons.TK_CTRL_SPENTM] = spentHour if monthChanged else self._timekprUserControl.getUserTimeSpentMonth() + timeSpentBeforeReload # import that into runtime config (if last check day is the same as current) self._timekprUserData[self._currentDOW][cons.TK_CTRL_LEFTD] = self._timekprUserData[self._currentDOW][cons.TK_CTRL_LIMITD] - self._timekprUserData[self._currentDOW][cons.TK_CTRL_SPENTBD] # account PlayTime as well self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTBD], self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTD] = _getPlayTimeBalanceSpent(timeSpentBeforeReloadPT) # update last file mod time self._timekprUserData[cons.TK_CTRL_LMOD] = self._timekprUserControl.getUserControlLastModified() # inform user about change if not pSilent: # inform self._timekprUserNotification.timeLeftChangedNotification(cons.TK_PRIO_IMPORTANT_INFO) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish adjustTimeSpentFromControl") def _isPlayTimeEnabledAccountedActive(self, pSilent=False, pCheckActive=False): """Return whether PlayTime is enabled, accounted and used at the moment""" # def isPTActive = False # account PlayTime as well (it makes sense to check PT activity only if user is active in the system) isPTEnabled = self._timekprConfig.getTimekprPlayTimeEnabled() and self._timekprUserConfig.getUserPlayTimeEnabled() # whether override mode is enabled isPTAccounted = not self._timekprUserConfig.getUserPlayTimeOverrideEnabled() # check whether active too if pCheckActive and isPTEnabled: # PT active isPTActive = self._timekprPlayTimeConfig.verifyPlayTimeActive(self.getUserId(), self.getUserName(), pSilent) # result return isPTEnabled, isPTAccounted, isPTActive def adjustTimeSpentActual(self, pTimekprConfig): """Adjust time spent (and save it)""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start adjustTimeSpentActual") def _adjustTimeSpentValues(pDay, pHOD, pSecs, pActive): """Adjust time spent values""" # if hour is not accounted, we do not account main time if not pActive or self._timekprUserData[pDay][pHOD][cons.TK_CTRL_UACC]: # track sleep time self._timekprUserData[pDay][pHOD][cons.TK_CTRL_SLEEP] += pSecs else: # adjust time spent hour self._timekprUserData[pDay][pHOD][cons.TK_CTRL_SPENTH] += pSecs # adjust time spent day balance self._timekprUserData[pDay][cons.TK_CTRL_SPENTBD] += pSecs # adjust time spent day self._timekprUserData[cons.TK_CTRL_SPENTD] += pSecs # adjust time spent week self._timekprUserData[cons.TK_CTRL_SPENTW] += pSecs # adjust time spent month self._timekprUserData[cons.TK_CTRL_SPENTM] += pSecs # check if dates have changed dayChanged, weekChanged, monthChanged = self._timekprUserControl.getUserDateComponentChanges(self._effectiveDatetime, self._timekprUserData[cons.TK_CTRL_LCHECK]) # currentHOD in str currentHODStr = str(self._currentHOD) # get time spent timeSpent = (self._effectiveDatetime - self._timekprUserData[cons.TK_CTRL_LCHECK]).total_seconds() # adjust last time checked self._timekprUserData[cons.TK_CTRL_LCHECK] = self._effectiveDatetime # determine if active userActiveActual, userScreenLocked = self._timekprUserManager.isUserActive(pTimekprConfig, self._timekprUserConfig, self._timekprUserData[cons.TK_CTRL_SCR_N]) userActiveEffective = userActiveActual # def PlayTime userActivePT = False # account PlayTime as well (it makes sense to check PT activity only if user is active in the system) if userActiveEffective: # PT status isPTEna, isPTAcc, isPTAct = self._isPlayTimeEnabledAccountedActive(pSilent=True, pCheckActive=True) # enabled, check actul activity if isPTEna: # PT active userActivePT = isPTAct # if override is enabled, then active is determined differently if not isPTAcc: # override userActiveEffective = userActivePT # if time spent is very much higher than the default polling time, computer might went to sleep? if timeSpent >= cons.TK_POLLTIME * 15: # sleeping time is added to inactive time (there is a question whether that's OK, disabled currently) log.log(cons.TK_LOG_LEVEL_DEBUG, "INFO: timekpr sleeping for %i" % (timeSpent)) # effectively spent is 0 (we ignore +/- 3 seconds here) timeSpent = 0 else: # set time spent for previous hour (this may be triggered only when day changes) if timeSpent > self._secondsInHour: # adjust time values (either inactive or actual time) _adjustTimeSpentValues(self._timekprUserData[self._currentDOW][cons.TK_CTRL_PDAY] if dayChanged else self._currentDOW, "23" if self._currentHOD == 0 else currentHODStr, timeSpent - self._secondsInHour, userActiveEffective) # adjust time spent for this hour timeSpent = min(timeSpent, self._secondsInHour) # if there is a day change, we need to adjust time for this day and day after if dayChanged: ### handle day change for rDay in (self._currentDOW, self._timekprUserData[self._currentDOW][cons.TK_CTRL_NDAY]): # clean up hours for this day for rHour in range(0, 23+1): # reset spent for hour self._timekprUserData[rDay][str(rHour)][cons.TK_CTRL_SPENTH] = 0 # reset sleeping self._timekprUserData[rDay][str(rHour)][cons.TK_CTRL_SLEEP] = 0 # reset balance for day self._timekprUserData[rDay][cons.TK_CTRL_SPENTBD] = 0 # reset time spent for this day self._timekprUserData[cons.TK_CTRL_SPENTD] = 0 # reset PlayTime balance for this day self._timekprUserData[cons.TK_CTRL_PTCNT][rDay][cons.TK_CTRL_SPENTBD] = 0 # reset PlayTime spent for this day self._timekprUserData[cons.TK_CTRL_PTCNT][rDay][cons.TK_CTRL_SPENTD] = 0 ### handle week change if weekChanged: # set spent for week as not initialized for this week, so new limits will apply properly self._timekprUserData[cons.TK_CTRL_SPENTW] = 0 ### handle month change if monthChanged: # set spent for month as not initialized for this month, so new limits will apply properly self._timekprUserData[cons.TK_CTRL_SPENTM] = 0 # adjust time values (either sleep or inactive or actual time) _adjustTimeSpentValues(self._currentDOW, currentHODStr, timeSpent, userActiveEffective) # count PlayTime if enabled if userActiveEffective and userActivePT: # when override is enabled, only balance for regular time is accounted, PT balance is not # if override is not enabled, we count this only for spent, not for balance (i.e. it will not count towards limit) if not self._timekprUserConfig.getUserPlayTimeOverrideEnabled(): # adjust PlayTime balance this day self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTBD] += timeSpent # adjust PlayTime spent this day self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTD] += timeSpent # logging section if dayChanged: log.log(cons.TK_LOG_LEVEL_INFO, "day change, user: %s, tbal: %i, tsp: %i, ptbal: %i, ptsp: %i" % (self.getUserName(), self._timekprUserData[self._currentDOW][cons.TK_CTRL_SPENTBD], self._timekprUserData[cons.TK_CTRL_SPENTD], self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTBD], self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTD])) if weekChanged: log.log(cons.TK_LOG_LEVEL_INFO, "week change, user: %s, twk: %i" % (self.getUserName(), self._timekprUserData[cons.TK_CTRL_SPENTW])) if monthChanged: log.log(cons.TK_LOG_LEVEL_INFO, "month change, user: %s, tmon: %i" % (self.getUserName(), self._timekprUserData[cons.TK_CTRL_SPENTM])) # check if we need to save progress if (self._effectiveDatetime - self._timekprUserData[cons.TK_CTRL_LSAVE]).total_seconds() >= pTimekprConfig.getTimekprSaveTime() or dayChanged: # save self.saveSpent() log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish adjustTimeSpentActual") # returns if user is active return userActiveEffective, userActiveActual, userScreenLocked def getTimeLeft(self, pForceNotifications=False): """Get how much time is left (for this day and in a row for max this and next day)""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start getTimeLeft") # time left in a row timeLeftToday = self._timekprUserData[self._currentDOW][cons.TK_CTRL_LEFTD] # time left in a row timeLeftInARow = self._timekprUserData[cons.TK_CTRL_LEFT] # time spent this session / time inactive this session / time available from intervals timeSpentThisSession = timeInactiveThisSession = timeAvailableIntervals = 0 # go through days for i in (self._timekprUserData[self._currentDOW][cons.TK_CTRL_PDAY], self._currentDOW, self._timekprUserData[self._currentDOW][cons.TK_CTRL_NDAY]): # sleep is counted for hours, spent is day and hours # go through hours for this day for j in range(0, 23+1): # time spent this session (but not more then prev, current, past days) timeSpentThisSession += self._timekprUserData[i][str(j)][cons.TK_CTRL_SPENTH] # time inactive this session (but not more then prev, current, past days) timeInactiveThisSession += self._timekprUserData[i][str(j)][cons.TK_CTRL_SLEEP] # for current day (and enabled hours) if i == self._currentDOW and self._timekprUserData[i][str(j)][cons.TK_CTRL_ACT]: timeAvailableIntervals += ((self._timekprUserData[i][str(j)][cons.TK_CTRL_EMIN] - self._timekprUserData[i][str(j)][cons.TK_CTRL_SMIN]) * 60) # time spent balance for the day timeSpentBalance = self._timekprUserData[self._currentDOW][cons.TK_CTRL_SPENTBD] # time spent for the day timeSpentDay = self._timekprUserData[cons.TK_CTRL_SPENTD] # time spent for week timeSpentWeek = self._timekprUserData[cons.TK_CTRL_SPENTW] # time spent for week timeSpentMonth = self._timekprUserData[cons.TK_CTRL_SPENTM] # unaccounted hour isCurrentTimeBetweenInterval = self._timekprUserData[self._currentDOW][str(self._currentHOD)][cons.TK_CTRL_SMIN] <= self._currentMOH <= self._timekprUserData[self._currentDOW][str(self._currentHOD)][cons.TK_CTRL_EMIN] timeUnaccountedHour = self._timekprUserData[self._currentDOW][str(self._currentHOD)][cons.TK_CTRL_UACC] if isCurrentTimeBetweenInterval else False # debug (bt = since boot / restart) log.log(cons.TK_LOG_LEVEL_INFO, "get time for \"%s\", tltd %i, tlrow: %i, tspbal: %i, tspbt: %i, tidbt: %i" % (self.getUserName(), timeLeftToday, timeLeftInARow, timeSpentBalance, timeSpentThisSession, timeInactiveThisSession)) # set up values timeValues = {} timeValues[cons.TK_CTRL_LEFTD] = timeLeftToday timeValues[cons.TK_CTRL_LEFT] = timeLeftInARow timeValues[cons.TK_CTRL_SPENT] = timeSpentThisSession timeValues[cons.TK_CTRL_SPENTW] = timeSpentWeek timeValues[cons.TK_CTRL_SPENTM] = timeSpentMonth timeValues[cons.TK_CTRL_SLEEP] = timeInactiveThisSession timeValues[cons.TK_CTRL_TRACK] = self._timekprUserConfig.getUserTrackInactive() timeValues[cons.TK_CTRL_HIDEI] = self._timekprUserConfig.getUserHideTrayIcon() timeValues[cons.TK_CTRL_LIMITD] = self._timekprUserData[self._currentDOW][cons.TK_CTRL_LIMITD] timeValues[cons.TK_CTRL_TNL] = (1 if self._timekprUserData[self._currentDOW][cons.TK_CTRL_LIMITD] >= cons.TK_LIMIT_PER_DAY and timeAvailableIntervals >= cons.TK_LIMIT_PER_DAY else 0) # PlayTime (only if enabled) if self._isPlayTimeEnabledAccountedActive(pSilent=True)[0]: # time and config for PlayTime timeValues[cons.TK_CTRL_PTTLO] = self._timekprUserConfig.getUserPlayTimeOverrideEnabled() timeValues[cons.TK_CTRL_PTAUH] = self._timekprUserConfig.getUserPlayTimeUnaccountedIntervalsEnabled() timeValues[cons.TK_CTRL_PTSPD] = self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTD] timeValues[cons.TK_CTRL_PTLPD] = max(0, self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_LEFTD]) timeValues[cons.TK_CTRL_PTLSTC] = self.getPlayTimeActiveActivityCnt() # pass uacc too, so notifications can be prevented when hour is unaccounted timeValues[cons.TK_CTRL_UACC] = timeUnaccountedHour # process notifications, if needed self._timekprUserNotification.processTimeLeft(pForceNotifications, timeValues) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish getTimeLeft") # return calculated return timeLeftToday, timeLeftInARow, timeSpentThisSession, timeInactiveThisSession, timeSpentBalance, timeSpentDay, timeUnaccountedHour def getPlayTimeLeft(self, pCheckActive=True): """Return whether time is over for PlayTime""" # get time left timeLeftPT = self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_LEFTD] # get PT status isPTEnabled, isPTAccounted, isPTActive = self._isPlayTimeEnabledAccountedActive(pCheckActive=pCheckActive) # if PT is enabled, log the information if isPTEnabled: # logging log.log(cons.TK_LOG_LEVEL_INFO, "get PlayTime for \"%s\", ena: %s, acc: %s, tim: %i" % (self.getUserName(), isPTEnabled, isPTAccounted, timeLeftPT)) # result return timeLeftPT, isPTEnabled, isPTAccounted, isPTActive def saveSpent(self): """Save the time spent by the user""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start saveSpent") # initial config loaded userConfigLastModified = self._timekprUserConfig.getUserConfigLastModified() userControlLastModified = self._timekprUserControl.getUserControlLastModified() # check whether we need to reload file (if externally modified) if self._timekprUserData[cons.TK_CTRL_LCMOD] != userConfigLastModified: log.log(cons.TK_LOG_LEVEL_INFO, "user \"%s\" config changed, prev/now: %s / %s" % (self.getUserName(), self._timekprUserData[cons.TK_CTRL_LCMOD].strftime(cons.TK_LOG_DATETIME_FORMAT), userConfigLastModified.strftime(cons.TK_LOG_DATETIME_FORMAT))) # load config self.adjustLimitsFromConfig(pSilent=False) # check whether we need to reload file (if externally modified) if self._timekprUserData[cons.TK_CTRL_LMOD] != userControlLastModified or self._timekprUserData[cons.TK_CTRL_LCMOD] != userConfigLastModified: # log the change if self._timekprUserData[cons.TK_CTRL_LMOD] != userControlLastModified: log.log(cons.TK_LOG_LEVEL_INFO, "user \"%s\" control changed, prev/now: %s / %s" % (self.getUserName(), self._timekprUserData[cons.TK_CTRL_LMOD].strftime(cons.TK_LOG_DATETIME_FORMAT), userControlLastModified.strftime(cons.TK_LOG_DATETIME_FORMAT))) # load config self.adjustTimeSpentFromControl(pSilent=False, pPreserveSpent=True) # adjust save time as well self._timekprUserData[cons.TK_CTRL_LSAVE] = self._effectiveDatetime # save spent time self._timekprUserControl.setUserTimeSpentBalance(self._timekprUserData[self._currentDOW][cons.TK_CTRL_SPENTBD]) self._timekprUserControl.setUserTimeSpentDay(self._timekprUserData[cons.TK_CTRL_SPENTD]) self._timekprUserControl.setUserTimeSpentWeek(self._timekprUserData[cons.TK_CTRL_SPENTW]) self._timekprUserControl.setUserTimeSpentMonth(self._timekprUserData[cons.TK_CTRL_SPENTM]) self._timekprUserControl.setUserLastChecked(self._effectiveDatetime) self._timekprUserControl.setUserPlayTimeSpentBalance(self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTBD]) self._timekprUserControl.setUserPlayTimeSpentDay(self._timekprUserData[cons.TK_CTRL_PTCNT][self._currentDOW][cons.TK_CTRL_SPENTD]) self._timekprUserControl.saveControl() # renew last modified self._timekprUserData[cons.TK_CTRL_LMOD] = self._timekprUserControl.getUserControlLastModified() # if debug if log.isDebugEnabled(cons.TK_LOG_LEVEL_EXTRA_DEBUG): log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "save spent structure: %s" % (str(self._timekprUserData[self._currentDOW]))) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish saveSpent") def getTimeLimits(self): """Calculate time limits for sendout to clients""" # main container timeLimits = {} # check allowed days allowedDays = self._timekprUserConfig.getUserAllowedWeekdays() # traverse the config and get intervals for rDay in cons.TK_ALLOWED_WEEKDAYS.split(";"): # if day is ok, then check hours if rDay in allowedDays: # assign a time limit for the day timeLimits[rDay] = {cons.TK_CTRL_LIMITD: self._timekprUserData[rDay][cons.TK_CTRL_LIMITD], cons.TK_CTRL_INT: list()} # init hours for intervals startHour = endHour = uaccValue = None uaccChanged = False # loop through all days for rHour in range(0, 23+1): # hour in str hourStr = str(rHour) # fill up start value if self._timekprUserData[rDay][hourStr][cons.TK_CTRL_ACT]: # no value (interval was changed) uaccValue = self._timekprUserData[rDay][hourStr][cons.TK_CTRL_UACC] if uaccValue is None else uaccValue # calc uacc changes uaccChanged = self._timekprUserData[rDay][hourStr][cons.TK_CTRL_UACC] != uaccValue # this is needed in case next hour starts with particular minutes, in which case continous interval ends if startHour is not None and (self._timekprUserData[rDay][hourStr][cons.TK_CTRL_SMIN] != 0 or uaccChanged): # fill interval with start and end (because hours are continous, we can count on sequential change) timeLimits[rDay][cons.TK_CTRL_INT].append([int(startHour), int(endHour), uaccValue]) # restart hour intervals startHour = uaccValue = None uaccChanged = False # if hour is enabled for use, we count the interval if self._timekprUserData[rDay][hourStr][cons.TK_CTRL_ACT]: # uacc value uaccValue = self._timekprUserData[rDay][hourStr][cons.TK_CTRL_UACC] # set start hour only if it has not beed set up, that is to start the interval if startHour is None: # start startHour = ((cons.TK_DATETIME_START + timedelta(hours=rHour, minutes=self._timekprUserData[rDay][hourStr][cons.TK_CTRL_SMIN])) - cons.TK_DATETIME_START).total_seconds() # end endHour = ((cons.TK_DATETIME_START + timedelta(hours=rHour, minutes=self._timekprUserData[rDay][hourStr][cons.TK_CTRL_EMIN])) - cons.TK_DATETIME_START).total_seconds() # interval ends if hour is not allowed or this is the end of the day if (not self._timekprUserData[rDay][hourStr][cons.TK_CTRL_ACT] and startHour is not None) or self._timekprUserData[rDay][hourStr][cons.TK_CTRL_EMIN] != 60: # fill interval with start and end (because end interval is unfinished (break in continuity)) timeLimits[rDay][cons.TK_CTRL_INT].append([int(startHour), int(endHour), uaccValue]) # restart hour intervals startHour = uaccValue = None uaccChanged = False # after we processed intervals, let's check whether we closed all, if not do it if startHour is not None: # fill unfinished interval timeLimits[rDay][cons.TK_CTRL_INT].append([int(startHour), int(endHour), uaccValue]) # weekly and monthly limits timeLimits[cons.TK_CTRL_LIMITW] = self._timekprUserData[cons.TK_CTRL_LIMITW] # weekly and monthly limits timeLimits[cons.TK_CTRL_LIMITM] = self._timekprUserData[cons.TK_CTRL_LIMITM] # ## PlayTime ## # initialize limit and process list timeLimits[cons.TK_CTRL_PTLMT] = list() timeLimits[cons.TK_CTRL_PTLST] = list() # get PT days, limits and activities allowedDaysPT = self._timekprUserConfig.getUserPlayTimeAllowedWeekdays() allowedLimitsPT = self._timekprUserConfig.getUserPlayTimeLimitsPerWeekdays() allowedApplsPT = self._timekprUserConfig.getUserPlayTimeActivities() # fill in limits (keep this ordered for days) for rDay in cons.TK_ALLOWED_WEEKDAYS.split(";"): # days index idx = allowedDaysPT.index(rDay) if rDay in allowedDaysPT else -1 # limits index idx = idx if idx >= 0 and len(allowedLimitsPT) > idx else -1 # check if particular day is enabled if idx >= 0: # add day and limit to the list timeLimits[cons.TK_CTRL_PTLMT].append([rDay, allowedLimitsPT[idx]]) # fill in activities for rAppl in allowedApplsPT: # add process (process and description) to the list timeLimits[cons.TK_CTRL_PTLST].append(rAppl) # add enable as well (exception in limits case) timeLimits[cons.TK_CTRL_PTTLE] = (1 if self._timekprUserConfig.getUserPlayTimeEnabled() else 0) # add override as well (exception in limits case) timeLimits[cons.TK_CTRL_PTTLO] = (1 if self._timekprUserConfig.getUserPlayTimeOverrideEnabled() else 0) # add allowed during unaccounted intervals as well (exception in limits case) timeLimits[cons.TK_CTRL_PTAUH] = (1 if self._timekprUserConfig.getUserPlayTimeUnaccountedIntervalsEnabled() else 0) # debug if log.isDebugEnabled(cons.TK_LOG_LEVEL_EXTRA_DEBUG): log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "TL: %s" % (str(timeLimits))) # process notifications, if needed self._timekprUserNotification.processTimeLimits(timeLimits) def processUserSessionAttributes(self, pWhat, pKey, pValue): """This will set up request or verify actual request for user attribute changes""" # depends on what attribute if pWhat == cons.TK_CTRL_SCR_N: # set it to false, e.g. not in force self._timekprUserData[cons.TK_CTRL_SCR_N] = False # if there is no key, we need to set up validation key if pKey == "": # logging log.log(cons.TK_LOG_LEVEL_INFO, "session attributes request: %s" % (pWhat)) # generate random key self._timekprUserData[cons.TK_CTRL_SCR_K] = "".join(random.choice(string.ascii_uppercase + string.digits) for _ in range(16)) """ Clarification about re-validation. Theoretically it's not that hard to fake these, if one desires. Just write a sofware that responds to requests. However, that is doable only for those who know what to do and those are mostly experienced users (I would say xperienced a LOT (DBUS is not common to non-developers)), so maybe they should not be using timekpr in the first place? """ # send verification request self._timekprUserNotification.procesSessionAttributes(pWhat, self._timekprUserData[cons.TK_CTRL_SCR_K]) # if key set set up in server, we compare it elif pKey is not None and self._timekprUserData[cons.TK_CTRL_SCR_K] is not None: # logging log.log(cons.TK_LOG_LEVEL_INFO, "session attributes verify: %s,%s,%s" % (pWhat, "key", pValue)) # if verification is successful if pKey == self._timekprUserData[cons.TK_CTRL_SCR_K]: # set up valid property self._timekprUserData[cons.TK_CTRL_SCR_N] = True if pValue in ("True", "true", "1") else False # reset key anyway self._timekprUserData[cons.TK_CTRL_SCR_K] = None else: # logging log.log(cons.TK_LOG_LEVEL_INFO, "session attributes out of order: %s,%s,%s" % (pWhat, "key", pValue)) # reset key anyway self._timekprUserData[cons.TK_CTRL_SCR_K] = None def revalidateUserSessionAttributes(self): """Actual user session attributes have to be revalidated from time to time. This will take care of that""" # increase stuff self._timekprUserData[cons.TK_CTRL_SCR_R] += 1 # revalidate only when time has come if self._timekprUserData[cons.TK_CTRL_SCR_R] >= math.ceil(cons.TK_MAX_RETRIES / 2): # screensaver # revalidate only if active (that influences time accounting) if self._timekprUserData[cons.TK_CTRL_SCR_N]: # logging log.log(cons.TK_LOG_LEVEL_INFO, "send re-validation request to user \"%s\"" % (self.getUserName())) # send verification request self.processUserSessionAttributes(cons.TK_CTRL_SCR_N, "", None) # reset retries self._timekprUserData[cons.TK_CTRL_SCR_R] = 0 def findNextAvailableIntervalStart(self): """Find next available interval start for user""" # result res = None # wakeup hours hrs = self._timekprUserConfig.getUserWakeupHourInterval() hrFrom = int(hrs[0]) hrTo = int(hrs[1]) # loop through all hours for today for rHour in range(self._currentHOD, 23+1): # check if hour is enabled if self._timekprUserData[self._currentDOW][str(rHour)][cons.TK_CTRL_ACT]: # if current hour, we need to check whether it's possible to use it (check +one minute ahead) if rHour == self._currentHOD and self._currentMOH + 1 >= self._timekprUserData[self._currentDOW][str(rHour)][cons.TK_CTRL_SMIN]: # start can not be used as it is in the past continue # only if wakeup interval is right elif hrFrom <= rHour <= hrTo: # check if we have interval res = int(datetime(self._effectiveDatetime.year, self._effectiveDatetime.month, self._effectiveDatetime.day, rHour, self._timekprUserData[self._currentDOW][str(rHour)][cons.TK_CTRL_SMIN]).strftime("%s")) # this is it break # msg if none found if res is None: log.log(cons.TK_LOG_LEVEL_INFO, "there is no next interval available today for user \"%s\"" % (self.getUserName())) # return return res def setPlayTimeActiveActivityCnt(self, pActiveActivityCnt): """This sets count of active activities""" self._timekprUserData[cons.TK_CTRL_PTCNT][cons.TK_CTRL_PTLSTC] = pActiveActivityCnt def getUserId(self): """Return user id""" return self._timekprUserData[cons.TK_CTRL_UID] def getUserName(self): """Return user name""" return self._timekprUserData[cons.TK_CTRL_UNAME] def getUserPathOnBus(self): """Return user DBUS path""" return self._timekprUserData[cons.TK_CTRL_UPATH] def getUserLockoutType(self): """Return user lockout type""" return self._timekprUserConfig.getUserLockoutType() def getPlayTimeActiveActivityCnt(self): """This returns count of active activities""" return self._timekprUserData[cons.TK_CTRL_PTCNT][cons.TK_CTRL_PTLSTC] def getUserPlayTimeUnaccountedIntervalsEnabled(self): """Return whether PlayTime activities are allowed during unlimited hours""" return self._timekprUserConfig.getUserPlayTimeUnaccountedIntervalsEnabled() def processFinalWarning(self, pFinalNotificationType, pSecondsLeft): """Process emergency message about killing""" self._timekprUserNotification.processEmergencyNotification(pFinalNotificationType, max(pSecondsLeft, 0)) def lockUserSessions(self): """Lock all user sessions""" # only if we are not in DEV mode if cons.TK_DEV_ACTIVE: log.log(cons.TK_LOG_LEVEL_INFO, "DEVELOPMENT ACTIVE, not locking myself, sorry...") else: # lock session self._timekprUserManager.lockUserSessions() timekpr-next/server/user/playtime.py000664 001750 001750 00000055521 14021162252 021662 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 01, 2020 @author: mjasnik """ # imports import os import psutil from gi.repository import GLib from datetime import datetime import re # timekpr imports from timekpr.common.log import log from timekpr.common.constants import constants as cons from timekpr.server.config import userhelper class timekprPlayTimeConfig(object): """Contains all the data for PlayTime user""" # key constants _PIDS = "P" # used to identify pids _USRS = "U" # used to identify users (in master structure) _MPIDS = "M" # used to identify processes that match patterns _FLTS = "F" # used to identify filters for processes for particular user _UID = "u" # used to identify user id (child struct) _EXE = "e" # used to identify executable for process _CMD = "c" # used to identify command line for process _TERM = "k" # used to identify terminate attempts before killing _QCP = "Q" # used to identify how many times we need to verify process has changed euid / cmdline (def: 2) _QCT = "q" # used to identify time between the QC passes (def: 5 iterations) _TIM = "t" # used to identify last update date # value constants _QCP_V = 2 _QCT_V = 5 # file locations for inspecting process and its cmdline # status _STATUS = "/proc/%s/status" # exe _EXECUTABLE ="/proc/%s/exe" # cmdline _CMDLINE = "/proc/%s/cmdline" def __init__(self, pTimekprConfig): """Initialize all stuff for PlayTime""" log.log(cons.TK_LOG_LEVEL_INFO, "start init timekprUserPlayTime") # structure: # P - process pids for all processes, every process has: u - user id, c - cmdline, t - adjustment time # U - contains users, which in turn contains reference to P # TIM - last update date for processes self._cachedPids = {self._PIDS: {}, self._USRS: {}, self._TIM: None} # global server config self._timekprConfig = pTimekprConfig log.log(cons.TK_LOG_LEVEL_INFO, "finish init timekprUserPlayTime") def _getMatchedProcessesByFilter(self, pUid, pFlts, pPids): """Method to validate whether cmdline matches the filter""" # def matchedPids = [] # loop through user processes for rPid in pPids: # executable exe = self._cachedPids[self._PIDS][rPid][self._EXE] # command line cmdLine = self._cachedPids[self._PIDS][rPid][self._CMD] # try searching only if exe is specified if exe is not None: # match for rFlt in pFlts: # pid matched isMatched = rFlt.search(exe) is not None isMatched = isMatched or (self._timekprConfig.getTimekprPlayTimeEnhancedActivityMonitorEnabled() and cmdLine is not None and rFlt.search(cmdLine) is not None) # try to check if matches if isMatched: # match matchedPids.append(rPid) # log log.log(cons.TK_LOG_LEVEL_DEBUG, "PT match, uid: %s, exe: %s, cmdl: %s" % (pUid, exe, "n/a" if cmdLine is None else cmdLine[:128])) # first filter is enough break # result return matchedPids def _initUserData(self, pUid): """Initialize user in cached structure""" # result self._cachedPids[self._USRS][pUid] = {self._PIDS: set(), self._MPIDS: set(), self._FLTS: {}} def _cachePlayTimeProcesses(self): """Refresh all processes for inspection""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start cachePlayTimeProcesses") # ## the idea is that processes have to be refreshed regularly, that is: # if users exist with active filters, then it's regular # if they do not exist, we still need to refresh processes, just more seldom # def dt = datetime.now() # regular refreshes need to happen even noone is logged in (process pid reuse) if not (((dt - self._cachedPids[self._TIM]).total_seconds() if self._cachedPids[self._TIM] is not None else cons.TK_SAVE_INTERVAL) >= cons.TK_SAVE_INTERVAL): # def areFltsEnabled = False # if no users have set up their filters, we do NOT execute process list for rUser in self._cachedPids[self._USRS]: # check if there are filters if self._cachedPids[self._USRS][rUser][self._FLTS]: # filters found areFltsEnabled = True # no need to search further break # do not do anything if there are users and filters are not enabled if not areFltsEnabled: # do not do anything return # ## this is the fastest way I found how to list all processes ## # I tried with: # subprocess + ps -ef (~ 2.2x slower) # psutil (~ 10x slower) # even scandir is a tad slower than listdir (for our use case) # this method was built for support of filtering any processes # even by regexp, but as configuration by regexp is considered # not easy for regular user, so user must specify actual executable # for it to be filterable (at least currently) # as for linux reusing the pids, timekpr refreshes processes very 3 secs # or so, depending on config, but reuse seems to be full circle, i.e. # pid is reused only when limit is reached, then it reuses pids from # the start of interval and only those which are not in use # so I don't think this actually affects timekpr at all # unique last update date + stats variables (these ar for actual counts, not just assesing the result) self._cachedPids[self._TIM] = dt cpids = 0 rpids = 0 apids = 0 lpids = 0 lcmpids = 0 ccmpids = 0 qcpids = 0 ampids = 0 # ## alternative solutions for determining owner / process ## useAltNr = 3 # list all in /proc procIds = [rPid for rPid in os.listdir("/proc") if rPid.isdecimal()] # loop through processes for procId in procIds: # def exe = None cmdLine = None userId = None prevUserId = None qcChk = False processChanged = False # matched if procId in self._cachedPids[self._PIDS]: # determine whether this process passed QC validation if self._cachedPids[self._PIDS][procId][self._QCP] > 0 and self._cachedPids[self._PIDS][procId][self._EXE] is not None: # stat qcpids += 1 # decrease check times self._cachedPids[self._PIDS][procId][self._QCT] -= 1 # check whether it's time to recheck the process if not self._cachedPids[self._PIDS][procId][self._QCT] > 0: # decrease pass times self._cachedPids[self._PIDS][procId][self._QCP] -= 1 # set up next countdown self._cachedPids[self._PIDS][procId][self._QCT] = self._QCT_V # we need to check process qcChk = True # cached self._cachedPids[self._PIDS][procId][self._TIM] = self._cachedPids[self._TIM] # stats cpids += 1 # if not QC if not qcChk: # pass continue # since processes come and go try: # ## depending on version (they all work, but speed / feature may differ) # using status (correct euid) if useAltNr == 1: # obj obj = self._STATUS % (procId) # found the process, now try to determine whether this belongs to our user with open(obj, mode="r") as usrFD: # read status lines content = usrFD.read().splitlines() # loop through status lines for rStat in content: # we are interested in Uid if rStat.startswith("Uid:"): # check for our user userId = rStat.split("\t")[1] # found Uids, no need to check more break # using commandline (filter through params too) elif useAltNr == 2: # obj obj = self._CMDLINE % (procId) # check the owner (since we are interested in processes, that usually do not change euid, this is not only enough, it's even faster than checing euid) userId = str(os.stat(obj).st_uid) # using symlinks (faster) else: # obj obj = self._EXECUTABLE % (procId) # check the owner (since we are interested in processes, that usually do not change euid, this is not only enough, it's even faster than checing euid) userId = str(os.lstat(obj).st_uid) # check if we have it if userId not in self._cachedPids[self._USRS]: # verify if userhelper.verifyNormalUserID(int(userId)): # initialize set self._initUserData(userId) else: # this is not of our interest userId = None # we need commandlines for every process, in case it changes (snapd?) try: # ## alternative if useAltNr == 3: # read link destination (this is the final destination) exe = os.readlink(obj) # ## alternative else: # try reading executable for process with open(obj, mode="r") as cmdFd: # split this exe = cmdFd.read().split("\x00")[0] # we have to inspect full cmdline (the first TK_MAX_CMD_SRCH (def: 512) symbols to be precise) if self._timekprConfig.getTimekprPlayTimeEnhancedActivityMonitorEnabled(): # obj obj = self._CMDLINE % (procId) # try reading cmdline for process with open(obj, mode="r") as cmdFd: # split this cmdLine = cmdFd.read().replace("\x00", " ")[:cons.TK_MAX_CMD_SRCH] except Exception: # it's not possible to get executable, but we still cache the process exe = None # stat lcmpids += 1 # try next on any exception except Exception: # stats lpids += 1 # process not here anymore, move on continue # if we ar not running QC check, we cache it, else we make verifications if not qcChk: # cache it self._cachedPids[self._PIDS][procId] = {self._UID: userId, self._EXE: exe, self._CMD: cmdLine, self._QCP: (self._QCP_V if exe is not None else 0), self._QCT: (self._QCT_V if exe is not None else 0), self._TERM: 0, self._TIM: self._cachedPids[self._TIM]} # stats apids += 1 else: # check if process changed uid / cmdline if self._cachedPids[self._PIDS][procId][self._UID] != userId or self._cachedPids[self._PIDS][procId][self._EXE] != exe: # log log.log(cons.TK_LOG_LEVEL_DEBUG, "WARNING: uid/executable changes, uid: %s -> %s, executable: \"%s\" -> \"%s\"" % (self._cachedPids[self._PIDS][procId][self._UID], userId, self._cachedPids[self._PIDS][procId][self._EXE], exe)) # save previous user id prevUserId = self._cachedPids[self._PIDS][procId][self._UID] # adjust new values self._cachedPids[self._PIDS][procId][self._UID] = userId self._cachedPids[self._PIDS][procId][self._EXE] = exe self._cachedPids[self._PIDS][procId][self._CMD] = cmdLine # if process has changed, we do not verify it anymore self._cachedPids[self._PIDS][procId][self._QCP] = 0 self._cachedPids[self._PIDS][procId][self._QCT] = 0 # flag that this is changed processChanged = True # stats ccmpids += 1 else: # nothing here continue # we have user (or process changed and we have to update processes / matches) if (userId is not None and not qcChk) or processChanged: # handle case when uid becomes None from existing if userId != prevUserId and prevUserId is not None: # remove from user pids if procId in self._cachedPids[self._USRS][prevUserId][self._PIDS]: # remove self._cachedPids[self._USRS][prevUserId][self._PIDS].remove(procId) # remove from matched pids if procId in self._cachedPids[self._USRS][prevUserId][self._MPIDS]: # remove self._cachedPids[self._USRS][prevUserId][self._MPIDS].remove(procId) # only if user is specified if userId is not None: # manage pids for users self._cachedPids[self._USRS][userId][self._PIDS].add(procId) # verify whether this cmdline matches any of the filters user set up for rFlt in self._cachedPids[self._USRS][userId][self._FLTS]: # matched pids matchedPids = self._getMatchedProcessesByFilter(userId, self._cachedPids[self._USRS][userId][self._FLTS][rFlt], set([procId])) # match and add to user matched pids for rPid in matchedPids: # add to user pids self._cachedPids[self._USRS][userId][self._MPIDS].add(rPid) # stats ampids += 1 # take care of removing the disapeared pids pids = [rPid for rPid in self._cachedPids[self._PIDS] if self._cachedPids[self._TIM] != self._cachedPids[self._PIDS][rPid][self._TIM]] # remove items for rPid in pids: # pid uid = self._cachedPids[self._PIDS][rPid][self._UID] # uid found if uid is not None: # remove it from user pids self._cachedPids[self._USRS][uid][self._PIDS].remove(rPid) # remove it from user pids that matched filters if rPid in self._cachedPids[self._USRS][uid][self._MPIDS]: # remove self._cachedPids[self._USRS][uid][self._MPIDS].remove(rPid) # remove self._cachedPids[self._PIDS].pop(rPid) # stats rpids += len(pids) # extra log if log.getLogLevel() == cons.TK_LOG_LEVEL_EXTRA_DEBUG: # users for rUser in self._cachedPids[self._USRS]: # print processes log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "PT, user: %s, processes: %i, match: %i" % (rUser, len(self._cachedPids[self._USRS][rUser][self._PIDS]), len(self._cachedPids[self._USRS][rUser][self._MPIDS]))) log.log(cons.TK_LOG_LEVEL_DEBUG, "PT stats, users: %i, cache: %i, add: %i, rm: %i, lost: %i, nocmd: %i, qc: %i, changed: %i, admatch: %i" % (len(self._cachedPids[self._USRS]), cpids, apids, rpids, lpids, lcmpids, qcpids, ccmpids, ampids)) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish cachePlayTimeProcesses") def _scheduleKill(self, pPid, pKill): # kill process try: # if trying to terminate if not pKill: # logging log.log(cons.TK_LOG_LEVEL_INFO, "sending terminate signal to process %s" % (pPid)) # terminate psutil.Process(pid=int(pPid)).terminate() # now just kill else: # logging log.log(cons.TK_LOG_LEVEL_INFO, "sending kill signal to process %s" % (pPid)) # kill psutil.Process(pid=int(pPid)).kill() except: # error in killing does not matter pass def processPlayTimeActivities(self): """This is the main process to take care of PT processes""" # cache processes self._cachePlayTimeProcesses() def verifyPlayTimeActive(self, pUid, pUname, pSilent=False): """Return whether PlayTime is active, i.e. offending process is running""" # if we have user if pUid in self._cachedPids[self._USRS]: # extra log if not pSilent and log.getLogLevel() == cons.TK_LOG_LEVEL_DEBUG: # logging log.log(cons.TK_LOG_LEVEL_DEBUG, "PT: user \"%s\" (%s) has %i matching processes out of %i, using %i filters" % (pUname, pUid, len(self._cachedPids[self._USRS][pUid][self._MPIDS]), len(self._cachedPids[self._USRS][pUid][self._PIDS]), len(self._cachedPids[self._USRS][pUid][self._FLTS]))) # result return True if self._cachedPids[self._USRS][pUid][self._MPIDS] else False else: # result return False def processPlayTimeFilters(self, pUid, pFlts): """Add, modify, delete user process filters""" # if we do not have a user yet if pUid not in self._cachedPids[self._USRS]: # initialize set self._initUserData(str(pUid)) # the logic here is that we need to remove obsolete first and add the rest later # this is due to user may enter filters in a way that process matches more than one filter # therefore not to loose processes, this order is important newFlts = set([rFlt[0] for rFlt in pFlts]) existFlts = set([rFlt for rFlt in self._cachedPids[self._USRS][pUid][self._FLTS]]) # remove obsolete filters for rFlt in existFlts: # if this is obsolete if rFlt not in newFlts: # now remove processes associated with filter for rPid in self._getMatchedProcessesByFilter(pUid, self._cachedPids[self._USRS][pUid][self._FLTS][rFlt], self._cachedPids[self._USRS][pUid][self._MPIDS]): # remove pids self._cachedPids[self._USRS][pUid][self._MPIDS].remove(rPid) # remove filter self._cachedPids[self._USRS][pUid][self._FLTS].pop(rFlt) # process filters for rFlt in newFlts: # if filter does not exist, we need to add it if rFlt not in existFlts: # filter does not exist, we need to add it self._cachedPids[self._USRS][pUid][self._FLTS][rFlt] = [] # firstly check if regexp is valid, in case someone will not enter it correclty (probably by mistake) try: # if this succeeds then match is valid re.compile("^%s$" % (rFlt)) # filter as is flt = rFlt except re.error: # it failed, so we do escape and that's our pattern flt = re.escape(rFlt) # remove brackets "[]" because we use them as description flt = flt.replace("[", "").replace("]", "") # add precompiled filters self._cachedPids[self._USRS][pUid][self._FLTS][rFlt].append(re.compile("^%s$" % (flt))) self._cachedPids[self._USRS][pUid][self._FLTS][rFlt].append(re.compile("[/\\\\]%s$" % (flt))) self._cachedPids[self._USRS][pUid][self._FLTS][rFlt].append(re.compile("[/\\\\]%s " % (flt))) # add matched pids to to matched pid list self._cachedPids[self._USRS][pUid][self._MPIDS].update(self._getMatchedProcessesByFilter(pUid, self._cachedPids[self._USRS][pUid][self._FLTS][rFlt], self._cachedPids[self._USRS][pUid][self._PIDS])) def killPlayTimeProcesses(self, pUid): """Kill all PT processes""" # if we have user if pUid in self._cachedPids[self._USRS]: # logging log.log(cons.TK_LOG_LEVEL_INFO, "killing %i PT processes for uid \"%s\" " % (len(self._cachedPids[self._USRS][pUid][self._MPIDS]), pUid)) # terminate / kill all user PT processes for rPid in self._cachedPids[self._USRS][pUid][self._MPIDS]: # increase terminate attempts self._cachedPids[self._PIDS][rPid][self._TERM] += 1 # schedule a terminate / kill (first we try to terminate and later we just kill) GLib.timeout_add_seconds(0.1, self._scheduleKill, rPid, True if self._cachedPids[self._PIDS][rPid][self._TERM] > cons.TK_POLLTIME else False) # --------------- helper methods --------------- # def getCachedProcesses(self): """Get all cached processes""" proc = [[rPid, self._cachedPids[self._PIDS][rPid][self._EXE], self._cachedPids[self._PIDS][rPid][self._CMD]] for rPid in self._cachedPids[self._PIDS]] return proc def getCachedUserProcesses(self, pUserId): """Get processes, that are cached for user""" if pUserId in self._cachedPids[self._USRS]: proc = [[rPid, self._cachedPids[self._PIDS][rPid][self._EXE], self._cachedPids[self._PIDS][rPid][self._CMD]] for rPid in self._cachedPids[self._USRS][pUserId][self._PIDS]] else: proc = [] return proc def getMatchedUserProcesses(self, pUserId): """Get processes, that are cached for user and matches at least one filter""" if pUserId in self._cachedPids[self._USRS]: proc = [[rPid, self._cachedPids[self._PIDS][rPid][self._EXE], self._cachedPids[self._PIDS][rPid][self._CMD]] for rPid in self._cachedPids[self._USRS][pUserId][self._MPIDS]] else: proc = [] return proc def getMatchedUserProcessCnt(self, pUserId): """Get process count, that are cached for user and matches at least one filter""" if pUserId in self._cachedPids[self._USRS]: procCnt = len(self._cachedPids[self._USRS][pUserId][self._MPIDS]) else: procCnt = 0 return procCnt timekpr-next/server/user/__init__.py000664 001750 001750 00000000000 13476006650 021567 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/000775 001750 001750 00000000000 13476006650 020452 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/dbus/000775 001750 001750 00000000000 14064575714 021415 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/dbus/consolekit/000775 001750 001750 00000000000 14017261747 023563 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/dbus/consolekit/user.py000664 001750 001750 00000001370 14017261747 025114 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # connection with ck class timekprUserManager(object): # init def __init__(self, pUserName, pUserPathOnBus): """Initialize manager for ConsoleKit.""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") def cacheUserSessionList(self): """Determine user sessions and cache session objects for further reference.""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") def isUserActive(self, pSessionTypes, pTrackInactive, pIsScreenLocked): """Check if user is active.""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") timekpr-next/server/interface/dbus/consolekit/__init__.py000664 001750 001750 00000000000 13476006650 025660 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/dbus/consolekit/manager.py000664 001750 001750 00000002513 14017261747 025550 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # connection with ck class timekprUserLoginManager(object): """Class enables the connection with ConsoleKit""" def __init__(self): """Initialize all stuff for consolekit""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") def getUserList(self, pSilent=False): """Go through a list of logged in users""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") def getUserSessionList(self, pUserName, pUserPath): """Get up-to-date user session list""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") def determineLoginManagerVT(self, pUserName, pUserPath): """Get login manager session VTNr""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") def switchTTY(self, pSeatId, pSessionTTY): """Swith TTY for login screen""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") def terminateUserSessions(self, pUserName, pUserPath, pTimekprConfig): """Terminate user sessions""" # NOT IMPLEMENTED raise NotImplementedError("ConsoleKit support is not implemented") timekpr-next/server/interface/dbus/daemon.py000664 001750 001750 00000213431 14064575714 023236 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # import section import os from gi.repository import GLib from dbus.mainloop.glib import DBusGMainLoop import dbus.service import time import threading import traceback from datetime import datetime, timedelta # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.server.interface.dbus.logind import manager as l1_manager from timekpr.common.utils.config import timekprConfig from timekpr.common.utils import misc from timekpr.server.user.userdata import timekprUser from timekpr.server.user.playtime import timekprPlayTimeConfig from timekpr.server.config.configprocessor import timekprUserConfigurationProcessor from timekpr.server.config.configprocessor import timekprConfigurationProcessor from timekpr.server.config.userhelper import timekprUserStore from timekpr.server.config import userhelper from timekpr.common.constants import messages as msg # default dbus DBusGMainLoop(set_as_default=True) class timekprDaemon(dbus.service.Object): """Main daemon class""" # --------------- initialization / control methods --------------- # def __init__(self): """Initialize daemon variables""" log.log(cons.TK_LOG_LEVEL_INFO, "start init dbus daemon") # get our bus self._timekprBus = (dbus.SessionBus() if (cons.TK_DEV_ACTIVE and cons.TK_DEV_BUS == "ses") else dbus.SystemBus()) # get our bus name (where clients will find us) self._timekprBusName = dbus.service.BusName(cons.TK_DBUS_BUS_NAME, bus=self._timekprBus, replace_existing=True) # init DBUS super().__init__(self._timekprBusName, cons.TK_DBUS_SERVER_PATH) log.log(cons.TK_LOG_LEVEL_INFO, "finish init dbus daemon") def initTimekpr(self): """Init all the required attributes""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start init daemon data") # ## variables ## # init main loop self._timekprMainLoop = GLib.MainLoop() # init termination trigger self._finishExecution = False # this will define login manager self._timekprLoginManagerName = "L1" # this will define login manager self._timekprLoginManager = None # this will define main timekpr configuration loader self._timekprConfig = None # this will hold all timekpr users (collection of user class) self._timekprUserList = {} # this will hold collection of users to be terminated self._timekprUserTerminationList = {} # this will hold collection of users who have restrictions to use computer self._timekprUserRestrictionList = {} # PlayTime config self._timekprPlayTimeConfig = None # ## initialization ## # configuration init self._timekprConfig = timekprConfig() self._timekprConfig.loadMainConfiguration() # init logging log.setLogging(self._timekprConfig.getTimekprLogLevel(), self._timekprConfig.getTimekprLogfileDir(), cons.TK_LOG_OWNER_SRV, "") # in case we are dealing with logind if self._timekprLoginManagerName == "L1": self._timekprLoginManager = l1_manager.timekprUserLoginManager() # in case we are dealing with consolekit (WHICH IS NOT IMPLEMENTED YET and might NOT be AT ALL) elif self._timekprLoginManagerName == "CK": self._timekprLoginManager = None # PT config self._timekprPlayTimeConfig = timekprPlayTimeConfig(self._timekprConfig) log.log(cons.TK_LOG_LEVEL_DEBUG, "finish init daemon data") def finishTimekpr(self, signal=None, frame=None): """Exit timekpr gracefully""" # show all threads that we are exiting self._finishExecution = True # exit main loop self._timekprMainLoop.quit() log.log(cons.TK_LOG_LEVEL_INFO, "main loop shut down") def executeTimekprMain(self): """Start up main loop""" log.log(cons.TK_LOG_LEVEL_INFO, "start up main loop thread") # wrap in handlers, so we can finish gracefully try: self._timekprMainLoop.run() except KeyboardInterrupt: log.log(cons.TK_LOG_LEVEL_INFO, "asking everything to shut down") # set up finishing flag self.finishTimekpr() # finish logging log.flushLogFile() def executeTimekprWorker(self): """Execute all the logic of timekpr""" log.log(cons.TK_LOG_LEVEL_INFO, "start up worker thread") # def execLen = timedelta(0, 0, 0) execCnt = 0 # we execute tasks until not asked to stop while not self._finishExecution: # perf dtsm = time.time() dts = datetime.now() log.log(cons.TK_LOG_LEVEL_INFO, "--- start working on users ---") # do the actual work try: self.checkUsers() except Exception: log.log(cons.TK_LOG_LEVEL_INFO, "---=== ERROR working on users ===---") log.log(cons.TK_LOG_LEVEL_INFO, traceback.format_exc()) log.log(cons.TK_LOG_LEVEL_INFO, "---=== ERROR working on users ===---") # periodically flush the file log.autoFlushLogFile() # perf lavg = os.getloadavg() perf = datetime.now() - dts execCnt += 1 execLen += perf log.log(cons.TK_LOG_LEVEL_INFO, "--- end working on users (ela: %s) ---" % (str(perf))) log.log(cons.TK_LOG_LEVEL_DEBUG, "--- perf: avg ela: %s, loadavg: %s, %s, %s ---" % (str(execLen/execCnt), lavg[0], lavg[1], lavg[2])) # take a polling pause (try to do that exactly every 3 secs) time.sleep(self._timekprConfig.getTimekprPollTime() - min(time.time() - dtsm, self._timekprConfig.getTimekprPollTime() / 2)) log.log(cons.TK_LOG_LEVEL_INFO, "worker shut down") # finish logging log.flushLogFile() def startTimekprDaemon(self): """Enable threading for all the tasks""" log.log(cons.TK_LOG_LEVEL_INFO, "start daemons") # set up main loop self._timekprMainLoopTh = threading.Thread(target=self.executeTimekprMain) # set up worker self._timekprWorkTh = threading.Thread(target=self.executeTimekprWorker) # start both self._timekprMainLoopTh.start() self._timekprWorkTh.start() log.log(cons.TK_LOG_LEVEL_INFO, "finish daemons, timekpr started") # --------------- worker methods --------------- # def checkUsers(self): """Entry point for user management logic""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start checkUsers") # get user list wasConnectionLost, userList = self._timekprLoginManager.getUserList() # if we had a disaster, remove all users because connection to DBUS was lost if wasConnectionLost: # logging log.log(cons.TK_LOG_LEVEL_INFO, "IMPORTANT WARNING: due to lost DBUS connection, all users are de-initialized (including from DBUS) and re-initalized from saved state") # remove them from dbus for rUser in self._timekprUserList: # remove from DBUS self._timekprUserList[rUser].deInitUser() # delete all users self._timekprUserList.clear() # delete termination list as well self._timekprUserRestrictionList.clear() # if global switch is enabled, we need to refresh processes at some iterval (method determines that by itself) if self._timekprConfig.getTimekprPlayTimeEnabled(): # refresh PT process list self._timekprPlayTimeConfig.processPlayTimeActivities() # add new users to track for rUserName, userDict in userList.items(): # login manager is system user, we do these checks only for system users if not userhelper.verifyNormalUserID(userDict[cons.TK_CTRL_UID]): # sys user log.log(cons.TK_LOG_LEVEL_DEBUG, "NOTE: system user \"%s\" explicitly excluded" % (rUserName)) # try to get login manager VT (if not already found) self._timekprLoginManager.determineLoginManagerVT(rUserName, userDict[cons.TK_CTRL_UPATH]) # if username is in exclusion list, additionally verify that username is not a sysuser / login manager (this is somewhat obsolete now) elif rUserName in self._timekprConfig.getTimekprUsersExcl() and rUserName not in userhelper.getTimekprLoginManagers(): log.log(cons.TK_LOG_LEVEL_DEBUG, "NOTE: user \"%s\" explicitly excluded" % (rUserName)) # if not in, we add it elif rUserName not in self._timekprUserList: log.log(cons.TK_LOG_LEVEL_DEBUG, "NOTE: we have a new user \"%s\"" % (rUserName)) # add user self._timekprUserList[rUserName] = timekprUser( self._timekprBusName, userDict[cons.TK_CTRL_UID], userDict[cons.TK_CTRL_UNAME], userDict[cons.TK_CTRL_UPATH], self._timekprConfig, self._timekprPlayTimeConfig ) # init variables for user self._timekprUserList[rUserName].refreshTimekprRuntimeVariables() # adjust config self._timekprUserList[rUserName].adjustLimitsFromConfig() # adjust time spent self._timekprUserList[rUserName].adjustTimeSpentFromControl() # session list to remove removableUsers = [rUserName for rUserName in self._timekprUserList if rUserName not in userList] # get rid of users which left for rUserName in removableUsers: log.log(cons.TK_LOG_LEVEL_INFO, "NOTE: user \"%s\" has gone" % (rUserName)) # save everything for the user self._timekprUserList[rUserName].saveSpent() self._timekprUserList[rUserName].deInitUser() # delete users that left self._timekprUserList.pop(rUserName) # remove if exists if rUserName in self._timekprUserRestrictionList: # delete from killing list as well self._timekprUserRestrictionList.pop(rUserName) # go through all users for rUserName in self._timekprUserList: # init variables for user self._timekprUserList[rUserName].refreshTimekprRuntimeVariables() # adjust time spent userActiveEffective, userActiveActual, userScreenLocked = self._timekprUserList[rUserName].adjustTimeSpentActual(self._timekprConfig) # recalculate time left self._timekprUserList[rUserName].recalculateTimeLeft() # process actual user session variable validation self._timekprUserList[rUserName].revalidateUserSessionAttributes() # get stats for user timeLeftArray = self._timekprUserList[rUserName].getTimeLeft() timeLeftToday = timeLeftArray[0] timeLeftInARow = timeLeftArray[1] timeHourUnaccounted = timeLeftArray[6] timePTActivityCnt = 0 # PlayTime left validation if self._timekprConfig.getTimekprPlayTimeEnabled(): # get time left for PLayTime timeLeftPT, isPTEnabled, isPTAccounted, isPTActive = self._timekprUserList[rUserName].getPlayTimeLeft() # enabled and active for user if isPTEnabled and isPTActive: # if there is no time left (compare to almost ultimate answer) # or hour is unaccounted and PT is not allowed in those hours if (isPTAccounted and timeLeftPT < 0.0042) or (timeHourUnaccounted and not self._timekprUserList[rUserName].getUserPlayTimeUnaccountedIntervalsEnabled()): # killing processes self._timekprPlayTimeConfig.killPlayTimeProcesses(self._timekprUserList[rUserName].getUserId()) else: # active count timePTActivityCnt = self._timekprPlayTimeConfig.getMatchedUserProcessCnt(self._timekprUserList[rUserName].getUserId()) # set process count (in case PT was disable in-flight or it has changed) self._timekprUserList[rUserName].setPlayTimeActiveActivityCnt(timePTActivityCnt) # logging log.log(cons.TK_LOG_LEVEL_DEBUG, "user \"%s\", active: %s/%s/%s (act/eff/lck), huacc: %s, tleft: %i" % (rUserName, str(userActiveActual), str(userActiveEffective), str(userScreenLocked), str(timeHourUnaccounted), timeLeftInARow)) # process actions if user is in the restrictions list if rUserName in self._timekprUserRestrictionList: # (internal idle killing switch) + user is not active + there is a time available today (opposing to in a row) if ((not userActiveActual and timeLeftToday > self._timekprConfig.getTimekprTerminationTime()) or timeHourUnaccounted) and self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] in (cons.TK_CTRL_RES_T, cons.TK_CTRL_RES_D): log.log(cons.TK_LOG_LEVEL_INFO, "SAVING user \"%s\" from ending his sessions / shutdown" % (rUserName)) # remove from death list self._timekprUserRestrictionList.pop(rUserName) # if restricted time has passed for hard restrictions, we need to lift the restriction elif (timeLeftInARow > self._timekprConfig.getTimekprTerminationTime() or timeHourUnaccounted) and self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] in (cons.TK_CTRL_RES_T, cons.TK_CTRL_RES_D): log.log(cons.TK_LOG_LEVEL_INFO, "RELEASING terminate / shutdown from user \"%s\"" % (rUserName)) # remove from restriction list self._timekprUserRestrictionList.pop(rUserName) # if restricted time has passed for soft restrictions, we need to lift the restriction elif (timeLeftInARow > self._timekprConfig.getTimekprTerminationTime() or timeHourUnaccounted) and self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] in (cons.TK_CTRL_RES_L, cons.TK_CTRL_RES_S, cons.TK_CTRL_RES_W): log.log(cons.TK_LOG_LEVEL_INFO, "RELEASING lock / suspend from user \"%s\"" % (rUserName)) # remove from restriction list self._timekprUserRestrictionList.pop(rUserName) # update restriction stats else: # update active states for restriction routines self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USACT] = userActiveActual self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USLCK] = userScreenLocked self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] = max(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] - 1, 0) # only if user is active / screen is not locked if ((userActiveActual and self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] in (cons.TK_CTRL_RES_T, cons.TK_CTRL_RES_D)) or (not userScreenLocked and self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] in (cons.TK_CTRL_RES_S, cons.TK_CTRL_RES_L, cons.TK_CTRL_RES_W))): # update active states for restriction routines self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL] = max(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL] - 1, 0) # ## FILL IN USER RESTRICTIONS ## # if user has very few time left, we need to enforce limits: Lock screen / Sleep computer / Shutdown computer / Terminate sessions if timeLeftInARow <= self._timekprConfig.getTimekprTerminationTime() and not timeHourUnaccounted and rUserName not in self._timekprUserRestrictionList and userActiveActual: log.log(cons.TK_LOG_LEVEL_DEBUG, "INFO: user \"%s\" has got restrictions..." % (rUserName)) # add user to restrictions list self._timekprUserRestrictionList[rUserName] = { cons.TK_CTRL_UPATH: self._timekprUserList[rUserName].getUserPathOnBus(), # user path on dbus cons.TK_CTRL_FCNTD: max(timeLeftInARow, self._timekprConfig.getTimekprTerminationTime()), # final countdown cons.TK_CTRL_RESTY: self._timekprUserList[rUserName].getUserLockoutType(), # restricton type: lock, suspend, suspendwake, terminate, shutdown cons.TK_CTRL_RTDEL: 0, # retry delay before next attempt to enforce restrictions cons.TK_CTRL_RTDEA: 0, # retry delay (additional delay for lock in case of suspend) cons.TK_CTRL_USACT: userActiveActual, # whether user is actually active cons.TK_CTRL_USLCK: userScreenLocked, # whether user screen is locked cons.TK_CTRL_USWKU: self._timekprUserList[rUserName].findNextAvailableIntervalStart() if self._timekprUserList[rUserName].getUserLockoutType() == cons.TK_CTRL_RES_W and timeLeftToday > timeLeftInARow else None } # in case this is first restriction we need to initiate restriction process if len(self._timekprUserRestrictionList) == 1: # process users GLib.timeout_add_seconds(1, self._restrictUsers) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish checkUsers") def _restrictUsers(self): """Terminate user sessions""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start user killer") # loop through users to be killed for rUserName in self._timekprUserRestrictionList: # ## check which restriction is needed ## # we are going to TERMINATE user sessions if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] in (cons.TK_CTRL_RES_T, cons.TK_CTRL_RES_D): # log that we are going to terminate user sessions if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL] <= 0: log.log(cons.TK_LOG_LEVEL_INFO, "%s approaching in %s secs" % ("TERMINATE" if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] == cons.TK_CTRL_RES_T else "SHUTDOWN", str(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD]))) # send messages only when certain time is left if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD] <= self._timekprConfig.getTimekprFinalWarningTime(): # final warning self._timekprUserList[rUserName].processFinalWarning(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY], self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD]) # time to die if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD] <= 0: # set restriction for repetitive kill self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL] = cons.TK_CTRL_LCDEL * 5 # save user before kill self._timekprUserList[rUserName].saveSpent() # terminate user sessions try: # term if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] == cons.TK_CTRL_RES_T: # terminate self._timekprLoginManager.terminateUserSessions(rUserName, self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_UPATH], self._timekprConfig) # shut elif self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] == cons.TK_CTRL_RES_D: # shutdown self._timekprLoginManager.shutdownComputer(rUserName) except Exception: log.log(cons.TK_LOG_LEVEL_INFO, "ERROR killing sessions: %s" % (traceback.format_exc())) # we are going to LOCK user sessions elif self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] == cons.TK_CTRL_RES_L: # is user active isUserInactive = (not self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USACT] or self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USLCK]) # check if user has locked the screen if isUserInactive and self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] <= 0: # we are going lock user sessions log.log(cons.TK_LOG_LEVEL_INFO, "time is up, but user \"%s\" not active, not enforcing the lock" % (rUserName)) # set restriction for repetitive lock self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] = cons.TK_CTRL_LCDEL # lock must be enforced only if user is active elif not isUserInactive: # continue if there is no delay if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] <= 0: # log log.log(cons.TK_LOG_LEVEL_INFO, "LOCK approaching in %s secs" % (str(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD]))) # send messages only when certain time is left if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD] <= self._timekprConfig.getTimekprFinalWarningTime(): # final warning self._timekprUserList[rUserName].processFinalWarning(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY], self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD]) # time to lock if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD] <= 0: # set restriction for repetitive lock self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] = cons.TK_CTRL_LCDEL # log lock log.log(cons.TK_LOG_LEVEL_INFO, "time is up for user \"%s\", enforcing the LOCK" % (rUserName)) # lock computer self._timekprUserList[rUserName].lockUserSessions() # we are going to SUSPEND user sessions elif self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY] in (cons.TK_CTRL_RES_S, cons.TK_CTRL_RES_W): # is user active isUserInactive = (not self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USACT] or self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USLCK]) # check if user has locked the screen if isUserInactive and self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] <= 0: # we are going lock user sessions log.log(cons.TK_LOG_LEVEL_INFO, "time is up, but user \"%s\" not active, not enforcing the suspend" % (rUserName)) # set restriction for repetitive lock when suspending self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] = cons.TK_CTRL_LCDEL # suspend / lock must be enforced only if user is active elif not isUserInactive: # continue if there is no delay if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL] <= 0: # log log.log(cons.TK_LOG_LEVEL_INFO, "SUSPEND approaching in %s secs" % (str(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD]))) # send messages only when certain time is left if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD] <= self._timekprConfig.getTimekprFinalWarningTime(): # final warning self._timekprUserList[rUserName].processFinalWarning(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RESTY], self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD]) # time to suspend if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD] <= 0: # check if we have a delay before initiating actions if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL] <= 0: # log suspend log.log(cons.TK_LOG_LEVEL_INFO, "time is up for user \"%s\", enforcing the SUSPEND" % (rUserName)) # set restriction for repetitive lock when suspending self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] = cons.TK_CTRL_LCDEL # set restriction for repetitive suspend self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL] = cons.TK_CTRL_SCDEL # set up wake time if that was set if self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USWKU] is not None: # set up if userhelper.setWakeUpByRTC(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USWKU]): log.log(cons.TK_LOG_LEVEL_INFO, "wake up time is SET at %i (%s) on behalf of user \"%s\"" % (self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USWKU], datetime.fromtimestamp(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USWKU]).strftime(cons.TK_LOG_DATETIME_FORMAT), rUserName)) else: log.log(cons.TK_LOG_LEVEL_INFO, "wake up time at %i (%s) could NOT be set on behalf of user \"%s\"" % (self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USWKU], datetime.fromtimestamp(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_USWKU]).strftime(cons.TK_LOG_DATETIME_FORMAT), rUserName)) # suspend computer self._timekprLoginManager.suspendComputer(rUserName) # do not enforce lock right away after suspend, wait a little elif cons.TK_CTRL_SCDEL - cons.TK_CTRL_LCDEL > self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL] > 0 and self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] <= 0: # log suspend lock log.log(cons.TK_LOG_LEVEL_INFO, "time is up for user \"%s\", enforcing the SUSPEND LOCK (SUSPEND in %i iterations)" % (rUserName, self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEL])) # set restriction for repetitive lock when suspending self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_RTDEA] = cons.TK_CTRL_LCDEL # if delay is still in place, just lock the screen self._timekprUserList[rUserName].lockUserSessions() # decrease time for restrictions self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD] = max(self._timekprUserRestrictionList[rUserName][cons.TK_CTRL_FCNTD] - 1, 0) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish user killer") # return whether to keep trying to enforce restrictions return len(self._timekprUserRestrictionList) > 0 # --------------- helper methods --------------- # def _getUserActualTimeInformation(self, pTimekprUser, pUserConfigurationStore): """Helper to provide actual (in memory information)""" # values from live session if pTimekprUser is not None: # get lefts timeLeftArray = pTimekprUser.getTimeLeft() # assign time lefts timeLeftToday = timeLeftArray[0] timeLeftInARow = timeLeftArray[1] timeSpentThisSession = timeLeftArray[2] timeInactiveThisSession = timeLeftArray[3] timeSpentBalance = timeLeftArray[4] timeSpentDay = timeLeftArray[5] # time spent session pUserConfigurationStore["ACTUAL_TIME_SPENT_SESSION"] = int(timeSpentThisSession) # time inactive this session pUserConfigurationStore["ACTUAL_TIME_INACTIVE_SESSION"] = int(timeInactiveThisSession) # time spent pUserConfigurationStore["ACTUAL_TIME_SPENT_BALANCE"] = int(timeSpentBalance) # time spent pUserConfigurationStore["ACTUAL_TIME_SPENT_DAY"] = int(timeSpentDay) # time left today pUserConfigurationStore["ACTUAL_TIME_LEFT_DAY"] = int(timeLeftToday) # time left in a row pUserConfigurationStore["ACTUAL_TIME_LEFT_CONTINUOUS"] = int(timeLeftInARow) # PlayTime playTimeLeft, playTimeEnabled, playTimeAccounted, _unused = pTimekprUser.getPlayTimeLeft(pCheckActive=False) playTimeLeft = max(playTimeLeft, 0) if playTimeEnabled and playTimeAccounted else 0 # PlayTime left today pUserConfigurationStore["ACTUAL_PLAYTIME_LEFT_DAY"] = playTimeLeft # active PlayTime activity count pUserConfigurationStore["ACTUAL_ACTIVE_PLAYTIME_ACTIVITY_COUNT"] = pTimekprUser.getPlayTimeActiveActivityCnt() # ## --------------- DBUS / communication methods --------------- ## # # --------------- simple user time limits methods accessible by any --------------- # @dbus.service.method(cons.TK_DBUS_USER_LIMITS_INTERFACE, in_signature="s", out_signature="is") def requestTimeLimits(self, pUserName): """Request to send config to client (returns error in case no user and the like)""" # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_USER_NOTFOUND") % (pUserName) # check if we have this user if pUserName in self._timekprUserList: # pass this to actual method self._timekprUserList[pUserName].getTimeLimits() # result result = 0 message = "" # result return result, message @dbus.service.method(cons.TK_DBUS_USER_LIMITS_INTERFACE, in_signature="s", out_signature="is") def requestTimeLeft(self, pUserName): """Request to send current state of time & limits for user (returns error in case no user and the like)""" # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_USER_NOTFOUND") % (pUserName) # check if we have this user if pUserName in self._timekprUserList: # pass this to actual method self._timekprUserList[pUserName].getTimeLeft(True) # result result = 0 message = "" # result return result, message # --------------- simple user session attributes accessible by any --------------- # @dbus.service.method(cons.TK_DBUS_USER_SESSION_ATTRIBUTE_INTERFACE, in_signature="ssss", out_signature="is") def processUserSessionAttributes(self, pUserName, pWhat, pKey, pValue): """Request to verify or set user session attributes (returns error in case no user and the like)""" # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_USER_NOTFOUND") % (pUserName) # check if we have this user if pUserName in self._timekprUserList: # pass this to actual method self._timekprUserList[pUserName].processUserSessionAttributes(pWhat, pKey, pValue) # result result = 0 message = "" # result return result, message # --------------- user information get methods accessible by privileged users (root and all in timekpr group) --------------- # @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="", out_signature="isaas") def getUserList(self): """Get user list and their time left""" """Sets allowed days for the user server expects only the days that are allowed, sorted in ascending order""" # result result = 0 message = "" userList = [] try: # init store timekprUStore = timekprUserStore() # check if we have this user userList = timekprUStore.getSavedUserList(self._timekprConfig.getTimekprConfigDir()) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_USERLIST_UNEXPECTED_ERROR") # result return result, message, userList @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="ss", out_signature="isa{sv}") def getUserInformation(self, pUserName, pInfoLvl): """Get user configuration (saved)""" """ this retrieves stored configuration and some realtime inforamation for the user""" # initialize username storage userConfigurationStore = {} result = 0 message = "" try: # only saved and full if pInfoLvl in (cons.TK_CL_INF_FULL, cons.TK_CL_INF_SAVED): # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message, userConfigurationStore = userConfigProcessor.getSavedUserInformation(pInfoLvl, pUserName in self._timekprUserList) # additionally, if realtime needed if pInfoLvl in (cons.TK_CL_INF_FULL, cons.TK_CL_INF_RT) and pUserName in self._timekprUserList: # get in-memory settings self._getUserActualTimeInformation(self._timekprUserList[pUserName], userConfigurationStore) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_USER_UNEXPECTED_ERROR") # result return result, message, userConfigurationStore # --------------- user admin methods accessible by privileged users (root and all in timekpr group) --------------- # @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sas", out_signature="is") def setAllowedDays(self, pUserName, pDayList): """Set up allowed days for the user""" """Sets allowed days for the user server expects only the days that are allowed, sorted in ascending order""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetAllowedDays(pDayList) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="ssa{sa{si}}", out_signature="is") def setAllowedHours(self, pUserName, pDayNumber, pHourList): """Set up allowed hours for the user""" """This sets allowed hours for user for particular day server expects only the hours that are needed, hours must be sorted in ascending order please note that this is using 24h format, no AM/PM nonsense expected minutes can be specified in brackets after hour, like: 16[00-45], which means until 16:45""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetAllowedHours(pDayNumber, pHourList) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sai", out_signature="is") def setTimeLimitForDays(self, pUserName, pDayLimits): """Set up new timelimits for each day for the user""" """This sets allowable time to user server always expects 7 limits, for each day of the week, in the list""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetTimeLimitForDays(pDayLimits) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sb", out_signature="is") def setTrackInactive(self, pUserName, pTrackInactive): """Set track inactive sessions for the user""" """This sets whether inactive user sessions are tracked true - logged in user is always tracked (even if switched to console or locked or ...) false - user time is not tracked if he locks the session, session is switched to another user, etc.""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetTrackInactive(True if bool(pTrackInactive) else False) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sb", out_signature="is") def setHideTrayIcon(self, pUserName, pHideTrayIcon): """Set hide tray icon for the user""" """This sets whether icon will be hidden from user true - icon and notifications are NOT shown to user false - icon and notifications are shown to user""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetHideTrayIcon(True if bool(pHideTrayIcon) else False) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="ssss", out_signature="is") def setLockoutType(self, pUserName, pLockoutType, pWakeFrom, pWakeTo): """Set restriction / lockout type for the user""" """Restricton / lockout types: lock - lock the screen suspend - suspend the computer suspendwake - suspend the computer and set wakeup timer terminate - terminate sessions (default)""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetLockoutType(pLockoutType, pWakeFrom, pWakeTo) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="si", out_signature="is") def setTimeLimitForWeek(self, pUserName, pTimeLimitWeek): """Set up new timelimit for week for the user""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetTimeLimitForWeek(pTimeLimitWeek) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="si", out_signature="is") def setTimeLimitForMonth(self, pUserName, pTimeLimitMonth): """Set up new timelimit for month for the user""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetTimeLimitForMonth(pTimeLimitMonth) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="ssi", out_signature="is") def setTimeLeft(self, pUserName, pOperation, pTimeLeft): """Set time left for today for the user""" """Sets time limits for user for this moment: if pOperation is "+" - more time left is addeed if pOperation is "-" time is subtracted if pOperation is "=" or empty, the time is set as it is""" try: # check the user and it's configuration userControlProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userControlProcessor.checkAndSetTimeLeft(pOperation, pTimeLeft) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustTimeSpentFromControl(pSilent=False, pPreserveSpent=(pOperation != "=")) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONTROL_UNEXPECTED_ERROR") # result return result, message # --------------- user PlayTime admin methods accessible by privileged users (root and all in timekpr group) --------------- # @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sb", out_signature="is") def setPlayTimeEnabled(self, pUserName, pPlayTimeEnabled): """Set whether PlayTime is enabled for the user""" """PlayTime enablement flag true - PlayTime is enabled false - PlayTime is disabled""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetPlayTimeEnabled(True if bool(pPlayTimeEnabled) else False) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sb", out_signature="is") def setPlayTimeLimitOverride(self, pUserName, pPlayTimeLimitOverride): """Set whether PlayTime override is enabled for the user""" """PlayTime override enablement flag true - PlayTime override is enabled false - PlayTime override is disabled""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetPlayTimeLimitOverride(True if bool(pPlayTimeLimitOverride) else False) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sb", out_signature="is") def setPlayTimeUnaccountedIntervalsEnabled(self, pUserName, pPlayTimeUnaccountedIntervalsEnabled): """Set whether PlayTime activities are allowed during unaccounted intervals for the user""" """PlayTime allowed during unaccounted intervals enablement flag true - PlayTime allowed during unaccounted intervals is enabled false - PlayTime allowed during unaccounted intervals is disabled""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetPlayTimeUnaccountedIntervalsEnabled(True if bool(pPlayTimeUnaccountedIntervalsEnabled) else False) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sas", out_signature="is") def setPlayTimeAllowedDays(self, pUserName, pPlayTimeAllowedDays): """Set up allowed PlayTime days for the user""" """Sets allowed PlayTime days for the user server expects only the days that are allowed, sorted in ascending order""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetPlayTimeAllowedDays(pPlayTimeAllowedDays) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="sai", out_signature="is") def setPlayTimeLimitsForDays(self, pUserName, pPlayTimeLimits): """Set up new PlayTime limits for each day for the user""" """This sets allowable PlayTime limits to user server always expects 7 limits, for each day of the week, in the list""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetPlayTimeLimitsForDays(pPlayTimeLimits) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="saas", out_signature="is") def setPlayTimeActivities(self, pUserName, pPlayTimeActivities): """Set up new PlayTime activities for the user""" """This sets PlayTime activities (executable masks) for the user""" try: # check the user and it's configuration userConfigProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userConfigProcessor.checkAndSetPlayTimeActivities(pPlayTimeActivities) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustLimitsFromConfig(False) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_USER_ADMIN_INTERFACE, in_signature="ssi", out_signature="is") def setPlayTimeLeft(self, pUserName, pOperation, pTimeLeft): """Set time left for today for the user""" """Sets time limits for user for this moment: if pOperation is "+" - more time left is addeed if pOperation is "-" time is subtracted if pOperation is "=" or empty, the time is set as it is""" try: # check the user and it's configuration userControlProcessor = timekprUserConfigurationProcessor(pUserName, self._timekprConfig) # load config result, message = userControlProcessor.checkAndSetPlayTimeLeft(pOperation, pTimeLeft) # check if we have this user if pUserName in self._timekprUserList: # inform the user immediately self._timekprUserList[pUserName].adjustTimeSpentFromControl(pSilent=False, pPreserveSpent=(pOperation != "=")) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONTROL_UNEXPECTED_ERROR") # result return result, message # --------------- server admin get methods accessible by privileged users (root and all in timekpr group) --------------- # @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="", out_signature="isa{sv}") def getTimekprConfiguration(self): """Get all timekpr configuration from server""" # default timekprConfig = {} try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message, timekprConfig = mainConfigurationProcessor.getSavedTimekprConfiguration() except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_UNEXPECTED_ERROR") # result return result, message, timekprConfig # --------------- server admin set methods accessible by privileged users (root and all in timekpr group) --------------- # @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="i", out_signature="is") def setTimekprLogLevel(self, pLogLevel): """Set the logging level for server""" """ restart needed to fully engage, but newly logged in users get logging properly""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprLogLevel(pLogLevel) # set in memory as well self._timekprConfig.setTimekprLogLevel(pLogLevel) # set it effective immediately log.setLogLevel(pLogLevel) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="i", out_signature="is") def setTimekprPollTime(self, pPollTimeSecs): """Set polltime for timekpr""" """ set in-memory polling time (this is the accounting precision of the time""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprPollTime(pPollTimeSecs) # set in memory as well self._timekprConfig.setTimekprPollTime(pPollTimeSecs) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="i", out_signature="is") def setTimekprSaveTime(self, pSaveTimeSecs): """Set save time for timekpr""" """Set the interval at which timekpr saves user data (time spent, etc.)""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprSaveTime(pSaveTimeSecs) # set in memory as well self._timekprConfig.setTimekprSaveTime(pSaveTimeSecs) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="b", out_signature="is") def setTimekprTrackInactive(self, pTrackInactive): """Set default value for tracking inactive sessions""" """Note that this is just the default value which is configurable at user level""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprTrackInactive(pTrackInactive) # set in memory as well self._timekprConfig.setTimekprTrackInactive(pTrackInactive) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="i", out_signature="is") def setTimekprTerminationTime(self, pTerminationTimeSecs): """Set up user termination time""" """ User temination time is how many seconds user is allowed in before he's thrown out This setting applies to users who log in at inappropriate time according to user config """ try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprTerminationTime(pTerminationTimeSecs) # set in memory as well self._timekprConfig.setTimekprTerminationTime(pTerminationTimeSecs) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="i", out_signature="is") def setTimekprFinalWarningTime(self, pFinalWarningTimeSecs): """Set up final warning time for users""" """ Final warning time is the countdown lenght (in seconds) for the user before he's thrown out""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprFinalWarningTime(pFinalWarningTimeSecs) # set in memory as well self._timekprConfig.setTimekprFinalWarningTime(pFinalWarningTimeSecs) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="i", out_signature="is") def setTimekprFinalNotificationTime(self, pFinalNotificationTimeSecs): """Set up final warning time for users""" """ Final warning time is the countdown lenght (in seconds) for the user before he's thrown out""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprFinalNotificationTime(pFinalNotificationTimeSecs) # set in memory as well self._timekprConfig.setTimekprFinalNotificationTime(pFinalNotificationTimeSecs) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="as", out_signature="is") def setTimekprSessionsCtrl(self, pSessionsCtrl): """Set accountable session types for users""" """ Accountable sessions are sessions which are counted as active, there are handful of them, but predefined""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprSessionsCtrl(pSessionsCtrl) # set in memory as well self._timekprConfig.setTimekprSessionsCtrl(pSessionsCtrl) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="as", out_signature="is") def setTimekprSessionsExcl(self, pSessionsExcl): """Set NON-accountable session types for users""" """ NON-accountable sessions are sessions which are explicitly ignored during session evaluation, there are handful of them, but predefined""" try: # result # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprSessionsExcl(pSessionsExcl) # set in memory as well self._timekprConfig.setTimekprSessionsExcl(pSessionsExcl) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="as", out_signature="is") def setTimekprUsersExcl(self, pUsersExcl): """Set excluded usernames for timekpr""" """ Excluded usernames are usernames which are excluded from accounting Pre-defined values containt all graphical login managers etc., please do NOT add actual end-users here, You can, but these users will never receive any notifications about time, icon will be in connecting state forever """ try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprUsersExcl(pUsersExcl) # set in memory as well self._timekprConfig.setTimekprUsersExcl(pUsersExcl) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="b", out_signature="is") def setTimekprPlayTimeEnabled(self, pPlayTimeEnabled): """Set whether PlayTime is enabled globally""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprPlayTimeEnabled(pPlayTimeEnabled) # set in memory as well self._timekprConfig.setTimekprPlayTimeEnabled(pPlayTimeEnabled) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="b", out_signature="is") def setTimekprPlayTimeEnhancedActivityMonitorEnabled(self, pPlayTimeAdvancedSearchEnabled): """Set whether PlayTime is enabled globally""" try: # check the configuration mainConfigurationProcessor = timekprConfigurationProcessor() # check and set config result, message = mainConfigurationProcessor.checkAndSetTimekprPlayTimeEnhancedActivityMonitorEnabled(pPlayTimeAdvancedSearchEnabled) # set in memory as well self._timekprConfig.setTimekprPlayTimeEnhancedActivityMonitorEnabled(pPlayTimeAdvancedSearchEnabled) except Exception as unexpectedException: # logging log.log(cons.TK_LOG_LEVEL_INFO, "Unexpected ERROR (%s): %s" % (misc.whoami(), str(unexpectedException))) # result result = -1 message = msg.getTranslation("TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR") # result return result, message # --------------- DBUS helper methods --------------- # @dbus.service.method(cons.TK_DBUS_ADMIN_INTERFACE, in_signature="s", out_signature="") def logCachedProcesses(self, pUserId): """Return cached PIDs and CMDLINEs""" # set up logging pids = self._timekprPlayTimeConfig.getCachedProcesses() log.log(cons.TK_LOG_LEVEL_INFO, "ALLPIDS (%i)" % (len(pids))) log.log(cons.TK_LOG_LEVEL_INFO, "----------------------------------------") for rPid in pids: log.log(cons.TK_LOG_LEVEL_INFO, rPid) pids = self._timekprPlayTimeConfig.getCachedUserProcesses(str(pUserId)) log.log(cons.TK_LOG_LEVEL_INFO, "USERPIDS (%i)" % (len(pids))) log.log(cons.TK_LOG_LEVEL_INFO, "----------------------------------------") for rPid in pids: log.log(cons.TK_LOG_LEVEL_INFO, rPid) pids = self._timekprPlayTimeConfig.getMatchedUserProcesses(str(pUserId)) log.log(cons.TK_LOG_LEVEL_INFO, "USERMATCHEDPIDS (%i)" % (len(pids))) log.log(cons.TK_LOG_LEVEL_INFO, "----------------------------------------") for rPid in pids: log.log(cons.TK_LOG_LEVEL_INFO, rPid) log.log(cons.TK_LOG_LEVEL_INFO, "----------------------------------------") timekpr-next/server/interface/dbus/logind/000775 001750 001750 00000000000 14064575714 022671 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/dbus/logind/user.py000664 001750 001750 00000032014 14064575714 024221 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018. @author: mjasnik """ # import section import dbus # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.common.utils import misc class timekprUserManager(object): """A connection with login1 and other DBUS servers.""" def __init__(self, pUserName, pUserPathOnBus): """Initialize manager.""" # save the bus and user self._timekprBus = dbus.SystemBus() self._userName = pUserName # dbus performance measurement misc.measureTimeElapsed(pStart=True) # get dbus object self._login1UserObject = self._timekprBus.get_object(cons.TK_DBUS_L1_OBJECT, pUserPathOnBus) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_L1_OBJECT, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # get dbus interface for properties self._login1UserInterface = dbus.Interface(self._login1UserObject, cons.TK_DBUS_PROPERTIES_INTERFACE) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_PROPERTIES_INTERFACE, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # user sessions & additional DBUS objects self._timekprUserSessions = {} self._timekprUserObjects = {} # get user ID self._userId = int(self._login1UserInterface.Get(cons.TK_DBUS_USER_OBJECT, "UID")) self._scrRetryCnt = 0 self._sessionLockedStateAvailable = None def cacheUserSessionList(self): """Determine user sessions and cache session objects for further reference.""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "---=== start cacheUserSessionList for \"%s\" ===---" % (self._userName)) # dbus performance measurement misc.measureTimeElapsed(pStart=True) # get all user sessions userSessions = self._login1UserInterface.Get(cons.TK_DBUS_USER_OBJECT, "Sessions") # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - getting sessions for \"%s\" took too long (%is)" % (cons.TK_DBUS_USER_OBJECT, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "got %i sessions: %s, start loop" % (len(userSessions), str(userSessions))) # init active sessions activeSessions = [] # go through all user sessions for rUserSession in userSessions: # sessionId & sessionPath on dbus sessionId = str(rUserSession[0]) sessionPath = str(rUserSession[1]) # save active sessions activeSessions.append(sessionId) # if we have not yet saved a user session, let's do that to improve interaction with dbus if sessionId not in self._timekprUserSessions: log.log(cons.TK_LOG_LEVEL_DEBUG, "adding session: %s, %s" % (sessionId, sessionPath)) # dbus performance measurement misc.measureTimeElapsed(pStart=True) # get object and interface to save it sessionObject = self._timekprBus.get_object(cons.TK_DBUS_L1_OBJECT, sessionPath) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_L1_OBJECT, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # get object and interface to save it sessionPropertiesInterface = dbus.Interface(sessionObject, cons.TK_DBUS_PROPERTIES_INTERFACE) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_PROPERTIES_INTERFACE, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # get dbus interface for Session sessionInterface = dbus.Interface(sessionObject, cons.TK_DBUS_SESSION_OBJECT) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_SESSION_OBJECT, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # cache sessions self._timekprUserSessions[sessionId] = {cons.TK_CTRL_DBUS_SESS_OBJ: sessionObject, cons.TK_CTRL_DBUS_SESS_IF: sessionInterface, cons.TK_CTRL_DBUS_SESS_PROP_IF: sessionPropertiesInterface, cons.TK_CTRL_DBUS_SESS_PROP: {}} # add static properties self._timekprUserSessions[sessionId][cons.TK_CTRL_DBUS_SESS_PROP]["VTNr"] = str(int(sessionPropertiesInterface.Get(cons.TK_DBUS_SESSION_OBJECT, "VTNr"))) self._timekprUserSessions[sessionId][cons.TK_CTRL_DBUS_SESS_PROP]["Seat"] = str(sessionPropertiesInterface.Get(cons.TK_DBUS_SESSION_OBJECT, "Seat")[0]) else: log.log(cons.TK_LOG_LEVEL_DEBUG, "session already cached: %s" % (sessionId)) # list of sessions to delete removableSesssions = [rUserSession for rUserSession in self._timekprUserSessions if rUserSession not in activeSessions] # get rid of sessions not on the list for userSession in removableSesssions: log.log(cons.TK_LOG_LEVEL_DEBUG, "removing session: %s" % (userSession)) self._timekprUserSessions.pop(userSession) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "---=== finish cacheUserSessionList for \"%s\" ===---" % (self._userName)) def isUserActive(self, pTimekprConfig, pTimekprUserConfig, pIsScreenLocked): """Check if user is active.""" log.log(cons.TK_LOG_LEVEL_DEBUG, "---=== start isUserActive for \"%s\" ===---" % (self._userName)) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "supported session types: %s" % (str(pTimekprConfig.getTimekprSessionsCtrl()))) # get all user sessions userState = str(self._login1UserInterface.Get(cons.TK_DBUS_USER_OBJECT, "State")) userIdleState = str(bool(self._login1UserInterface.Get(cons.TK_DBUS_USER_OBJECT, "IdleHint"))) log.log(cons.TK_LOG_LEVEL_DEBUG, "user stats, state: %s, idleState: %s" % (userState, userIdleState)) # cache sessions self.cacheUserSessionList() # to determine if user is active for all sessions: # session must not be "active" # idlehint must be true # special care must be taken for tty sessions # screenlocker status from user DBUS session # init active sessions userActive = userScreenLocked = False sessionLockedState = "False" # if user locked the computer if pIsScreenLocked and not pTimekprUserConfig.getUserTrackInactive(): # user is not active log.log(cons.TK_LOG_LEVEL_DEBUG, "session inactive (verified by user \"%s\" screensaver status), sessions won't be checked" % (self._userName)) else: # go through all user sessions for rSessionId in self._timekprUserSessions: # dbus performance measurement misc.measureTimeElapsed(pStart=True) sessionLockedState = "False" # get needed static properties sessionVTNr = self._timekprUserSessions[rSessionId][cons.TK_CTRL_DBUS_SESS_PROP]["VTNr"] # get needed properties sessionType = str(self._timekprUserSessions[rSessionId][cons.TK_CTRL_DBUS_SESS_PROP_IF].Get(cons.TK_DBUS_SESSION_OBJECT, "Type")) sessionState = str(self._timekprUserSessions[rSessionId][cons.TK_CTRL_DBUS_SESS_PROP_IF].Get(cons.TK_DBUS_SESSION_OBJECT, "State")) sessionIdleState = str(bool(self._timekprUserSessions[rSessionId][cons.TK_CTRL_DBUS_SESS_PROP_IF].Get(cons.TK_DBUS_SESSION_OBJECT, "IdleHint"))) # get locked state, only if it's available if self._sessionLockedStateAvailable or self._sessionLockedStateAvailable is None: try: # get locked state sessionLockedState = str(bool(self._timekprUserSessions[rSessionId][cons.TK_CTRL_DBUS_SESS_PROP_IF].Get(cons.TK_DBUS_SESSION_OBJECT, "LockedHint"))) # locked state available if self._sessionLockedStateAvailable is None: # state used self._sessionLockedStateAvailable = True log.log(cons.TK_LOG_LEVEL_INFO, "INFO: session locked state is available and will be used for idle state detection (if it works)") except: # locked state not used self._sessionLockedStateAvailable = False log.log(cons.TK_LOG_LEVEL_INFO, "INFO: session locked state is NOT available, will rely on client screensaver state (if it works)") # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - property get for session \"%s\" took too long (%is)" % (rSessionId, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True log.log(cons.TK_LOG_LEVEL_DEBUG, "got session - type: %s, VTNr: %s, state: %s, idle: %s, locked: %s" % (sessionType, sessionVTNr, sessionState, sessionIdleState, sessionLockedState)) # check if active if sessionState == "active" and sessionIdleState == "False" and sessionLockedState == "False": # validate against session types we specifically do not track if sessionType in pTimekprConfig.getTimekprSessionsExcl(): # session is on the list of session types we specifically do not track log.log(cons.TK_LOG_LEVEL_DEBUG, "session %s is active, but session type \"%s\" is excluded from tracking (thus effectively inactive)" % (rSessionId, sessionType)) # validate against session types we manage elif sessionType not in pTimekprConfig.getTimekprSessionsCtrl(): # session is not on the list of session types we track log.log(cons.TK_LOG_LEVEL_DEBUG, "session %s is active, but session type \"%s\" is not on tracked type list (thus effectively inactive)" % (rSessionId, sessionType)) else: # session is on the list of session types we track and session is active userActive = True log.log(cons.TK_LOG_LEVEL_DEBUG, "session %s active" % (rSessionId)) elif sessionType in pTimekprConfig.getTimekprSessionsCtrl(): # do not count lingering and closing sessions as active either way # lingering - user processes are around, but user not logged in # closing - user logged out, but some processes are still left if sessionState in ("lingering", "closing"): # user is not active log.log(cons.TK_LOG_LEVEL_DEBUG, "session %s is inactive (not exactly logged in too)" % (rSessionId)) # if we track inactive elif pTimekprUserConfig.getUserTrackInactive(): # we track inactive sessions userActive = True # session is not on the list of session types we track log.log(cons.TK_LOG_LEVEL_DEBUG, "session %s included as active (track inactive sessions enabled)" % (rSessionId)) else: # session is not active log.log(cons.TK_LOG_LEVEL_DEBUG, "session %s inactive" % (rSessionId)) else: # session is not on the list of session types we track log.log(cons.TK_LOG_LEVEL_DEBUG, "session %s is inactive and not tracked" % (rSessionId)) # screen lock state userScreenLocked = (pIsScreenLocked or sessionLockedState == "True") log.log(cons.TK_LOG_LEVEL_DEBUG, "---=== finish isUserActive: %s ===---" % (str(userActive))) # return whether user is active return userActive, userScreenLocked def lockUserSessions(self): """Ask login manager to lock user sessions""" # go through all user sessions for rSessionId in self._timekprUserSessions: # we lock only GUI sessions if str(self._timekprUserSessions[rSessionId][cons.TK_CTRL_DBUS_SESS_PROP_IF].Get(cons.TK_DBUS_SESSION_OBJECT, "Type")) in cons.TK_SESSION_TYPES_CTRL: # lock session self._timekprUserSessions[rSessionId][cons.TK_CTRL_DBUS_SESS_IF].Lock() timekpr-next/server/interface/dbus/logind/__init__.py000664 001750 001750 00000000000 13476006650 024762 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/dbus/logind/manager.py000664 001750 001750 00000044230 14064575714 024660 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # import section import dbus import time from gi.repository import GLib # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.common.utils import misc class timekprUserLoginManager(object): """Class enables the connection with login1""" def __init__(self): """Initialize all stuff for login1""" log.log(cons.TK_LOG_LEVEL_INFO, "start timekpr login1 manager") # variables self._login1Object = None self._login1ManagerInterface = None self._loginManagerVTNr = None self._loginManagerVTNrRetries = 0 self._connectionRetryCount = 0 # dbus initialization self._timekprBus = dbus.SystemBus() # init connections self._initDbusConnections() log.log(cons.TK_LOG_LEVEL_INFO, "finish login1 manager") def _initDbusConnections(self): """Init connections to dbus""" # count retries self._connectionRetryCount += 1 # if there was a connection before, give a big fat warning if self._login1ManagerInterface is not None: log.log(cons.TK_LOG_LEVEL_INFO, "IMPORTANT WARNING: connection to DBUS was lost, trying to establish it again, retry %i" % (self._connectionRetryCount)) try: log.log(cons.TK_LOG_LEVEL_DEBUG, "getting login1 object on DBUS") # dbus performance measurement misc.measureTimeElapsed(pStart=True) # try to get real connection to our objects and interface self._login1Object = self._timekprBus.get_object(cons.TK_DBUS_L1_OBJECT, cons.TK_DBUS_L1_PATH) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_L1_OBJECT, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True log.log(cons.TK_LOG_LEVEL_DEBUG, "getting login1 interface on DBUS") self._login1ManagerInterface = dbus.Interface(self._login1Object, cons.TK_DBUS_L1_MANAGER_INTERFACE) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_L1_MANAGER_INTERFACE, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True log.log(cons.TK_LOG_LEVEL_DEBUG, "got interface, login1 successfully set up") # reset retries self._connectionRetryCount = 0 except Exception as exc: log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: error getting DBUS login manager: %s" % (exc)) # reset connections self._login1ManagerInterface = None self._login1Object = None # raise error when too much retries if self._connectionRetryCount >= cons.TK_MAX_RETRIES: raise def _listUsers(self): """Exec ListUsers dbus methods (this is the only method which just has to succeed)""" # reset counter on retry self._connectionRetryCount = 0 # def result loggedInUsersDBUS = None wasConnectionLost = False # try executing when there are retries left and there is no result while loggedInUsersDBUS is None and self._connectionRetryCount < cons.TK_MAX_RETRIES: # try get result try: # exec loggedInUsersDBUS = self._login1ManagerInterface.ListUsers() except Exception: # failure wasConnectionLost = True # no sleep on first retry if self._connectionRetryCount > 0: # wait a little before retry time.sleep(0.5) # retry connection self._initDbusConnections() # pass back the result return wasConnectionLost, loggedInUsersDBUS def getUserList(self, pSilent=False): """Go through a list of logged in users""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start getUserList") if not pSilent else True # get user list wasConnectionLost, loggedInUsersDBUS = self._listUsers() loggedInUsers = {} # loop through all users for rUser in loggedInUsersDBUS: # set up dict for every user loggedInUsers[str(rUser[1])] = {cons.TK_CTRL_UID: str(int(rUser[0])), cons.TK_CTRL_UNAME: str(rUser[1]), cons.TK_CTRL_UPATH: str(rUser[2])} # in case debug if not pSilent and log.isDebugEnabled(): # get all properties for key, value in loggedInUsers.items(): # optimize logging uNameLog = "USER: %s" % (key) # values and keys for keyx, valuex in value.items(): uNameLog = "%s, %s: %s" % (uNameLog, keyx, valuex) log.log(cons.TK_LOG_LEVEL_DEBUG, uNameLog) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish getUserList") if not pSilent else True # passing back user tuples return wasConnectionLost, loggedInUsers def getUserSessionList(self, pUserName, pUserPath): """Get up-to-date user session list""" # prepare return list userSessions = [] misc.measureTimeElapsed(pStart=True) # get dbus object login1UserObject = self._timekprBus.get_object(cons.TK_DBUS_L1_OBJECT, pUserPath) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (pUserPath, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # get dbus interface for properties login1UserInterface = dbus.Interface(login1UserObject, cons.TK_DBUS_PROPERTIES_INTERFACE) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_PROPERTIES_INTERFACE, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # dbus performance measurement misc.measureTimeElapsed(pStart=True) # get all user sessions login1UserSessions = login1UserInterface.Get(cons.TK_DBUS_USER_OBJECT, "Sessions") # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - getting sessions for \"%s\" took too long (%is)" % (cons.TK_DBUS_USER_OBJECT, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # go through all user sessions for rUserSession in login1UserSessions: # dbus performance measurement misc.measureTimeElapsed(pStart=True) # get dbus object login1SessionObject = self._timekprBus.get_object(cons.TK_DBUS_L1_OBJECT, str(rUserSession[1])) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (str(rUserSession[1]), misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # get dbus interface for properties login1SessionInterface = dbus.Interface(login1SessionObject, cons.TK_DBUS_PROPERTIES_INTERFACE) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_PROPERTIES_INTERFACE, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # get all user session properties try: sessionType = str(login1SessionInterface.Get(cons.TK_DBUS_SESSION_OBJECT, "Type")) sessionVTNr = str(int(login1SessionInterface.Get(cons.TK_DBUS_SESSION_OBJECT, "VTNr"))) sessionSeat = str(login1SessionInterface.Get(cons.TK_DBUS_SESSION_OBJECT, "Seat")[0]) sessionState = str(login1SessionInterface.Get(cons.TK_DBUS_SESSION_OBJECT, "State")) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - getting \"%s\" took too long (%is)" % (cons.TK_DBUS_SESSION_OBJECT, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # add user session to return list userSessions.append({"session": rUserSession, "type": sessionType, "vtnr": sessionVTNr, "seat": sessionSeat, "state": sessionState}) except Exception as exc: log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: error getting session properties for session \"%s\" DBUS: %s" % (str(rUserSession[1]), exc)) # return sessions return userSessions def determineLoginManagerVT(self, pUserName, pUserPath): """Get login manager session VTNr""" # if we did not yet find a login manager VTNr if self._loginManagerVTNr is None and self._loginManagerVTNrRetries < cons.TK_MAX_RETRIES: # def loginManager = None # loop through login managers for rLMan in cons.TK_USERS_LOGIN_MANAGERS.split(";"): # since we are checking this with UID less than 1K (or whatever is configured in limits file) # we can safely compare usernames or try to use LIKE operator on user name # exact match if rLMan == pUserName: # we found one loginManager = pUserName else: # try to determine if we found one (according to "3.278 Portable Filename Character Set" additional symbols are ._-) for rSymb in (".", "_", "-"): # check for name if "%s%s" % (rSymb, rLMan) in pUserName or "%s%s%s" % (rSymb, rLMan, rSymb) in pUserName or "%s%s" % (rLMan, rSymb) in pUserName: # we found one loginManager = pUserName # first match is ok break # determine if we have one like manager if loginManager is not None: # advance counter self._loginManagerVTNrRetries += 1 # log log.log(cons.TK_LOG_LEVEL_DEBUG, "INFO: searching for login manager (%s) VTNr" % (pUserName)) # VTNr (default) loginSessionVTNr = None # get user session list userSessionList = self.getUserSessionList(pUserName, pUserPath) # loop through users and try to guess login managers for rSession in userSessionList: # check whether user seems to be login manager user if rSession["type"] in cons.TK_SESSION_TYPES_CTRL: # we got right session, save VTNr loginSessionVTNr = rSession["vtnr"] # done break # if we found login manager VTNr if loginSessionVTNr is not None and loginSessionVTNr != "": # return VTNr self._loginManagerVTNr = loginSessionVTNr # seat is found log.log(cons.TK_LOG_LEVEL_INFO, "INFO: login manager (%s) TTY found: %s" % (pUserName, self._loginManagerVTNr)) else: # log log.log(cons.TK_LOG_LEVEL_DEBUG, "INFO: searching for login manager, user (%s) does not look like one" % (pUserName)) # in case we tried hard elif self._loginManagerVTNr is None and self._loginManagerVTNrRetries == cons.TK_MAX_RETRIES: # advance counter (so we never get here again) self._loginManagerVTNrRetries += 1 # seat is NOT found and we'll not try to find it anymore log.log(cons.TK_LOG_LEVEL_INFO, "INFO: login manager (%s) TTY is NOT found, giving up until restart" % (pUserName)) def switchTTY(self, pSeatId, pForce): """Swith TTY for login screen""" # defaults willSwitchTTY = True # switch to right TTY (if needed) if self._loginManagerVTNr is None: log.log(cons.TK_LOG_LEVEL_INFO, "INFO: switching TTY is not possible, login manager TTY was not found") willSwitchTTY = False elif pSeatId is not None and pSeatId != "": # get all necessary objects from DBUS to switch the TTY try: # it appears that sometimes seats are not available (RDP may not have it) seat = self._login1ManagerInterface.GetSeat(pSeatId) except Exception as exc: # cannot switch as we can't get seat willSwitchTTY = False log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: error getting seat (%s) from DBUS: %s" % (str(pSeatId), exc)) # only if we got the seat if willSwitchTTY: # seat object processing login1SeatObject = self._timekprBus.get_object(cons.TK_DBUS_L1_OBJECT, seat) login1SeatInterface = dbus.Interface(login1SeatObject, cons.TK_DBUS_SEAT_OBJECT) log.log(cons.TK_LOG_LEVEL_INFO, "INFO:%s switching TTY to %s" % (" (forced)" if pForce else "", self._loginManagerVTNr)) # finally switching the TTY if cons.TK_DEV_ACTIVE: log.log(cons.TK_LOG_LEVEL_INFO, "DEVELOPMENT ACTIVE, not switching my sessions, sorry...") else: # finally switching the TTY login1SeatInterface.SwitchTo(self._loginManagerVTNr) else: log.log(cons.TK_LOG_LEVEL_INFO, "INFO: switching TTY is not needed") # will not switch willSwitchTTY = False # in case switch is needed, reschedule it (might not work from first try) if willSwitchTTY and not pForce: # schedule a switch GLib.timeout_add_seconds(cons.TK_POLLTIME, self.switchTTY, pSeatId, True) # return false for repeat schedule to be discarded return False def terminateUserSessions(self, pUserName, pUserPath, pTimekprConfig): """Terminate user sessions""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start terminateUserSessions") log.log(cons.TK_LOG_LEVEL_DEBUG, "inspecting \"%s\" userpath \"%s\" sessions" % (pUserName, pUserPath)) # get user session list userSessionList = self.getUserSessionList(pUserName, pUserPath) # indication whether we are killing smth sessionsToKill = 0 lastSeat = None userActive = False # go through all user sessions for rUserSession in userSessionList: # if we support this session type and it is not specifically excluded, only then we kill it if rUserSession["type"] in pTimekprConfig.getTimekprSessionsCtrl() and rUserSession["type"] not in pTimekprConfig.getTimekprSessionsExcl(): log.log(cons.TK_LOG_LEVEL_INFO, "(delayed 0.1 sec) killing \"%s\" session %s (%s)" % (pUserName, str(rUserSession["session"][1]), str(rUserSession["type"]))) # killing time if cons.TK_DEV_ACTIVE: log.log(cons.TK_LOG_LEVEL_INFO, "DEVELOPMENT ACTIVE, not killing myself, sorry...") else: GLib.timeout_add_seconds(0.1, self._login1ManagerInterface.TerminateSession, rUserSession["session"][0]) # get last seat lastSeat = rUserSession["seat"] if rUserSession["seat"] is not None and rUserSession["seat"] != "" and rUserSession["vtnr"] is not None and rUserSession["vtnr"] != "" and self._loginManagerVTNr != rUserSession["vtnr"] else lastSeat # determine whether user is active userActive = userActive or rUserSession["state"] == "active" # count sessions to kill sessionsToKill += 1 else: log.log(cons.TK_LOG_LEVEL_INFO, "saving \"%s\" session %s (%s)" % (pUserName, str(rUserSession["session"][1]), str(rUserSession["type"]))) # kill leftover processes (if we are killing smth) if sessionsToKill > 0 and userActive and lastSeat is not None: # timeout tmo = cons.TK_POLLTIME - 1 # switch TTY log.log(cons.TK_LOG_LEVEL_INFO, "scheduling a TTY switch sequence after %i seconds" % (tmo)) # schedule a switch GLib.timeout_add_seconds(tmo, self.switchTTY, lastSeat, False) else: log.log(cons.TK_LOG_LEVEL_INFO, "TTY switch ommitted for user %s" % (pUserName)) # cleanup if sessionsToKill > 0: # timeout tmo = cons.TK_POLLTIME * 2 + 1 # dispatch a killer for leftovers log.log(cons.TK_LOG_LEVEL_INFO, "dipatching a killer for leftover processes after %i seconds" % (tmo)) # schedule leftover processes to be killed (it's rather sophisticated killing and checks whether we need to kill gui or terminal processes) GLib.timeout_add_seconds(tmo, misc.killLeftoverUserProcesses, pUserName, pTimekprConfig) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish terminateUserSessions") def suspendComputer(self, pUserName): """Suspend computer""" # only if we are not in DEV mode if cons.TK_DEV_ACTIVE: log.log(cons.TK_LOG_LEVEL_INFO, "DEVELOPMENT ACTIVE, not suspending myself, sorry...") else: log.log(cons.TK_LOG_LEVEL_DEBUG, "start suspendComputer in the name of \"%s\"" % (pUserName)) GLib.timeout_add_seconds(0.1, self._login1ManagerInterface.Suspend, False) def shutdownComputer(self, pUserName): """Shutdown computer""" # only if we are not in DEV mode if cons.TK_DEV_ACTIVE: log.log(cons.TK_LOG_LEVEL_INFO, "DEVELOPMENT ACTIVE, not issuing shutdown for myself, sorry...") else: log.log(cons.TK_LOG_LEVEL_DEBUG, "start shutdownComputer in the name of \"%s\"" % (pUserName)) GLib.timeout_add_seconds(0.1, self._login1ManagerInterface.PowerOff, False) timekpr-next/server/interface/dbus/__init__.py000664 001750 001750 00000000000 13476006650 023506 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/database/000775 001750 001750 00000000000 13476006650 022216 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/interface/database/TODO000664 001750 001750 00000000073 13476006650 022706 0ustar00bezvfedubezvfedu000000 000000 # TODO: implement this at some point for stats or the like timekpr-next/server/interface/__init__.py000664 001750 001750 00000000000 13476006650 022551 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/__init__.py000664 001750 001750 00000000000 13476006650 020611 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/server/timekprd.py000664 001750 001750 00000002561 14017261747 020711 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # imports import os import sys # set up our python path if "/usr/lib/python3/dist-packages" not in sys.path: sys.path.append("/usr/lib/python3/dist-packages") # imports import signal # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.server.interface.dbus.daemon import timekprDaemon from timekpr.common.utils import misc from timekpr.server.config.userhelper import timekprUserStore # main start if __name__ == "__main__": # simple self-running check if misc.checkAndSetRunning(os.path.splitext(os.path.basename(__file__))[0]): # get out sys.exit(0) log.log(cons.TK_LOG_LEVEL_INFO, "--- initiating timekpr v. %s ---" % (cons.TK_VERSION)) # get uname uname = os.uname() log.log(cons.TK_LOG_LEVEL_INFO, "running on: %s, %s, %s, %s" % (uname[0], uname[2], uname[3], uname[4])) # get daemon class _timekprDaemon = timekprDaemon() # this is needed for appindicator to react to ctrl+c signal.signal(signal.SIGINT, _timekprDaemon.finishTimekpr) signal.signal(signal.SIGTERM, _timekprDaemon.finishTimekpr) # prepare all users in the system timekprUserStore().checkAndInitUsers() # init daemon _timekprDaemon.initTimekpr() # start daemon threads _timekprDaemon.startTimekprDaemon() timekpr-next/debian/000775 001750 001750 00000000000 14064600065 016420 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/debian/control000664 001750 001750 00000003215 14017261747 020034 0ustar00bezvfedubezvfedu000000 000000 Source: timekpr-next Maintainer: Eduards Bezverhijs Uploaders: Eduards Bezverhijs Section: admin Priority: optional Build-Depends: debhelper (>= 7) | debhelper-compat (= 12), dh-python | python-support, gir1.2-gtk-3.0, libgtk-3-0 (>= 3.4), po-debconf, python3 (>= 3.2), python3-dbus, python3-gi Standards-Version: 3.9.5 Homepage: https://launchpad.net/timekpr-next Rules-Requires-Root: no Package: timekpr-next Architecture: any Depends: gir1.2-ayatanaappindicator3-0.1 | gir1.2-appindicator3-0.1, gir1.2-gtk-3.0, libgtk-3-0 (>= 3.4), lxpolkit | lxqt-policykit | mate-polkit | policykit-1-gnome | polkit-kde-agent-1 | polkit-1-auth-agent, policykit-1, python3 (>= 3.2), python3-dbus, python3-gi, python3-psutil (>= 3.4), systemd | systemd-shim, ${misc:Depends}, ${python3:Depends} Suggests: espeak, gnome-shell-extension-appindicator, python3-espeak Conflicts: timekpr-next-beta Provides: timekpr Replaces: timekpr, timekpr-beta, timekpr-next-beta Description: Keep control of computer usage Timekpr-nExT is a fresh, simple and easy-to-use time managing software that helps optimizing time spent at computer for Your subordinates, children or even for Yourself. . The software is targeted at parents or supervisors to optimize / limit time spent at computer as they see fit. . Please report any bugs to Timekpr-nExT’s bug tracker on Launchpad at: https://bugs.launchpad.net/timekpr-next timekpr-next/debian/postrm000775 001750 001750 00000002461 13745331025 017677 0ustar00bezvfedubezvfedu000000 000000 #!/bin/sh # timekpr directories and units TK_DIR="/usr/lib/python3/dist-packages/timekpr" # unit name TK_UNIT_NAME="timekpr.service" # unit directory (starting with debian) TK_UNIT_DIR="/lib/systemd/system" # prefixes for other distros then debian based TK_UNIT_DIR_PREFIXES="/usr" # we need to take into account the various directory configs for R_PREF in ${TK_UNIT_DIR_PREFIXES}; do # alternatives exist if [ -d "${R_PREF}${TK_UNIT_DIR}" ]; then # assign additional prefix TK_UNIT_DIR="${R_PREF}${TK_UNIT_DIR}" # this is it break fi done # if there are units, let's handle them if [ -f "${TK_UNIT_DIR}/${TK_UNIT_NAME}" ]; then # systemctl echo "Stopping and disabling Timekpr-nExT units" systemctl stop timekpr systemctl disable timekpr fi # remove compiled python units (may interfere with python versions) if [ -d "${TK_DIR}" ]; then # remove compiled echo "Cleaning up Timekpr-nExT compiled units" find "${TK_DIR}" -type d -name '__pycache__' -exec rm -rf {} \; -prune find "${TK_DIR}" -type f -iname '*.pyc' -exec rm {} \; fi # reload d-bus for access controls and systemd for service removals echo "Reloading dbus daemon to refresh access policies" systemctl reload dbus echo "Reloading systemd to refresh units" systemctl daemon-reload timekpr-next/debian/postinst000775 001750 001750 00000004657 14064575714 020261 0ustar00bezvfedubezvfedu000000 000000 #!/bin/sh # timekpr directories and units TK_DIR="/usr/lib/python3/dist-packages/timekpr" # unit name TK_UNIT_NAME="timekpr.service" # unit directory (starting with debian) TK_UNIT_DIR="/lib/systemd/system" # prefixes for other distros then debian based TK_UNIT_DIR_PREFIXES="/usr" # we need to take into account the various directory configs for R_PREF in ${TK_UNIT_DIR_PREFIXES}; do # alternatives exist if [ -d "${R_PREF}${TK_UNIT_DIR}" ]; then # assign additional prefix TK_UNIT_DIR="${R_PREF}${TK_UNIT_DIR}" # this is it break fi done # final unit TK_UNIT="${TK_UNIT_DIR}/${TK_UNIT_NAME}" # add timekpr group (for accessing administration functionality without sudo) echo "Checking and/or adding timekpr group to access functionality without superuser privileges" groupadd -g 2000 timekpr 2>/dev/null || true # remove compiled python units (may interfere with python versions) for R_DIR in ${TK_DIR}; do # if compiled units exist, remove them if [ -d "${R_DIR}" ]; then # remove compiled echo "Cleaning up Timekpr-nExT compiled units" find "${R_DIR}" -type d -name '__pycache__' -exec rm -rf {} \; -prune find "${R_DIR}" -type f -iname '*.pyc' -exec rm {} \; fi done # previously we installed unit into /etc, we need to take care of it TK_OBSOLETE_UNIT="/etc/systemd/system/${TK_UNIT_NAME}" if [ -f "${TK_OBSOLETE_UNIT}" ]; then echo "Removing obsolete Timekpr-nExT systemd unit" rm "${TK_OBSOLETE_UNIT}" fi # enable service by default and start it echo "Enabling Timekpr-nExT systemd unit" systemctl enable "${TK_UNIT}" # reload d-bus for access controls and systemd for service removals echo "Reloading dbus daemon to refresh access policies for Timekpr-nExT daemon" systemctl reload dbus echo "Reloading systemd to refresh unit for Timekpr-nExT" systemctl daemon-reload # restart or start (if that was not started before) echo "Starting Timekpr-nExT" systemctl restart timekpr # update gtk icon cache (if utility exists) which gtk-update-icon-cache > /dev/null 2>&1 # utility exists, update cache if [ $? -eq 0 ]; then # determine whether cache exists and choose particular args for that if [ -f /usr/share/icons/hicolor/icon-theme.cache ]; then ICOARGS="-fv" else ICOARGS="-f" fi echo "Update icon cache" touch --no-create /usr/share/icons/hicolor && gtk-update-icon-cache ${ICOARGS} /usr/share/icons/hicolor fi timekpr-next/debian/install000664 001750 001750 00000014334 14017261747 020026 0ustar00bezvfedubezvfedu000000 000000 # binaries bin/timekpra usr/bin/ bin/timekprc usr/bin/ bin/timekprd usr/bin/ # config files resource/server/dbus/timekpr.conf etc/dbus-1/system.d/ resource/server/logrotate.d/timekpr etc/logrotate.d/ resource/server/polkit/com.ubuntu.timekpr.pkexec.policy usr/share/polkit-1/actions/ resource/server/systemd/timekpr.service lib/systemd/system/ resource/server/timekpr.conf etc/timekpr/ # sample runtime files resource/server/timekpr.USER.conf var/lib/timekpr/config/ resource/server/USER.time var/lib/timekpr/work/ # icons resource/icons/timekpr-128.png usr/share/icons/hicolor/128x128/apps/ resource/icons/timekpr-48.png usr/share/icons/hicolor/48x48/apps/ resource/icons/timekpr-64.png usr/share/icons/hicolor/64x64/apps/ resource/icons/timekpr-client-128.png usr/share/icons/hicolor/128x128/apps/ resource/icons/timekpr-client-48.png usr/share/icons/hicolor/48x48/apps/ resource/icons/timekpr-client-64.png usr/share/icons/hicolor/64x64/apps/ resource/icons/timekpr-client-logo.svg usr/share/timekpr/icons/ resource/icons/timekpr-client.svg usr/share/icons/hicolor/scalable/apps/ resource/icons/timekpr-logo.svg usr/share/timekpr/icons/ resource/icons/timekpr-padlock-limited-green.svg usr/share/timekpr/icons/ resource/icons/timekpr-padlock-limited-red.svg usr/share/timekpr/icons/ resource/icons/timekpr-padlock-limited-yellow.svg usr/share/timekpr/icons/ resource/icons/timekpr-padlock-limited-uacc.svg usr/share/timekpr/icons/ resource/icons/timekpr-padlock-unlimited-green.svg usr/share/timekpr/icons/ resource/icons/timekpr.svg usr/share/icons/hicolor/scalable/apps/ # launchers resource/launchers/timekpr-admin.desktop usr/share/applications/ resource/launchers/timekpr-admin-su.desktop usr/share/applications/ resource/launchers/timekpr-client.desktop etc/xdg/autostart/ # metainfo resource/appstream/org.timekpr.timekpr-next.metainfo.xml usr/share/metainfo/ # forms resource/client/forms/about.glade usr/share/timekpr/client/forms/ resource/client/forms/admin.glade usr/share/timekpr/client/forms/ resource/client/forms/client.glade usr/share/timekpr/client/forms/ # python common common/constants/constants.py usr/lib/python3/dist-packages/timekpr/common/constants/ common/constants/__init__.py usr/lib/python3/dist-packages/timekpr/common/constants/ common/constants/messages.py usr/lib/python3/dist-packages/timekpr/common/constants/ common/log/__init__.py usr/lib/python3/dist-packages/timekpr/common/log/ common/log/log.py usr/lib/python3/dist-packages/timekpr/common/log/ common/utils/config.py usr/lib/python3/dist-packages/timekpr/common/utils/ common/utils/__init__.py usr/lib/python3/dist-packages/timekpr/common/utils/ common/utils/misc.py usr/lib/python3/dist-packages/timekpr/common/utils/ common/utils/notifications.py usr/lib/python3/dist-packages/timekpr/common/utils/ # python client client/admin/adminprocessor.py usr/lib/python3/dist-packages/timekpr/client/admin/ client/gui/admingui.py usr/lib/python3/dist-packages/timekpr/client/gui/ client/gui/clientgui.py usr/lib/python3/dist-packages/timekpr/client/gui/ client/gui/__init__.py usr/lib/python3/dist-packages/timekpr/client/gui/ client/__init__.py usr/lib/python3/dist-packages/timekpr/client/ client/interface/dbus/administration.py usr/lib/python3/dist-packages/timekpr/client/interface/dbus/ client/interface/dbus/daemon.py usr/lib/python3/dist-packages/timekpr/client/interface/dbus/ client/interface/dbus/__init__.py usr/lib/python3/dist-packages/timekpr/client/interface/dbus/ client/interface/dbus/notifications.py usr/lib/python3/dist-packages/timekpr/client/interface/dbus/ client/interface/__init__.py usr/lib/python3/dist-packages/timekpr/client/interface/ client/interface/speech/espeak.py usr/lib/python3/dist-packages/timekpr/client/interface/speech/ client/interface/speech/__init__.py usr/lib/python3/dist-packages/timekpr/client/interface/speech/ client/interface/ui/appindicator.py usr/lib/python3/dist-packages/timekpr/client/interface/ui/ client/interface/ui/__init__.py usr/lib/python3/dist-packages/timekpr/client/interface/ui/ client/interface/ui/notificationarea.py usr/lib/python3/dist-packages/timekpr/client/interface/ui/ client/interface/ui/statusicon.py usr/lib/python3/dist-packages/timekpr/client/interface/ui/ client/timekpra.py usr/lib/python3/dist-packages/timekpr/client/ client/timekprc.py usr/lib/python3/dist-packages/timekpr/client/ # python server server/config/configprocessor.py usr/lib/python3/dist-packages/timekpr/server/config/ server/config/userhelper.py usr/lib/python3/dist-packages/timekpr/server/config/ server/__init__.py usr/lib/python3/dist-packages/timekpr/server/ server/interface/dbus/consolekit/__init__.py usr/lib/python3/dist-packages/timekpr/server/interface/dbus/consolekit/ server/interface/dbus/consolekit/manager.py usr/lib/python3/dist-packages/timekpr/server/interface/dbus/consolekit/ server/interface/dbus/consolekit/user.py usr/lib/python3/dist-packages/timekpr/server/interface/dbus/consolekit/ server/interface/dbus/daemon.py usr/lib/python3/dist-packages/timekpr/server/interface/dbus/ server/interface/dbus/__init__.py usr/lib/python3/dist-packages/timekpr/server/interface/dbus/ server/interface/dbus/logind/__init__.py usr/lib/python3/dist-packages/timekpr/server/interface/dbus/logind/ server/interface/dbus/logind/manager.py usr/lib/python3/dist-packages/timekpr/server/interface/dbus/logind/ server/interface/dbus/logind/user.py usr/lib/python3/dist-packages/timekpr/server/interface/dbus/logind/ server/interface/__init__.py usr/lib/python3/dist-packages/timekpr/server/interface/ server/timekprd.py usr/lib/python3/dist-packages/timekpr/server/ server/user/playtime.py usr/lib/python3/dist-packages/timekpr/server/user/ server/user/__init__.py usr/lib/python3/dist-packages/timekpr/server/user/ server/user/userdata.py usr/lib/python3/dist-packages/timekpr/server/user/ # translations (only the ones that are ready will be included) #resource/locale/cs/LC_MESSAGES/timekpr.mo usr/share/locale/cs/LC_MESSAGES/ #resource/locale/de/LC_MESSAGES/timekpr.mo usr/share/locale/de/LC_MESSAGES/ resource/locale/fr/LC_MESSAGES/timekpr.mo usr/share/locale/fr/LC_MESSAGES/ #resource/locale/hu/LC_MESSAGES/timekpr.mo usr/share/locale/hu/LC_MESSAGES/ resource/locale/it/LC_MESSAGES/timekpr.mo usr/share/locale/it/LC_MESSAGES/ resource/locale/lv/LC_MESSAGES/timekpr.mo usr/share/locale/lv/LC_MESSAGES/ timekpr-next/debian/changelog000664 001750 001750 00000067677 14064600065 020321 0ustar00bezvfedubezvfedu000000 000000 timekpr-next (0.5.2-1ubuntu1~ppa1) UNRELEASED; urgency=medium * features PlayTime left is now shown besides the icon / on label * bug fixes fix #1927771 (the issue was improper configuration when limit count was less then allowed day count) additionally allow setting empty day / limit lists for regular time and PlayTime fix error handling with empty lists properly check allowed day numbers according to allowed values (1-7) a small fix for time leak (couple of seconds) on day change * technical improvements address the situation when session type can change during the session in logind (https://github.com/systemd/systemd/pull/14925) improved session accounting for situations when session type is in tracked list at the same time as in excluded, exclusion takes precedence improved session logging to determine why the time for session is or is not accounted improved session remaining process killer to include processes that use pseudo-terminals as well as recording a summary of killing results prevent an installation error when blindly recreating GTK icon cache even if it is not present, in these cases just create it properly check whether an instance of timekpr applications is actually running on day change, reset not only this day spent and sleep times, but for next day too tiny improvement on sleep time precision make admin application to exit gracefully when it was opened from terminal and ctrl+c was pressed (SIGINT) less logging in standard debug mode / remove duplicate logging for PT -- Eduards Bezverhijs Wed, 23 Jun 2021 12:34:38 +0300 timekpr-next (0.5.1-2ubuntu1~ppa1) UNRELEASED; urgency=medium * quick fix for PlayTime notifications revert the cap in daemon for sending PlayTime left to clients admin app will always show actual PlayTime left client app will receive actual PlayTime left, but it will show minimum of PlayTime or standard time left for that particular day to user (child, subordinate) * possibly fix a bug #1917916 when process changed the owner from regular user to system user but was still left in user process list -- Eduards Bezverhijs Fri, 5 Mar 2021 11:48:25 +0200 timekpr-next (0.5.1-1ubuntu1~ppa1) UNRELEASED; urgency=medium * adjust README to fix MD parsing nuances on gitlab * add gnome-shell-extension-appindicator to suggestions list * fix project description to match the README * technical improvements added ":" as allowed separator for minute intervals (undocumented feature) improve a workaround in config loader routines for cases when user makes a mistake while manually editing the config files added explanatory comment for values in control files print out uname when timekpr starts to better understand the environment the timekpr is running in log more information about timekpr performance and computer load average log information about day / week / month change added elapsed time information output on lowest log level rewritten logging routines and implemented buffered log save time spent is accounted and saved even when file has been modified externally (this should help with proper time accounting (2x+) if user is logged in from multiple machines when commonly shared directory is used) * registered bug fixes adjust Debian installation suggestions in README (fixes #1910457) start using ayatana appindicators because regular ones seem to be deprecated (fixes #1910461) adjust for openSUSE too (Fedora does not seem to be using ayatana appindicators yet) * unregistered bug fixes fixes to client application when is pressed instead of close window which leads to empty timekpr windows fixes to PlayTime daily limit reset when the day has changed fix for PlayTime disabled -> enabled did not work right away when user is already logged in fix for user time accounting which added couple of seconds to time spent when using unaccountable intervals fix time accounting for PlayTime in override mode and unaccounted time intervals fix process handling when process does not have a normal user id that process monitor is interested in and it changed executable or process changed user id from one we were interested in to one we are not fix timekpr behaviour when user was able to use computer prior the starting minutes of unaccounted hour interval now user will be dealt according to defined rules instead of using the computer when he is not allowed to lift the terminate / shutdown restriction when termination sequence has been initialized, but admin gives more time prior to terminate or shutdown * new features introduce an option to prevent PlayTime activities to be started during unaccountable ("∞") intervals introduce an option to monitor PlayTime activities (processes) using first 512 characters of command line by default only process name is used for activity detection logging level changes are applied immediately gray icon for unaccounted hours, which help to distinguish the interval, especially when there is no time left (was: red icon) add possibility to edit single daily, daily PlayTime and weekly/monthly limits by editing value directly -- Eduards Bezverhijs Mon, 1 Mar 2021 21:49:33 +0200 timekpr-next (0.5.0-1ubuntu1~ppa1) UNRELEASED; urgency=medium * fix a bug when administration application tries to get user information from server even when no user has been selected * added clarifications to the template on some keywords not to be translated fixed LV and IT translations with keywords * enable Italian translations * added Italian translations * added clarifications on some keywords not to be translated * translation template update, spelling fixes and Latvian translations * replaced re.escape with simple replace due to it's different behavior in different versions this fixes user list retrieval in Ubuntu 18.04 (python 3.6.9) * fixed a bug when user names will not show up in administration application if username contains a . (dot) * introduced PlayTime and PlayTime override modes this basically allows a supervisor to account and control specific processes in the system for their subordinates supervisor has to configure which processes are accounted by entering a process executable names / masks * introducing "freeride" time periods * some GUI improvements in client app * total rewrite of administration app to improve usability * introducing user configurable notifications -- Eduards Bezverhijs Tue, 29 Dec 2020 17:51:19 +0200 timekpr-next (0.4.4-1ubuntu1~ppa1) UNRELEASED; urgency=medium * adjust previously built workaround for switching to login manager screen -- Eduards Bezverhijs Sun, 25 Oct 2020 19:25:59 +0300 timekpr-next (0.4.3-2ubuntu1~ppa1) UNRELEASED; urgency=medium * added lock, suspend and shutdown options as a restriction / lockout types * added option for computer to be woken up automatically if it was put to sleep by timekpr additionally it's possible to specify hour interval when it is allowed to be woken up * changed termination sequence a little if user has no time and locked the screen, user is removed from termination list, which effectively means that user sessions won't be terminated unless user unlocks the screen or other user logs in via user switching (we should not leave sessions without time left floating around forever) * proper english label / message corrections from Phil Hudson (thanks!) -- Eduards Bezverhijs Sat, 10 Oct 2020 19:59:35 +0300 timekpr-next (0.4.2-1ubuntu1~ppa1) UNRELEASED; urgency=medium * added verbose output to timekpr installation * fix license names in AppStream file * better explain usage notes for CLI usage * improvements added average performance metrics for timekpr execution introduce server ability to survive login manager DBUS interface crash and restore functional timekpr state after recovery * refactoring improve various functionality in timekpr codebase tiny optimizations for variables improvements for config reader / writer improvements for in-memory config creation * fixed #1891921, critical notifications did not show up until final countdown (if show all notifications was checked) now critical notification will be shown approx one minute before time will end * improved notification frequency and urgency (now only critical notifications are actually critical) new frequency values: if more than 2 hours are left, notifications are shown every 2 hours if more than 1 hour is left, notifications are shown every 1 hour, i.e. one notification if more than 30 minutes are left, notifications are shown every 30 minutes, i.e. one notification if more than 5 minutes are left, notifications are shown every 10 minutes as warnings if more than a minute is left, notifications are shown every 2 minutes as important warnings if about a minute is left, notifications are shown every 1 minute (i.e. one notification) as CRITICAL notification * improved handling of icons use non GTK icons that should work in every DE * improved allowed days and respective limits processing in case these are not set up properly mismatch possible only by manually and incorrectly editing the config file * fix continous time calculation on day change this issue did not affect functionality -- Eduards Bezverhijs Fir, 4 Sep 2020 11:45:09 +0300 timekpr-next (0.4.1-2ubuntu1~ppa1) UNRELEASED; urgency=medium * fixed a packaging bug with systemd units -- Eduards Bezverhijs Thu, 30 Jul 2020 20:13:39 +0300 timekpr-next (0.4.1-1ubuntu1~ppa1) UNRELEASED; urgency=medium * added quality of life configuration options for client application (as suggested by one of Timekpr-nExT users) ** added configuration option to set how long regular notifications should be visible ** added configuration option to set how long Critical notifications should be visible ** if time in seconds is set to 0 for either of options, notification will stay on until dismissed ** added option to play a short (standard) notification bell sound when showing notifications (if supported by current DE) ** added username verification for configuration files ** translations for new options in client application ** added full name display for username * added quality of life improvements to administration app ** added refresh to actual ("realtime") values for users that are logged in ** a little optimization for time refresh in administration application ** added full name display for usernames (if username is the same as full name, show only username) * fixed and changed warnings / suggestions from user foka based on his observations when importing package into Debian: ** adjust code install paths (with support for non-Debian distros as well) ** create metainfo file ** adjust service / desktop / control / install / changelog files ** fixed some lintian warnings (will not be fixing all) ** project README file * changed version numbering scheme * bug fixes in administration application ** time spent / left was shown from previous time (day / week / month) user was logged in -- Eduards Bezverhijs Mon, 27 Jul 2020 13:40:01 +0300 timekpr-next (0.4.0~ppa1~ubuntu2) UNRELEASED; urgency=medium * minor change for debian/install * added Fedora/openSUSE build instructions * improved user detection -- Eduards Bezverhijs Sun, 12 Jul 2020 13:48:36 +0300 timekpr-next (0.4.0~ppa1~ubuntu1) UNRELEASED; urgency=medium * Registered bug fixes: ** killing user sessions that do not have "seats" will not switch to login manager TTY (#1861479) ** properly show time spent for the day in administration app (#1882909) ** properly set any number values (spinbuttons) in admin app (#1826672) ** restore configuration from saved state in admin app when case uncheck / check is pressed (#1826673) ** it's now possible to set daily limits as well as intervals for multiple days at once (#1826671) * Discovered bug fixes: ** fix config / control file recreation in case it's missing a configuration option entirely ** fix icon and time representation in system notification area when user has unlimited time left * Changes / improvements: ** control files (.time) will now contain balance as well as time spent for day (existing TIME_SPENT will be removed, TIME_SPENT_BALANCE and TIME_SPENT_DAY are added) ** console application (timekpra) changes *** rename TIME_SPENT (previously used as saved time spent value) to TIME_SPENT_BALANCE *** added an option which represents hide tray icon option (HIDE_TRAY_ICON) *** rename option "userconfig" to "userinfo" which better represents returned values *** add method to hide tray icon for user (--sethidetrayicon) *** added time left for today (TIME_LEFT_DAY) which is calculated from saved state ** console application (timekpra) improvements - added "live" (i.e. calculated every 3 secs) values for options below *** ACTUAL_TIME_SPENT_SESSION - time spent in this session (since timekpr daemon startup) *** ACTUAL_TIME_INACTIVE_SESSION - time user was inactive in this session (since timekpr daemon startup) *** ACTUAL_TIME_SPENT_BALANCE - time spent balance (including added/removed bonus time) *** ACTUAL_TIME_SPENT_DAY - time user spent this day (actual spent time, example: user has 1 hour, if there was a bonus 1 hr, this will show 2 hrs) *** ACTUAL_TIME_LEFT_DAY - how much time is left today *** ACTUAL_TIME_LEFT_CONTINUOUS - how much time is left continuously (but no more than this and next day) ** timekpr will not switch to login manager TTY after killing a user / session that is not active (i.e. in foreground) ** timekpr will reload user list when opening admin application (newly added users will be available in timekpr right away) ** add time inactive (actual) and time left (actual), i.e. when user is logged in, for admin app ** add translations to new features ** minor GUI changes ** message which informs user that timekpr can not connect to screensaver is now shown only when all notifications are enabled ** client application icon will not show if hide icon is checked in admin app -- Eduards Bezverhijs Wed, 17 Jun 2020 00:33:21 +0300 timekpr-next (0.3.7~ppa1~ubuntu1) UNRELEASED; urgency=medium * Added Czech language (thanks for translations to NOVAK Ludek) * Fixed Hungarian language inclusion (thanks for spotting the typo to NOVAK Ludek) -- Eduards Bezverhijs Tue, 21 Apr 2020 23:19:42 +0300 timekpr-next (0.3.6~ppa1~ubuntu1) UNRELEASED; urgency=medium * Added support for LockedHint to determine whether session is locked ** requires systemd >= 230, e.g. Ubuntu 18.04 at least ** this is in addition to client screensaver detection, but less used (e.g. KDE does not use this) * Exclude closing and lingering sessions from being considered as active when tracking inactive sessions is enabled -- Eduards Bezverhijs Tue, 21 Apr 2020 23:19:42 +0300 timekpr-next (0.3.5~ppa1~ubuntu1) UNRELEASED; urgency=medium * Improved login manager detection for non-standard names * Added a previously forgotten Hungarian language to installation -- Eduards Bezverhijs Sun, 17 Apr 2020 09:56:07 +0300 timekpr-next (0.3.4~ppa1~ubuntu1) UNRELEASED; urgency=medium * Added more screensaver workarounds for implementations for major DEs -- Eduards Bezverhijs Sun, 14 Apr 2020 10:31:32 +0300 timekpr-next (0.3.3~ppa1~ubuntu1) UNRELEASED; urgency=medium * Warn user if screensaver feature is not available for screen idle time detection ** adjust translations as well -- Eduards Bezverhijs Sun, 14 Apr 2020 11:02:31 +0300 timekpr-next (0.3.2~ppa1~ubuntu1) UNRELEASED; urgency=medium * Introduced functionality to limit retries to screensaver for DEs that are not compatible with freedesktop or gnome screensaver interface -- Eduards Bezverhijs Sun, 14 Apr 2020 16:04:02 +0300 timekpr-next (0.3.1~ppa1~ubuntu1) UNRELEASED; urgency=medium * Introduced workarounds section for screensaver dbus interface to use gnome version instead of freedesktop for Unity and Gnome itself -- Eduards Bezverhijs Sun, 13 Apr 2020 16:46:35 +0300 timekpr-next (0.3.0~ppa1~ubuntu1) UNRELEASED; urgency=medium * Added possibility to determine screen lock status reliably for every DE that exposes screensaver status to DBUS (see below) ** It's implemented in client <-> server fashion using org.freedesktop.ScreenSaver ** but as Gnome3 is "special", I had to implement org.gnome.ScreenSaver as well -- Eduards Bezverhijs Sun, 12 Apr 2020 17:10:06 +0300 timekpr-next (0.2.13~ppa1~ubuntu1) UNRELEASED; urgency=medium * Fix time reporting -- Eduards Bezverhijs Mon, 24 Feb 2020 17:39:44 +0300 timekpr-next (0.2.12~ppa1~ubuntu1) UNRELEASED; urgency=medium * Fix time accounting when check interval is exactly at 0 secs in new hour (fixes a bug #1863482) -- Eduards Bezverhijs Mon, 17 Feb 2020 00:08:29 +0300 timekpr-next (0.2.11~ppa1~ubuntu1) UNRELEASED; urgency=medium * Rework time accouting routines (fixes a bug #1861758) * Fix for week and month accounting when showing continous time (#1856744) * Rework session caching routines (for preparation to locking detection) * Fixed dependencies for package * Improvements for old StatusIcon (at start there will be a default icon and labels as with indicator) * Tiny python import cleanup -- Eduards Bezverhijs Fri, 7 Feb 2020 11:29:49 +0300 timekpr-next (0.2.10~ppa1~ubuntu1) UNRELEASED; urgency=medium * Fixed bug in configuration load when only couple of days are allowed per week * Added hungarian translation (thanks) -- Eduards Bezverhijs Sun, 12 Jan 2020 15:46:08 +0300 timekpr-next (0.2.9~ppa1~ubuntu1) UNRELEASED; urgency=medium * Improve user detection when username is the same as one of the login managers * Small improvements with login manager detection * Fix user time accounting due to issues with Python 3.8 and DBUS typecasts -- Eduards Bezverhijs Mon, 25 Nov 2019 19:50:05 +0300 timekpr-next (0.2.8~ppa1~ubuntu1) UNRELEASED; urgency=medium * Fixed an issue for huuuuuuuge icons in in Budgie DE (however other DEs did not show such issue) * A little logging improvement in VTNr search for login managers * User list is now sorted * Fixed an issue with object paths (timekpr uses usernames as part of pathnames) on DBUS which contain dots (.) and/or hyphens (-) -- Eduards Bezverhijs Tue, 24 Sep 2019 01:28:12 +0300 timekpr-next (0.2.7~ppa1~ubuntu1) UNRELEASED; urgency=medium * Fixed an issue when Timekpr-nExT confiuration may get corrupted or empty after sudden power outage ** all config files as well as time accounting files have previous backups (.prev files) ** invalid config / time files will have .invalid files to inspect later ** improved configuration handling by retrieving as much as possible from non-qualified config file (if user messes up config manually) * Improved CLI tools (error checking and help) * Fixed icon handling in race conditions between client and server as well improved icon handling during limit changes -- Eduards Bezverhijs Thu, 22 Aug 2019 19:23:42 +0300 timekpr-next (0.2.6~ppa1~ubuntu1) UNRELEASED; urgency=medium * Fixed an issue with Timekpr-nExT client not starting in non-major DE's (for example Deepin) -- Eduards Bezverhijs Wed, 5 Jun 2019 20:12:12 +0300 timekpr-next (0.2.5~ppa1~ubuntu1) UNRELEASED; urgency=medium * first official release -- Eduards Bezverhijs We, 5 Jun 2019 20:12:12 +0300 timekpr-next (0.2.5~ppa1~ubuntu1) UNRELEASED; urgency=medium * fixed application launcher names for unfortunate Gnome3 users -- Eduards Bezverhijs Wed, 5 Jun 2019 20:12:12 +0300 timekpr-next (0.2.4~ppa1~ubuntu2) UNRELEASED; urgency=medium * localization updates (fixes to translations all over the place, thanks to JP Lord) ** updated all other languages with capitalizations * added French translations -- Eduards Bezverhijs Mon, 29 Apr 2019 12:47:46 +0300 timekpr-next (0.2.4~ppa1~ubuntu1) UNRELEASED; urgency=medium * implemented TTY switching functionality for those cases, when login manager sits on different TTY than session itself (this should fix #1823717) ** the implementation is as follows: Timekpr-nExT tries to determine on which TTY login manager sits and saves it's TTY number, login managers have their ** own users in standard installations, therefore we detect them using specific usernames (maybe not the best solution, but it's a solution) * fixed control file initialization when timekpr starts (fixes #1802583) * fixed icon in notification area when there is no time limit per day, but time intervals are limited * improved termination list handling -- Eduards Bezverhijs Sat, 27 Apr 2019 23:26:05 +0300 timekpr-next (0.2.3~ppa1~ubuntu3) UNRELEASED; urgency=medium * fixed a bug in logging when multiple users use machine at the same time (permission problem) -- Eduards Bezverhijs Sat, 27 Apr 2019 17:50:24 +0300 timekpr-next (0.2.3~ppa1~ubuntu2) UNRELEASED; urgency=medium * kill leftover processes for the user which do not originate from session processes -- Eduards Bezverhijs Sun, 14 Apr 2019 11:51:41 +0300 timekpr-next (0.2.3~ppa1~ubuntu1) UNRELEASED; urgency=medium * kill inactive sessions as well (up until this point inactive sessions were saved from killing) -- Eduards Bezverhijs Sun, 14 Apr 2019 11:51:41 +0300 timekpr-next (0.2.2~ppa1~ubuntu1) UNRELEASED; urgency=medium * logging improvements (all client side logs are written to /tmp instead of HOME) * tweak to translation credits (if none are supplied) -- Eduards Bezverhijs Fri, 12 Apr 2019 15:58:56 +0200 timekpr-next (0.2.1~ppa1~ubuntu2) UNRELEASED; urgency=medium * packaging fix - we do not need to reference login managers any more -- Eduards Bezverhijs Mon, 08 Apr 2019 18:34:31 +0300 timekpr-next (0.2.1~ppa1~ubuntu1) UNRELEASED; urgency=medium * added Italian and German translations -- Eduards Bezverhijs Mon, 8 Apr 2019 8:25:17 +0300 timekpr-next (0.2.0~ppa1~ubuntu1) UNRELEASED; urgency=medium * first beta release -- Eduards Bezverhijs Fri, 29 Mar 2019 8:22:17 +0300 timekpr-next (0.2.0~ppa1~ubuntu1) UNRELEASED; urgency=medium * implemented localization * added Latvian translation -- Eduards Bezverhijs Fri, 29 Mar 2019 8:22:17 +0300 timekpr-next (0.1.15~ppa1~ubuntu1) UNRELEASED; urgency=medium * implemented localization (translations pending) -- Eduards Bezverhijs Thu, 28 Mar 2019 18:27:42 +0300 timekpr-next (0.1.14~ppa1~ubuntu1) UNRELEASED; urgency=medium * timekpr client code optimization and small bug fixes * added speech output TODO: localization -- Eduards Bezverhijs Thu, 21 Mar 2019 21:06:43 +0300 timekpr-next (0.1.13~ppa1~ubuntu1) UNRELEASED; urgency=medium * finalized admin GUI * bug fixes here and there TODO: localization and speech -- Eduards Bezverhijs Mon, 18 Mar 2019 10:33:59 +0300 timekpr-next (0.1.12~ppa1~ubuntu1) UNRELEASED; urgency=medium * finalized user admin GUI * bug fixes here and there TODO: timekpr administration via GUI TODO: localization and speech -- Eduards Bezverhijs Fri, 15 Mar 2019 07:11:23 +0300 timekpr-next (0.1.11~ppa1~ubuntu1) UNRELEASED; urgency=medium * implemented user admin GUI TODO: timekpr administration via GUI TODO: localization and speech -- Eduards Bezverhijs Sun, 03 Mar 2019 00:42:11 +0300 timekpr-next (0.1.10~ppa1~ubuntu1) UNRELEASED; urgency=medium * fixed a bug for time accounting when there is a limit set up, but hours are not limited at all * changed CLI option style from "-" to "--" TODO: timekpr administration via GUI TODO: user administration via GUI TODO: localization and speech -- Eduards Bezverhijs Tue, 26 Feb 2019 23:08:17 +0300 timekpr-next (0.1.9~ppa1~ubuntu1) UNRELEASED; urgency=medium * added weekly and monthly quota administration and processing * minor time accounting fixes TODO: timekpr administration via GUI TODO: user administration via GUI TODO: week and month quotas reporting to user TODO: localization and speech -- Eduards Bezverhijs Fri, 22 Feb 2019 18:11:35 +0300 timekpr-next (0.1.8~ppa1~ubuntu1) UNRELEASED; urgency=medium * fixes for user administration via DBUS and CLI * major time accounting fixes * clean up for user data processor TODO: timekpr administration via GUI TODO: user administration via GUI TODO: week and month quotas TODO: localization and speech -- Eduards Bezverhijs Fri, 15 Feb 2019 6:53:03 +0300 timekpr-next (0.1.7~ppa1~ubuntu1) UNRELEASED; urgency=medium * implemented user administration via DBUS * fixed some bugs with client configuration * fixed logrotate configuration TODO: administration via DBUS and CLI/GUI around it TODO: localization and speech -- Eduards Bezverhijs Thu, 17 Jan 2019 07:35:19 +0300 timekpr-next (0.1.6~ppa1~ubuntu1) UNRELEASED; urgency=medium * fixed issue with time being improperly calculated when user is set from "unlimited" mode to limited * fixed issue about time initialization when day changes and previously user was in "unlimited" mode (mode was changed to limited + he never logged off) TODO: administration via DBUS and CLI/GUI around it TODO: localization and speech -- Eduards Bezverhijs Sun, 18 Dec 2018 20:03:22 +0300 timekpr-next (0.1.5~ppa1~ubuntu1) UNRELEASED; urgency=medium * fixed lazy dbus connection initialization on client side * fixes for client side GUI * minor fixes for time accounting and logging TODO: administration via DBUS and CLI/GUI around it TODO: localization and speech -- Eduards Bezverhijs Sun, 11 Nov 2018 07:55:46 +0300 timekpr-next (0.1.4~ppa1~ubuntu1) UNRELEASED; urgency=medium * first alpha version of timekpr (a lot has changed since old timekpr 0.3x version) ** new impementation of timekpr-revived (there is almost nothing left of timekpr-revived) ** released to very limited testers ** python3 and gtk3 are the must ** all based on DBUS (server and client) ** session management relies on systemd's login1 ** notifications through DBUS (exclusively) ** server is managing everything, except notifications which is the responsibility of client ** major features include the following *** support DE's which implement appindicaor3 (Unity/Gnome3¹/KDE5/...) and legacy statusIcon *** support Ubuntu 12.04+ (on launchpad timekpr can support the versions which are on supported distro list) *** it's possible to configure which session types are accountable *** inactive session time is NOT accounted (if configured so) *** time is configurable by days, hours and minutes (yes, limits within hour are possible) *** there is no "hard" account lock, user will be logged out in 15 seconds if time is over *** synchronous operation between server and client *** improved notifications about system behaviour **** notification about actual limit change **** notification about general configuration change **** notification logic improved **** client acts merely as notificator **** client can view limits applied by admin ¹ one has to install extension to show timekpr icon, otherwise icon is not shown (gnome architects do not want status icons in their design anymore, timekpr can not do anything about it) TODO: administration via DBUS and CLI/GUI around it -- Eduards Bezverhijs Mon, 17 Sep 2018 08:02:17 +0300 timekpr-next/debian/compat000664 001750 001750 00000000002 13476006650 017624 0ustar00bezvfedubezvfedu000000 000000 9 timekpr-next/debian/source/000775 001750 001750 00000000000 13476006650 017726 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/debian/source/format000664 001750 001750 00000000016 13476006650 021136 0ustar00bezvfedubezvfedu000000 000000 3.0 (native) timekpr-next/debian/copyright000664 001750 001750 00000000574 13716566163 020376 0ustar00bezvfedubezvfedu000000 000000 This package was debianized by Eduards Bezverhijs (mjasnik) on Sun, 23 Sep 2018 01:10:17 +0200. Upstream Authors: Eduards Bezverhijs Copyright: 2018-2020 Eduards Bezverhijs All code is released under the GPLv3, see /usr/share/common-licenses/GPL-3 With the exception of the artwork SVG source files, which are released to the Public Domain. timekpr-next/debian/rules000775 001750 001750 00000000235 13476006650 017506 0ustar00bezvfedubezvfedu000000 000000 #!/usr/bin/make -f clean: find . -name "*.pyc" -delete find . -name "__pycache__" -delete #doc/update.sh dh $@ --with python3 %: dh $@ --with python3 timekpr-next/debian/conffiles000664 001750 001750 00000000032 14017261747 020316 0ustar00bezvfedubezvfedu000000 000000 /etc/timekpr/timekpr.conf timekpr-next/spec/000775 001750 001750 00000000000 14064600006 016123 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/spec/README000664 001750 001750 00000006125 14064576266 017033 0ustar00bezvfedubezvfedu000000 000000 INSTALLATION INSTRUCTIONS ------------------------- Fedora / openSUSE: Use whichever GUI your distribution has or: sudo rpm -Uhv VERSIONING ---------- Release less than 1.0 is BETA, 1.0+ is STABLE, example: BETA (release 0.6): timekpr-next-0.5.1-0.6.fc32.x86_64 STABLE (release 7.0): timekpr-next-0.5.0-7.0.fc32.x86_64 NOTES ----- If You are using G3 with Gnome Shell, please DO NOT forget to install this (otherwise icon will be hidden)! Fedora: sudo dnf install gnome-shell-extension-appindicator openSUSE: install "KStatusNotifierItem/AppIndicator Support" extension manually from https://extensions.gnome.org/ Enable extensions if needed (for Fedora install Gnome Tweaks application and enable said extension) Let the user log out and in to see the timekpr-nExT in action. ------------------------- REMOVAL instructions -------------------- Fedora: sudo dnf remove timekpr-next openSUSE: sudo zypper remove timekpr-next ------------------------- BUILD instructions (please open terminal and install this in one go not leaving the terminal (unless You know what to do))! --------------------------------------------------------------------------------------------------------------------------- # set version Fedora / openSUSE: export TNVER="0.5.2" export TNREL="1.0" # install build tools Fedora: sudo dnf install rpmdevtools openSUSE: sudo zypper install rpmdevtools rpm-build # this sets up build tree (rpmbuild dir in home directory) Fedora / openSUSE: rpmdev-setuptree # get the timekpr sources Fedora / openSUSE: wget https://launchpad.net/timekpr-next/stable/${TNVER}/+download/timekpr-next-${TNVER}.tar.gz -P $HOME/rpmbuild/SOURCES/ # got to source directory and get the spec file Fedora / openSUSE: cd $HOME/rpmbuild/SPECS/ tar xzf $HOME/rpmbuild/SOURCES/timekpr-next-${TNVER}.tar.gz --strip-components=2 timekpr-next/spec/timekpr-next.spec # install build dependencies Fedora: sudo dnf builddep timekpr-next.spec sudo dnf install libappindicator-gtk3 python3-psutil openSUSE: sudo zypper install python3 desktop-file-utils appstream-glib systemd sed grep gtk3 python3-dbus-python python3-gobject python3-psutil libayatana-indicator3-7 gettext typelib-1_0-Gtk-3_0 typelib-1_0-AyatanaAppIndicator3-0_1 # build binary package Fedora / openSUSE: rpmbuild -bb timekpr-next.spec # install needs to be adjusted to correct version of distro (example given for FC32) # if installation complains about conflicts with existing package, please remove the old version of package # and then install new one or use --force at the end of the command Fedora / openSUSE: sudo rpm -Uhv $HOME/rpmbuild/RPMS/$(arch)/timekpr-next-${TNVER}-${TNREL}*.x86_64.rpm --------------------------------------------------------------------------------------------------------------------------- timekpr-next/spec/timekpr-next.spec000664 001750 001750 00000014145 14064600020 021427 0ustar00bezvfedubezvfedu000000 000000 %global debug_package %{nil} Name: timekpr-next Version: 0.5.2 Release: 1.0%{?dist} Summary: Keep control of computer usage Group: System Environment/Daemons License: GPLv3 URL: https://launchpad.net/timekpr-next Source0: https://launchpad.net/%{name}/stable/%{version}/+download/%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: ( python3 ) BuildRequires: ( desktop-file-utils ) BuildRequires: ( libappstream-glib or appstream-glib ) BuildRequires: ( systemd ) BuildRequires: ( sed ) BuildRequires: ( grep ) Requires: ( gtk3 >= 3.4 ) Requires: ( polkit ) Requires: ( python3 ) Requires: ( python3-dbus or python3-dbus-python ) Requires: ( python3-gobject ) Requires: ( python3-psutil ) Requires: ( ( libindicator-gtk3 and libappindicator-gtk3 ) or ( typelib-1_0-Gtk-3_0 and ( ( libayatana-indicator3-7 and typelib-1_0-AyatanaAppIndicator3-0_1 ) or ( libindicator3-7 and typelib-1_0-AppIndicator3-0_1 ) ) ) ) Requires: ( gettext ) Requires(post): ( systemd ) Requires(preun): ( systemd ) Requires(postun): ( systemd ) %description Timekpr-nExT is a program that tracks and controls the computer usage of your user accounts. You can limit their daily usage based on a timed access duration and configure periods of day when they can or cannot log in. . This may be used for parental control to limit the amount of screen time a child spends in front of the computer. . Please report any bugs to Timekpr-nExT’s bug tracker on Launchpad at: https://bugs.launchpad.net/timekpr-next %prep %setup -q -n %{name} %build %install # remove all root before build rm -rf $RPM_BUILD_ROOT # install files grep -v -e '^#' -e '^$' debian/install | sed -e 's|/$||' -e 's| lib/systemd/| usr/lib/systemd/|g' -e 's|^\(.\+/\)\(.*\) \(.*\)/\?$|mkdir -p %{buildroot}/\3 ; cp \1\2 %{buildroot}/\3|g' | sh - # install pre/post files mkdir mkdir -p %{buildroot}/%{_sharedstatedir}/timekpr %__cp debian/postinst %{buildroot}/%{_sharedstatedir}/timekpr/%{name}.postinst %__cp debian/postrm %{buildroot}/%{_sharedstatedir}/timekpr/%{name}.postrm # appdata file install -Dpm 644 resource/appstream/org.timekpr.%{name}.metainfo.xml %{buildroot}%{_datadir}/metainfo/org.timekpr.%{name}.metainfo.xml appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/org.timekpr.%{name}.metainfo.xml %post # reload units systemctl daemon-reload # post installation %{_sharedstatedir}/timekpr/%{name}.postinst # update mime / desktop update-mime-database %{_datadir}/mime &> /dev/null || : update-desktop-database &> /dev/null || : %preun # before removal if [ $1 == 0 ]; then %{_sharedstatedir}/timekpr/%{name}.postrm fi %postun # update mime / desktop update-mime-database %{_datadir}/mime &> /dev/null || : update-desktop-database &> /dev/null || : %files # specific purpose files %defattr(-,root,root,-) %doc debian/changelog debian/copyright %config(noreplace) /etc/timekpr/timekpr.conf # package files %{_bindir}/* %{_datadir}/applications/* %{_datadir}/icons/hicolor/128x128/apps/* %{_datadir}/icons/hicolor/48x48/apps/* %{_datadir}/icons/hicolor/64x64/apps/* %{_datadir}/icons/hicolor/scalable/apps/* #%{_datadir}/locale/cs/LC_MESSAGES/* #%{_datadir}/locale/de/LC_MESSAGES/* %{_datadir}/locale/fr/LC_MESSAGES/* #%{_datadir}/locale/hu/LC_MESSAGES/* %{_datadir}/locale/it/LC_MESSAGES/* %{_datadir}/locale/lv/LC_MESSAGES/* %{_datadir}/metainfo/* %{_datadir}/polkit-1/actions/* %{_datadir}/timekpr %{_prefix}/lib/python3/dist-packages/timekpr %{_prefix}/lib/systemd/system/* %{_sharedstatedir}/timekpr %{_sysconfdir}/dbus-1/system.d/* %{_sysconfdir}/logrotate.d/* %{_sysconfdir}/timekpr %{_sysconfdir}/xdg/autostart/* %changelog * Wed Jun 23 2021 Eduards Bezverhijs - 0.5.2-1.0 - Updated spec file for version 0.5.2, release 1.0 (STABLE) * Tue Jun 22 2021 Eduards Bezverhijs - 0.5.2-0.5 - Updated spec file for version 0.5.2, release 0.5 (BETA) * Wed Jun 16 2021 Eduards Bezverhijs - 0.5.2-0.4 - Updated spec file for version 0.5.2, release 0.4 (BETA) * Wed Jun 9 2021 Eduards Bezverhijs - 0.5.2-0.3 - Updated spec file for version 0.5.2, release 0.3 (BETA) * Mon Jun 7 2021 Eduards Bezverhijs - 0.5.2-0.2 - Updated spec file for version 0.5.2, release 0.2 (BETA) * Fri May 7 2021 Eduards Bezverhijs - 0.5.2-0.1 - Updated spec file for version 0.5.2, release 0.1 (BETA) * Fri Mar 5 2021 Eduards Bezverhijs - 0.5.1-2.0 - Updated spec file for version 0.5.1, release 2.0 (STABLE) * Fri Mar 5 2021 Eduards Bezverhijs - 0.5.1-0.10 - Updated spec file for version 0.5.1, release 0.10 (BETA) * Wed Feb 17 2021 Eduards Bezverhijs - 0.5.1-0.8 - Updated spec file for version 0.5.1, release 0.8 (BETA) * Thu Jan 7 2021 Eduards Bezverhijs - 0.5.0-8.0 - Updated spec file for version 0.5.0, release 8 (STABLE) * Tue Dec 29 2020 Eduards Bezverhijs - 0.5.0-7.0 - Updated spec file for version 0.5.0, release 7 (STABLE) * Thu Dec 17 2020 Eduards Bezverhijs - 0.5.0-4.0 - Updated spec file for version 0.5.0, release 4 (BETA) * Tue Dec 1 2020 Eduards Bezverhijs - 0.5.0-3.0 - Updated spec file for version 0.5.0, release 3 (BETA) * Wed Nov 18 2020 Eduards Bezverhijs - 0.5.0-2.0 - Updated spec file for version 0.5.0, release 2 (BETA) * Sun Nov 1 2020 Eduards Bezverhijs - 0.5.0-1.0 - Updated spec file for version 0.5.0 (BETA) * Sat Oct 31 2020 Eduards Bezverhijs - 0.4.4-1.0 - Updated spec file for version 0.4.4 (STABLE) * Tue Sep 8 2020 Eduards Bezverhijs - 0.4.3-1.0 - Updated spec file for version 0.4.3 (STABLE) * Tue Aug 18 2020 Eduards Bezverhijs - 0.4.2-1.0 - Updated spec file for version 0.4.2 (STABLE) * Wed Jul 15 2020 Eduards Bezverhijs - 0.4.1-1.0 - Updated spec file for version 0.4.1 (STABLE) * Fri Jul 10 2020 Eduards Bezverhijs - 0.4.0-1.0 - Initial version of the spec file (STABLE) timekpr-next/spec/debian.install.2.spec.install.sh000775 001750 001750 00000000734 13716566163 024135 0ustar00bezvfedubezvfedu000000 000000 #!/bin/bash # convert debian install file to RPM install file list grep -v -e '^#' -e '^$' ../debian/install | sort | sed \ -e 's|/\+$||' \ -e 's|^\(.\+/\)\(.\+\) \(.\+\)$|/\3|g' \ -e 's|\(.\+\)\(/timekpr\)/.\+$|\1\2|g' \ -e '/\/timekpr$/! s|$|/*|' \ -e 's|/usr/share/|%{_datadir}/|' \ -e 's|/usr/bin/|%{_bindir}/|' \ -e 's|/usr/|%{_prefix}/|' \ -e 's|/etc/|%{_sysconfdir}/|' \ -e 's|/var/lib/|%{_sharedstatedir}/|' \ -e 's|/lib/systemd/|%{_prefix}/lib/systemd/|' \ | sort -u timekpr-next/README.md000664 001750 001750 00000150250 14064575714 016474 0ustar00bezvfedubezvfedu000000 000000 # Timekpr-nExT ## Keep control of computer usage Timekpr-nExT, a fresh, simple and easy to use screen time managing application that helps optimizing time spent at computer for your subordinates, children or even for yourself. The application is targeted at parents or supervisors to optimize / limit time spent at computer as they see fits their situation.
## Overview Timekpr-nExT is designed to keep control of computer usage, which implies forcibly terminating user sessions and / or other types of restrictions and limitations. Please be responsible and inform your users that their time is accounted and their work might be terminated abruptly, although notifications can be configured to warn them. In fact, notifications are mostly in their own hands :)
Supervisor, when setting up limitations, please read the description of options and explore application before you enforce some option on user. Combination of options will give very tailored experience, but remember - Timekpr-nExT is a restrictive application.
_**Note**: information in this README is updated along with ```beta``` releases, if you do not find a particular option in ```stable``` series, please wait until it's released or use ```beta```._
## Navigation guide **This README** is useful, but quite large, so I have prepared a guide for You. * About functionality: - a short description of [applications](#applications) with [typical use case](#typicalusecase) - to better understand functionality click on [description of functionality](#detaileddescription) and particularly [client application](#clientapplication) and [administration application](#administrationapplication) - latest prominent features introduced are [suspend/lock/shutdown](#restrictionlockouttypes), [PlayTime functionality](#playtimeconfiguration), [user configurable notifications](#userconfigurablenotifications), ["freeride" time periods](#freerideintervals) - to get information about CLI (console) use / file configuration possibilities [additional configuration possibilities](#additionalconfigpossibilities) * Support the project: - support by **[donating](#support)** or translating it to your [language](#translate) * Installation guide: - installation / removal [instructions](#installation) for most popular Linux systems * Disclaimer, questions, suggestions and bugs: - disclaimer is [here](#disclaimer) and information about questions, suggestions and bugs is [here](#bugs)
## Applications overview Timekpr-nExT has two user facing applications which governs its behaviour.
#### Timekpr-nExT Client indicator icon An application and indicator icon which takes care of showing the time, limits and notifications to the user. ![Timekpr-nExT icon](https://git.launchpad.net/timekpr-next/plain/resource/screenshots/timekpr-next-screenshot-icon-system-notification-area.png) _Informational "padlock" icon in they system notification area which is what user is automatically seeing when logged in._
#### Timekpr-nExT Client application Client application itself is activated by clicking on the icon and choosing menu "Limits & configuration", it contains more detailed information and some useful configuration options. ![Timekpr-nExT Client application](https://git.launchpad.net/timekpr-next/plain/resource/screenshots/timekpr-next-screenshot-client.png) _Application shows detailed information about limits as well as allows to configure certain aspects of functionality._
#### Timekpr-nExT Administration application An administration application for supervisors or parents to configure time limits for any user in the system as well as configure technical aspects of Timekpr-nExT. ![Timekpr-nExT Administration application](https://git.launchpad.net/timekpr-next/plain/resource/screenshots/timekpr-next-screenshot-admin.png) _Application has multiple configuration options organized in tabs to tailor experience as desired._
#### Core of the Timekpr-nExT The invisible part of the Timekpr-nExT is the background service, sometimes referred as daemon, not demon :), which takes care of monitoring the system and enforcing restrictions and limits. There is no nice picture for it, but mark my word, it's there working for you ;)
## Description of functionality This section describes what and how Timekpr-nExT does its thing rather than descriptive information about every configuration option. **Please note** that to describe configuration options, Timekpr-nExT heavily relies on tool-tip / hint functionality, please navigate mouse over to any configuration option and read its description, it usually helps to understand it better.
### Overall features Timekpr-nExT tries to be as precise as possible and as much nice to user as restrictive software can be. One of the things that has to be in place to accomplish that, is predictable and precise time accounting. Timekpr-nExT accounts time every 3 seconds by default and gives clear time / limits information to user. Another thing is that time must not be accounted when it doesn't have to, so it tries to avoid accounting inactive session time. By inactive I mean user that is not using computer either because another user is using the computer via user switching functionality or user's session is locked. Time is not accounted, obviously, when computer is put to sleep too. The rest is up to supervisor to decide. Read on to have complete understanding of all functionality Timekpr-nExT offers.
### Administration application Administration application is used to configure time limits and restrictions for users as well as technical options for Timekpr-nExT itself. To run administration application you either need to run it as superuser or you need to add yourself to ```timekpr``` system group to have password-less access to configuration. Running as superuser is straightforward, open your favourite dock / launcher / application list and choose "(SU) Timekpr-nExT Control Panel (superuser mode)". _Note: "(SU)" was added in front of application names because some earlier Gnome3 versions simply truncated longer application names and it was indistinguishable between the modes._ Running as part of the group requires more involvement. Add yourself to timekpr group either by your favourite user administration application which should be provided by your favourite desktop environment or simply run ```sudo gpasswd -a $USER timekpr``` (change $USER to proper username for administration, if it differs from currently logged in one and do NOT put your subordinate's username there ;)). The user who was added to ```timekpr``` group will need to log out and in for this to work.
_**Please note**: certain configuration options are not accessible when running in password-less mode, they're not related to user configuration and should be used very seldom in very special cases, however running in superuser mode grants all access to all options._
### User configuration To configure limits and restrictions for user, it has to be selected from the user list. User list is retrieved from your system and initial configuration is applied. _**Please note**: when opening administration application no user is pre-selected, this is by design to force a supervisor to choose a correct user to configure and avoid unintentional misconfiguration._
#### Tab "Info & today" As the title implies, this section shows information about how much time user has spent and how much time he has left. Some of the information is shown only when user is logged in, but some of the information is from saved state only. Live information is more accurate and allows to monitor user in realtime, however saved state will be shown always. Time adjustment controls are used, for example, if a supervisor decides to reward user with greater time allowance just for this day. Of course reward is not always a choice to make, so it's possible to penalise user too. Keep in mind that adding more time will not override allowed time periods and general time allowance, you'll read about them later in this README. Pro tip: use tool-tips to find more information.
There's a special time value called "Continuous time available" which means exactly that - a time which is available to use continuously depending on time allowance and allowed time period setup, however it's not counted for more than this and the next days together. Continuous time may span this and next days, which means that user will be able to use computer across midnight, it's only possible when this days time period ends at 24:00 and next days time period starts at 00:00.
#### Tab "Limit configuration" This tab allows you to configure time limitations for users. Combine options to have the setup tailored to your view of user's order of the day. Before explaining how to configure them, I'll give two most common setup variants for the limits: * set time allowance to whole day and limit access to specific time periods, example: 24hrs of allowance and 9:00-12:00, 13:00-16:00 and 19:00-21:00 * set time allowance to allowed hours a day and set time periods when user can use computer, example: 8hrs of allowance and 9:00-21:00 period when to spend those 8hrs _**Please note** that time values follow ISO 8601 standard, in other words it means that first week day is Monday and hours are displayed in 24h format._ --------------------------------------- ##### Week day limits This section presents configuration for every week day. Namely one can select on which days user can use computer as well as adjust a time limit for every day. Days have to be enabled / disabled for every day separately, but limits can be adjusted for multiple days at once. Just select multiple days, select what you would like to adjust - hours or minutes and press "+" or "-" button. Simple as that :) Another way of editing a single day limit is to to click on the limit inside the table and edit it by hand. This way one can edit seconds too, not that I recommend it, but the possibility is there. When defining a limit one can use shortcuts, namely - entering 7 will result in 07:00:00 (hours:minutes:seconds), entering 7:1:15 will result in 07:01:15. By default every day is enabled and user have all the time available. --------------------------------------- ##### Hour intervals Hour intervals define time periods when user can use the computer. These can be configured on per day basis, however it's possible to configure them for multiple days at once, just select multiple days and configure time periods. The configuration itself is simple too. To create an interval, press create button and specify start and end of the time period by clicking on created interval inside the table. When defining the intervals one can use shortcuts, namely - entering 7 will result in 07:00 (hour:minute), entering 7:15 will result in 07:15. There's a special setting for time interval indicated as "∞" (unaccounted time intervals). Basically this setting means that time spent in this time period will not be accounted towards user's daily allowance, i.e. it's free time for him. In addition to that, this allows the user to use computer even if he has no time left all. This setting can be useful in case user has a special arrangement, such as online courses at specific times, so he does not spend his personal limit on them. Please keep in mind that intervals themselves **cannot** overlap in any way, however it's possible to have intervals ending and starting continuously, for example, intervals 7:00-13:00 and 13:00-14:30 can coexist, but don't be surprised when adjacent intervals are merged into one. Be aware, that if there's a break in time periods, even just for one minute, user will face whatever restriction is set for him. Be aware that there's is a specific design choice in place which governs that one hour can not contain more than one time period. Time period, however, can fully fit within an hour, start in it or end there, i.e. time periods 7:15-9:15 and 9:45-14:30 cannot be entered, but time periods 7:15-9:00 and 9:45-14:30 are allowed. After entering intervals, one have to press "verify" button for application to know that one, you know, did not made a typo :) If intervals are ok, one can apply the configuration. When time periods are misconfigured, both conflicting intervals will be highlighted. By default whole day is available. --------------------------------------- ##### Weekly and monthly limits This section allows to adjust weekly and monthly time allowances. Just select a period and a time unit of day, hour or minute and press "+" or "-" buttons to adjust the limits. Another way of editing a limit is to to click on the limit inside the table and edit it by hand. This way one can edit seconds too, not that I recommend it, but the possibility is there. When defining a limit one can use shortcuts, namely - entering 7 will result in 06:00:00:00 (days:hours:minutes:seconds), entering 6:10:5:11 will result in 06:10:05:11. These limits work together with daily limits and hour intervals, user's time is the least of the limits. By default whole week and month is allowed, which is the common use case, one does not have to modify these values when daily limits are in use.
#### PlayTime configuration PlayTime is screen time limiting mode for applications / processes in the system, which in context of PlayTime, are called "activities". PlayTime extends time limit configuration and accounting by greater control over how long certain applications can run. In other words, this functionality works as a process monitor of sorts. PlayTime allows users to use certain applications for the configured period of time. If time allowance is all used, applications are terminated. Running them again will result in termination. Please keep in mind that generally PlayTime is a special limit within a standard time limit, therefore all rules of standard time limits and allowances fully apply, except "override" mode, which will be explained in the options section. This mode was designed for games, hence the name, but a supervisor can define any application to be monitored, for example Web browsers. _**Please note** that PlayTime will still account user's PlayTime even in time periods which are marked as free ("∞") in standard time configuration! Except in "override" mode, that is :)_ --------------------------------------- ##### PlayTime options This section provides controls for PlayTime enablement and so called PlayTime override mode. PlayTime has to be enabled for every user separately and if it's not enabled, obviously, PlayTime will not work for this user. Be sure to enable [PlayTime master switch](#playtimemasterswitch) to enable PlayTime accounting in the system, otherwise it will not work even if it's enabled for the user. By default, PlayTime is not enabled.
There's a special "override" mode for PlayTime already mentioned above. There is a big difference from standard restrictive mode. In this mode PlayTime allowance and limits are disabled and user's time spent at computer is only accounted when applications configured as activities are used. That means that unless user uses computer for configured activities, it's free time for him.
Option "Allowed during "∞" intervals" controls whether PlayTime activities are allowed to run during unaccounted time intervals which are marked as "∞". If this option is disabled, user will not be able to run any of the configured activities regardless of whether "override" mode is enabled or not! However, if this option is enabled, user can use any of the activities configured for him even in unaccounted time intervals. In this case PlayTime will be accounted as usual, unless "override" mode is enabled at the same time. As an example, this option can come handy, if time intervals marked as "∞" are used to attend mandatory education classes and supervisor does not want to allow a subordinate to run any of the configured activities during unaccounted time intervals. Just do not enable the option and you are set. By default the option is enabled. --------------------------------------- ##### PlayTime limits PlayTime limits are similar to standard time limits and allowances, configuration is the same, but these only apply to PlayTime. If certain day is disabled for PlayTime, user can not use any of configured activities - they will be terminated immediately. _**Please note** that PlayTime limits are not effective when "override" mode is used._ --------------------------------------- ##### PlayTime activities This is the most important section for PlayTime. Here one configures what are the activities to be monitored, but please keep in mind that this list is not a allowlist or denylist of applications. PlayTime functionality requires the supervisor to set up process masks for each activity he wants to limit. This may involve running process monitor from your favourite desktop environment, console / terminal or even remotely via SSH. The reason for this is that Linux is completely open. This in itself is great, but that means that any software can be installed anywhere even in multiple copies and even user itself can do it! Yes, games in Lutris or Steam and so on. Installed software does not scream out load "hey, I'm a game!", so a supervisor has to determine that.
So here's a generic guide how to determine processes or their masks which can be used in activity configuration. At first, especially if you have not seen terminal, this may look scary, but you always can use graphical tools to achieve this. KDEs and Gnomes "System monitor" does this pretty well, look for process name or command or commandline columns, they are your best friends in this. You can always ask your favourite web search engine or community how to determine process executable name. Since process mask for PlayTime activity is basically a name of executable or full command line in case ["Enhanced activity monitor"](#playtimeenhancedactivitymonitor) is enabled (case sensitive!), a simple ```top -c -d 1``` in terminal usually will do the trick to find one. Games, when running, usually use most resources compared to anything else, so they will be on top. Watch for COMMAND column. If the process looks very much like activity you want to limit, take actual executable name, without path, and fill it in the process mask field. Here's the example for Discord Canary, in the process list I see ```/opt/discord-canary/DiscordCanary --type=renderer ...```, only ```DiscordCanary``` is the part you need. It's located after last slash and before arguments. Some games on Linux behaves badly when Alt-Tabbing them, so connect to computer via SSH and determine a process name from there. You can enter the description of activity too, it will be shown to user instead of actual process mask. If description is not entered, the actual mask is shown to the user.
**Please note** that process masks can accept RegExp (not glob!) expressions, albeit with some restrictions, but keep in mind that this is an expert option! Please do verify that your RegExp is correct and it actually works, misusing them may end up killing unwanted user processes or may not match anything at all! If RegExp is not correct, it will be used as literal strings. For example, ```*wine*``` is **not** a correct RegExp, ```.*wine.*``` is. Failing to specify this correctly will end up searching processes which are literary ```*wine*```, which obviously does not exist usually. Please note that RegExp will not work with one of these symbols ```[]``` and one should not use one of these ```^$``` either. Consider your RegExp will always match the whole executable name or executable name and parameters in case "Enhanced process monitor" is enabled. The simple example is if one entered a process mask ```.*wine.*``` it will basically be converted to ```^.*wine.*$``` and ```/.*wine.*$``` internally. It's worth mentioning that PlayTime employs a smart caching algorithms and tries to get the process list in a very efficient way. Only processes that are run as particular user are monitored, accounted and terminated. In addition to that PlayTime logic works only when there are users that have PlayTime enabled and there are at least some activities configured.
#### Tab "Additional options" As the name suggests this section has additional per user configuration options. By enabling track inactive sessions every user session will be accounted, even if they are locked or other user is currently using the computer. Enable with care. Hide icon and notifications does exactly that, it hides Timekpr-nExT client icon and hides most notifications too. Only critical notifications are shown. If you enable this to unrestricted user, he will not even notice Timekpr-nExT is there :)
Restriction & lockout type governs what type of action will be executed when time for the user will run out. _**Note**: please be careful if choosing non-default option, think ahead and figure out whether other options are suited for your use case!_ --------------------------------------- ##### terminate sessions This is the default option and a restrictive one. It terminates user sessions, that is, user is forcibly logged out without asking much questions. --------------------------------------- ##### shutdown computer This is another restrictive option, when time runs out, the computer will be shut down. Please use with caution, especially in multi-user environments! --------------------------------------- ##### suspend computer This is lockout option. That is when time runs out computer is suspended. Option is more suited for self control rather than restrict computer usage, due to the fact that sessions aren't terminated. When computer is woken up at the moment when there is no time left, but user does not unlock the computer, it stays that way. If computer is unlocked, then instead of suspend, the screen is locked. This behaviour was put in place to avoid excessive turn on / off of computer for regular user, however if user unlocked computer a lot of times ~ 20, then it will be suspended. --------------------------------------- ##### suspend / wakeup computer This is lockout option, very similar to plain suspend, but with a catch - computer will be woken up at next available time period for that day. It will be woken up only if Timekpr-nExT was the one who put it to sleep. Additionally you need to specify hour interval when computer may be woken up automatically. If next available time period is outside of configured interval, computer will NOT be woken up! **Please note** that wakeup time is dependent on BIOS / UEFI support for RTC wakeup. If there is no support for it or it is disabled, computer will NOT be woken up! --------------------------------------- ##### lock screen This is lockout option. When time runs out, computer screen is locked. If computer is unlocked when there is still no time left, it will be locked again shortly. Simple as that :) Option is more suited for self control rather than restrict computer usage.
### Timekpr-nExT configuration This tab allows a supervisor to configure certain technical aspects how Timekpr-nExT behaves. These options usually doesn't have to be changed as they are tuned to their optimal values.
#### Timekpr-nExT control options This section contains various knobs to finetune time accounting and enforce limits. --------------------------------------- ##### Final notification Notification configuration is now a users responsibility, so he may decide to remove all notifications altogether, which may not be the best way to be informed about imminent log out. This option comes to rescue, it will force a one final notification on user (which can still be disabled by user) to inform about the imminent restriction enforcement. --------------------------------------- ##### Termination time This option specifies number of seconds left for user before enforcing the selected lockout / restriction on him. When this many seconds are left, user is added to the restriction list and will start to face them. This can be prevented by adding more time allowance or when user becomes inactive, so the scenario when user locks computer to go to supervisor to ask for more time allowance is plausible. --------------------------------------- ##### Countdown time This option specifies number of seconds left for user before a countdown for the selected lockout / restriction starts. Countdown is continuous notification stream about very last seconds left. --------------------------------------- ##### Poll interval This option specifies the rate in seconds at which Timekpr-nExT processes users, their sessions and calculates time values for them. This option can somewhat be considered as resolution of time accounting too. --------------------------------------- ##### Save time This option specifies the rate in seconds at which Timekpr-nExT saves calculated time values to disk. Theoretically this means that if computer crashes this should be the max time that can be lost / unaccounted. --------------------------------------- ##### Log level This is the log level, high the level more information is written to log files. Level 1 is the minimal level which will save space but will not give me enough information in case you file a bug, level 2 is the standard level, it usually writes sufficient level of information for problem solving. Level 3 is the "crazy" value which prints way too much cryptic in memory structures which may be interesting to me, but not to non-developer. If everything is working fine for you, set the level to 1, otherwise leave it at default value. Be assured that log files doesn't contain anything sensitive except usernames. Log level changes are effective immediately. **Please note** that log files are handled by ```logrotate``` and are compressed, so I wouldn't worry about space usage on a standard computer.
#### Tracked sessions There are multiple session types on Linux systems. By default Timekpr-nExT tracks graphical sessions that are running on "x11" (xorg), "wayland" and "mir". The two most common types used 99.99% of all desktop Linux installations are "x11" and "wayland", however "mir" is not, but support to detect these is still in place, so it's left there just in case. Please keep in mind that there are no more session types than these and the ones mentioned in excluded sessions option, please do not modify this unless you know what you are doing.
#### Excluded sessions By default Timekpr-nExT does not track sessions from "tty" (console logins that are accessible by pressing Ctrl+Alt+F[1-7]) and "unspecified" which are the rest. Please do not modify this unless you know what you are doing. In case you really need to track console sessions too, please remove "tty" from this list and add it to the tracked sessions list.
#### Excluded users This section allows supervisor to exclude certain **system** users from accounting. This section is meant to exclude users that do create sessions, but are not used to log in directly, e.g. login managers. Please do not enter normal users here as that will not work and cause errors when client will try to obtain information from daemon!
#### Additional options Currently there are couple of options, all related to PlayTime.
##### PlayTime enabled "PlayTime enabled" controls **master switch for PlayTime** functionality. I has to be turned on to enable PlayTime globally, if it's switched off, none of the users will have their activities accounted regardless of individual PlayTime setting!
##### Enhanced activity monitor "Enhanced activity monitor" option controls whether PlayTime functionality will use first 512 characters of full process commandline, including process arguments, to match proccesses against registered activity / process masks for users. This allows a supervisor to use advanced RegExp patterns to find not just a process name, but a great deal of arguments too. This option may be useful for situatuations when there are processes running interpreted language, such as python or java. The most common gaming example is Minecraft, which is a java application started from jar file, a process mask for it would be ```.*java.*minecraft.*```. _**Note**: after changing this option, enhanced monitoring is applied to newly started processes only!_
### Client application Timekpr-nExT client application provides time metrics and configuration possibilities to user. Since the user is the one who actually face the restrictions, the configuration possibilities are limited. User can use tool-tips / hints to get more information on every value of the application by navigating mouse over the displayed information. Please look at the [information representation differences](#desktopenvironmentdifferences) which may affect the way application looks to user.
#### Daily limits Daily limits shows daily time allowance, time period restrictions and time spent / left set by supervisor. Most important metrics are continuous time left and time periods when user can use the computer. Timekpr-nExT will change icon color depending on how much time is left for user, however this configuration is in user's own [hands](#userconfigurablenotifications). If time period has "∞" sign besides it, the time for this period will not be counted towards the user's limit, i.e. free time for the user. Additionally, when user has unaccounted time intervals and that time has come, icon color will change from whatever color it was to gray indicating that this time is not accounted in any way. When unaccounted time interval ends, the color of the icon will change according to user notification configuration.
#### Additional limits Additional limits show weekly and monthly limits set by supervisor as well as time spent so far during this week and month.
#### PlayTime limits This tab shows time allowance and activity list for PlayTime. Description of PlayTime can be found in [PlayTime administration part](#playtimeconfiguration) of this guide. User is able to see what type of PlayTime mode is enabled and what are the limits for this day. Tab shows active PlayTime activity count too as well as description of activities that are being monitored / restricted. Please note that this tab is not available to user if supervisor has not enabled PlayTime for the user.
#### Notifications This is the first tab where user can make adjustments to tailor Timekpr-nExT behaviour to his needs. User can define a time left threshold when he'll be notified about how much time is left. He can assign a priority of notification as well. There is a separate section for standard time left and PlayTime left notification configuration. Please note that PlayTime notification configuration is not shown to user if supervisor has not enabled PlayTime for the user. More information can be found by viewing tool-tips of the configuration table.
#### Configuration This tab allows user to configure additional options to tailor Timekpr-nExT to his needs. User is able to control whether seconds are shown besides the icon, whether all and limit change notifications are shown. It's possible to set up sound notification too, by installing ```python3-espeak``` package. There are configuration options for normal and critical notifications, sound "bell" when notifications are shown and technical log level too. More information on every option can be found in tool-tips. _**Please note** that there seems to be a [bug](#quirkssound) in sound notifications._
## Typical use case Let's imagine a situation that Liane had to limit computer time for Cartman because he uses computer way too much to talk to Kyle and Stan _(but not Kenny, because he doesn't have a computer ;-))_ about messing up a day for Mr. Garrison or something along these lines. Due to his behaviour he has to attend online anger management classes to improve his behaviour in general. So, Liane is thinking to introduce rather flexible time limit within strict time window for working days and holidays, in addition to that she reserves 2 hours from 15:00 - 17:00 on Monday for mandatory anger management classes. Timekpr-nExT comes handy, Liane opens Timekpr-nExT Administration application makes configuration as follows: * choose username "cartman" and switch to "Limit configuration" tab * select Monday: - add interval from 7:30 - 15:00 - add interval from 15:00 - 17:00, check the "∞" checkbox - add interval from 17:00 - 21:00 * select days from Tuesday through Friday: - set time limit to 6 hours - add interval from 7:30 - 21:00 * select last two days - holidays: - add interval from 9:00 - 22:30 - set time limit to 8 hours * press "Apply daily limits" and restrictions are set
By this she achieves flexibility of: * allowing 6 hours of computer time to be used from 7:30 to 21:00 from Monday to Friday - allowing the use of computer from 15:00 - 17:00 without the need of spending his limit on mandatory anger management classes * allowing 8 hours of computer time from 9:00 - 22:30 during holidays * Cartman can not use his computer before outside of defined time periods and over the specified time allowance
Typical setup is rather simple and easy, there are (of course) more to it, please read on [Detailed information](#detaileddescription), if You're interested.
## Installation / removal First step to start using Timekpr-nExT is to install it, right? :-) Basically there are two versions - beta and stable, usually they are not that different, but beta comes out earlier, especially when changes in upcoming version are larger. The installation instructions are easy as well (I know that one can do that in GUI, but terminal is just simply faster :-)), just paste these lines in terminal and You're set. _Note: it's highly advised to log in and out after installation of new version._
Timekpr-nExT is available in: * my PPA (Personal Package Archive) for Ubuntu and compatible distributions * Timekpr-nExT is available in AUR (ArchLinux User Repository) for ArchLinux and Manjaro * packages for Fedora 32+ and openSUSE Leap 15.2+ are provided as is, link below
#### Stable | Distribution | Stable install | Stable remove | | :--- | :--- | :--- | | Ubuntu & co (via PPA) | ```sudo add-apt-repository ppa:mjasnik/ppa```
```sudo apt-get update```
```sudo apt-get install timekpr-next``` | ```sudo apt-get remove --purge timekpr-next``` | | ArchLinux & Manjaro (via AUR) | ```yay -S timekpr-next``` | ```sudo pacman -Rdd timekpr-next``` | | Fedora and openSUSE | [manual installation](https://drive.google.com/drive/folders/1iN1wcPctGhd_OISqzWZ5DigFMVvgSGq9)
_(README and packages)_| [manual uninstallation](https://drive.google.com/drive/folders/1iN1wcPctGhd_OISqzWZ5DigFMVvgSGq9)
_(README)_ | #### Beta | Distribution | Beta install | Beta remove | | :-- | :--: | --: | | Ubuntu & co (via PPA) | ```sudo add-apt-repository ppa:mjasnik/ppa```
```sudo apt-get update```
```sudo apt-get install timekpr-next-beta``` | ```sudo apt-get remove --purge timekpr-next-beta``` | | ArchLinux & Manjaro (via AUR) | ```yay -S timekpr-next-git``` | ```sudo pacman -Rdd timekpr-next-git``` | _**Note**: for ArchLinux and Manjaro, please choose Your favourite AUR helper, if that differs from mine._ _**Note**: special thanks goes to SanskritFritz from ArchLinux community who was not only one of the first beta testers and active users, but he maintains said packages too._
#### Debian Until recently there was no easy way of using Timekpr-nExT in Debian, but thanks to Sim (smntov) and Anthony Fok (foka), Timekpr-nExT is available in Debian as native installation. The preferred method of installing Timekpr-nExT in Debian is the same as in Ubuntu: | Stable install | Stable remove | Beta | | :--- | :--- | :--- | | ```sudo apt-get update```
```sudo apt-get install timekpr-next``` | ```sudo apt-get remove --purge timekpr-next``` | Not available | **Note**: it might be possible to use a package made for ["sid"](https://packages.debian.org/sid/timekpr-next) in other versions of Debian, if dependencies are satisfied. For example, a package for "sid" (unstable) works in "buster" (10.7) just fine.
Of course, you can use any graphical software installer that comes with Debian too, like "KDE Discover" or "GNOME Software". **Note**: for Debian please use a package created for Debian.
## Compatibility I'm developing Timekpr-nExT to be compatible with most Desktop Environments, I have somewhere around 20 VMs where I test bigger changes, but I can not and will not test everything in the open. I have tested that KDE, Gnome, Cinnamon, MATE, XFCE works in Ubuntu compatible OS, Manjaro / ArchLinux (which are my distributions of choice) and Debian. Recently I started testing in Fedora and openSUSE too. Please read [nuances](#quirks) section for more information. If You have an issue with Timekpr-nExT, please read [this](#bugs) and file a bug.
## Information representation differences Not every desktop environment is made the same, there are differences how information is shown to user. --------------------------------------- ##### icon differences The icon in system notification area is the one that differs. Gnome3 / Unity / XFCE / etc. show icon as well as detailed label besides it, however KDE / Deepin show only the icon without label. However, hovering mouse over the icon, actual time left is revealed. --------------------------------------- ##### extension might be needed On some distributions which use Gnome3 or other desktop environment based on Gnome3, a specific extension has to be enabled for icon to be shown. Usually the extension is provided by distribution itself, but in case it's not, please install [Appinicator Support](https://extensions.gnome.org/extension/615/appindicator-support/) extension manually. --------------------------------------- ##### notification timeouts / severity Some desktop environments can and will override timeout settings specified in Timekpr-nExT configuration. Sometimes they are configurable, but sometimes they are not. KDE Plasma has the best respect regarding notifications I have found so far. So unfortunately, unless you use desktop environment that respect custom values for notification timeouts, you will face the preconfigured ones. --------------------------------------- ##### the icon & future There's a possible future issue that can surface when Gnome3 will remove [status icon](https://wiki.gnome.org/Initiatives/StatusIconMigration/Guidelines) functionality. When the time comes if at all, I'll try to figure out what to do about it.
## Short and very technical overview **Warning**: this section is **very technical** and has no information that regular users of Timekpr-nExT would (possibly) want to know.
Timekpr-nExT is built with technologies which heavily use DBUS for it's interaction with the system. Not only it uses interfaces provided by various solutions, it exposes own interfaces to DBUS too. It allows Timekpr-nExT to be integrated into any client application or control panel which supports DBUS interactions.
### Interfaces used The main interface used is systemd's [login1](https://www.freedesktop.org/wiki/Software/systemd/logind/) session management interface, without it Timekpr-nExT will not work. It tries to use FreeDesktops screensaver [interfaces _(better source needed)_](https://people.freedesktop.org/~hadess/idle-inhibition-spec/ch05.html) as well as notification [interfaces](https://specifications.freedesktop.org/notification-spec/latest/ar01s09.html) too. In case FreeDesktop screensaver interfaces are not available, it tries to use [Gnome's](https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html). Timekpr-nExT makes connections to DBUS objects, they are cached and during execution, it mostly just calls.
### Additional configuration possibilities In addition to graphical applications, Timekpr-nExT can be configured using tools available in CLI (Command Line Interface) and config files (by hand).
#### CLI (Command Line Interface) mode Timekpr-nExT Administration application can be run in terminal to obtain information on users and configure limits at the same functional level as in graphical mode. Please note that at this time CLI interface is available for user configuration only. For CLI usage, please open your terminal emulator of choice (i.e. Gnome Terminal / Konsole / XTerm) and type ```sudo timekpra --help```, it will introduce you to Timekpr-nExT CLI by printing usage notes and examples. **Please note** that CLI usage follows the same security principles as graphical application - either you have to be in the ```timekpr``` group, execute it as ```root``` or use ```sudo``` to access its functionality even in CLI mode. Timekpr-nExT Administration application in both modes apply configuration in real-time, i.e. configuration is effective immediately.
#### Configuration by files It's possible to edit configuration files directly to achieve the same as with tools provided by Timekpr-nExT. In this case configuration will be read and applied at save intervals (by default, every 30 sec). **Note**: please be aware that configuration files are structured in particular way, have internal representation of values and one can break the configuration if not being careful. You have been warned :) **Note**: if configuration files are borked, e.g. Timekpr-nExT can not interpret them properly, it will try to salvage options it can and it will recreate the config file with defaults for damaged options.
**Configuration files (be careful editing them)** | The purpose of the file | File location | | --: | :-- | | Timekpr-nExT main configuration file | ```/etc/timekpr/timekpr.conf``` | | User configuration files (one per user) | ```/var/lib/timekpr/config/timekpr.*.conf``` | | User control files (one per user) | ```/var/lib/timekpr/work/timekpr.*.conf``` | | Client configuration file | ```$HOME/.config/timekpr/timekpr.conf``` |
### Log files Log files are the files where Timekpr-nExT writes it's messages about execution, including a performance counters. Files are not meant to be inspected by users on regular basis, **there's nothing interesting nor understandable for non technical users**. However it's possible to look at them to find technical details about state of Timekpr-nExT or investigate the problematic behaviour and errors. These are the files I'll be asking in case something does not work as expected. By default Timekpr-nExT writes a sufficiently detailed log file for me to understand the problem area quite well, but that means that there are a lot of messages in log files. There's nothing sensitive except usernames, if this is a concern, please obfuscate them before sending the files to me or attaching them to bug reports. Since the version ```0.5.1```, log level changes are effective immediately and there is no need to restart Timekpr-nExT or reboot the computer. _**Note**: if the log file size is the concern, it's possible to decrease log level in Timekpr-nExT administration application to save some space, however when the issue arises, most likely I'll need it to be set to level 2 (the default)._
**Log files** | Logging area | File location | | --: | :-- | | Daemon log file | ```/var/log/timekpr.log``` | | Client application log files | ```/tmp/timekprc.*.log``` | | Administration application log files | ```/tmp/timekpra.*.log``` |
### Quirks Linux distributions (i.e. Ubuntu, Fedora, Mint, ...) ecosystem is large, nice, diverse and all those good things, but not everything there adheres to the same standards, so naturally there are some differences here and there, which affects Timekpr-nExT looks and/or functionality. When I started designing / developing Timekpr-nExT I was pretty much sure how to implement desired functionality as I have _looked into_ standards and _tested particular implementation_ in Ubuntu 16.04 (Unity) and it's clear what to expect, i.e. standards are standards and every implementation which uses them, should be roughly the same. Roughly it was ;-) Most of the time, everything worked perfectly, but for certain functionality every Desktop Environment has it's own quirks, maybe not using all bits or maybe it's just buggy implementation. This section will contain these oddities / differences in implementations as far as Timekpr-nExT development is concerned. If You find odd why things happen or not happen the way You expect, maybe here's an answer ;-) --------------------------------------- _**NOTE**: the situation with quirks may change in the future, I have observed that with every new release of distributions / desktop environment software stack or frameworks, situation gets better, so this information may become stale at some point! I'll try to address it, but since Timekpr-nExT tries to support as much versions and distributions as possible, it may still apply to older version of the distributions or desktop environments..._ --------------------------------------- ##### sound "bell" notifications Currently it's known that if user has enabled ```Use sound "bell" for notifications```, then critical notifications might not show on Desktop, they are registered and can be seen in notification register, though. --------------------------------------- ##### blinking cursor of the left side of screen Timekpr-nExT is heavily using ```login1``` DBUS interfaces to accomplish what it does. One of the things is user session termination. Timekpr-nExT asks ```login1``` to terminate user session(s), but sometimes that ends up in black screen and a blinking cursor. This is a case when screen is not switched to login manager screen. So I have implemented a workaround that after user sessions are terminated, it tries to switch to login manager. For this to work I have developed a logic that tries to detect where's the login manager and usually it's possible when computer boots up, so restarting or upgrading Timekpr-nExT without rebooting while you have this issue, might end up in blinking cursor. Please restart to fix this. --------------------------------------- ##### locking the screen Due to differences in using the standards not every Desktop Environment works equally well with time accounting for locked screen. Some Linux distributions which are using Gnome3 and desktop environments based on it, require screen to be locked and switched off before session is considered locked. KDE, XFCE and multiple other desktop environments require screen to be just locked for session to be considered inactive. Deepin (for example) does not get along Timekpr-nExT with screen locking at all, because their implementation differs from major players and is not exactly compatible with the FreeDesktop / Gnome standards. --------------------------------------- ##### technical nuances * when user closes / opens laptops lid multiple times, ```org.freedesktop.login1``` sometimes reports session as inactive despite a user is happily using the computer * _by default Timekpr-nExT does not account time for inactive sessions, so it's free time for them unless "inactive session tracking" is turned on_ * some Desktop Environments have ```org.freedesktop.ScreenSaver``` exported to DBUS, but it's not fully functional, i.e. ```GetActive``` always reports _"not active"_ or there's an error about method not implemeted * _this is used for idle time accounting_ * when asking systemd ```org.freedesktop.login1.Manager``` to terminate a single active user session, certain Desktop Environments does not automatically switch to login screen * _a surprise for unaware user (he is left with black screen and blinking cursor in the corner)_ * after ```org.freedesktop.login1.Manager``` ```TerminateSession``` is called for inactive session and that session is terminated, some Desktop Environments switch to login screen even different session for different user is in foreground / active, but the rest of Desktop Environments _"don't blink an eye about background session termination"_ * _a surprise for unaware user_ * some Desktop Environments consider user session to be inactive by setting property ```IdleHint``` in ```org.freedesktop.login1``` session when screen is locked, some do the same but only when screen turns off and some do not that all * _this is used for idle time accounting_ * systemd ```LockedHint``` is set and used by some Desktop Environments, for some Desktop Environments it's set only when screen is off and some do not use it at all * _this is used for idle time accounting_
So, there are inconsistencies and at times it was quite tricky / required workarounds to get the solution to be compatible with most popular Desktop Environments at the same functionality level.
## How You can help Quite a lot of time and effort went into making this a reality, so if You appreciate my work, would like to say thanks for making Timekpr-nExT or just want to contribute, please do so via PayPal (you do not need to have PP account) or BITCOIN: * The PayPal donations URL (shortened): https://tinyurl.com/yc9x85v2 . * BITCOIN address: bc1q57wapz6lxfyxex725x3gs7nntm3tazw2n96nk3
As a matter of fact, I'm starting to look for a replacement of my year 2001 Chicony keyboard with more programming / ergo oriented one which can be used in gaming too, like Dygma Raise. I will be happy for any help getting it ;)
Alternatively, You can help to translate Timekpr-nExT in Your language [here](https://translations.launchpad.net/timekpr-next) too.
## Disclaimer Timekpr-nExT development started because I was not happy with the old Timekpr I brought back to useful state. I had complaints from my kid about precision of accounting, session termination behaviour and some others I don't remember anymore :) So, development was mainly driven by a technical challenge to use better available technologies and giving the best functionality to my kid. However, it's not the case anymore for quite a long time (more than a year already). My kid has grown up and is rather responsible in his actions, so there is no need to use time restrictions. That was a long way of saying that I'm not using Timekpr-nExT myself anymore :) What does that mean, you may ask? Honestly, it changes some things. One thing that changed for sure is that I'm not intentionally proactive in feature development. Latest features I introduced were suggested, some even backed, by users! Another thing is that I'm not giving it a long term testing as before when my kid used it. So, if this application is sufficient for your needs, good, consider saying [thanks](#support), if not, suggest features or improvements and if they end up in Timekpr-nExT consider saying [thanks](#support) afterwards.
## Suggestions and bugs Please register suggestions and bugs [here](https://bugs.launchpad.net/timekpr-next). As for questions, please ask them [here](https://answers.launchpad.net/timekpr-next). _**Please prefix** a title of the bug with ```BETA``` if the bug was found in beta version._ Alternatively suggestions can be sent to me via e-mail ```edzis"replace this with at symbol"inbox"place a dot here"lv```, I'll evaluate their usefulness and who knows, they may see a light of the day. As for bugs: please describe Your issues as precisely as possible including a steps to fully reproduce the issue, if applicable, describe Your setup too, i.e. which distribution, version of OS, Desktop Environment are You using, be prepared to send me config and log files (they do not contain anything sensitive, except usernames). If you don't want to register a user in LP, you can send bug reports via e-mail too, but it's NOT the best way to handle them! I'll do my best to address them as my free time allows.
Thanks for choosing Timekpr-nExT! timekpr-next/common/000775 001750 001750 00000000000 13476006650 016474 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/common/constants/000775 001750 001750 00000000000 14064575714 020516 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/common/constants/constants.py000664 001750 001750 00000042527 14064575714 023116 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # timekpr imports from timekpr.common.constants import messages as msg # imports import dbus import locale import gettext from datetime import datetime # ## constants ## # version (in case config is corrupt or smth like that) TK_VERSION = "0.5.2" TK_DEV_ACTIVE = False # change this accordingly when running in DEV or PROD TK_DEV_BUS = "ses" # this sets up which bus to use for development (sys or ses) TK_DEV_SUPPORT_PAGE = "https://tinyurl.com/yc9x85v2" # formats TK_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" TK_LOG_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S.%f" TK_DATETIME_START = datetime(2018, 1, 1) # logging levels TK_LOG_LEVEL_NONE = 0 TK_LOG_LEVEL_INFO = 1 TK_LOG_LEVEL_DEBUG = 2 TK_LOG_LEVEL_EXTRA_DEBUG = 3 # logging properties TK_LOG_L = "lvl" TK_LOG_D = "dir" TK_LOG_W = "who" TK_LOG_U = "user" TK_LOG_TEMP_DIR = "/tmp" TK_LOG_PID_EXT = "pid" # logging clients TK_LOG_OWNER_SRV = 0 TK_LOG_OWNER_CLIENT = 1 TK_LOG_OWNER_ADMIN = 2 TK_LOG_OWNER_ADMIN_SU = 3 # default event count for log file flush TK_LOG_AUTO_FLUSH_EVT_CNT = 42 # client config and default values TK_CL_NOTIF_MAX = 30 TK_CL_NOTIF_TMO = 3 TK_CL_NOTIF_CRIT_TMO = 10 TK_CL_NOTIF_SND_FILE_WARN = "/usr/share/sounds/freedesktop/stereo/dialog-information.oga" TK_CL_NOTIF_SND_FILE_CRITICAL = "/usr/share/sounds/freedesktop/stereo/dialog-error.oga" TK_CL_INF_FULL = "F" TK_CL_INF_SAVED = "S" TK_CL_INF_RT = "R" # ## files and locations ## # users and login configuration TK_USERS_FILE = "/etc/passwd" TK_USER_LIMITS_FILE = "/etc/login.defs" # backup extension TK_BACK_EXT = ".prev" # log files TK_LOG_USER = "" TK_LOG_FILE = "timekpr.log" TK_LOG_FILE_CLIENT = "timekprc..log" TK_LOG_FILE_ADMIN = "timekpra..log" TK_LOG_FILE_ADMIN_SU = "timekpra.su.log" # main config file TK_MAIN_CONFIG_DIR = "/etc/timekpr" # runtime directory for timekpr user configuration files TK_CONFIG_DIR = "/var/lib/timekpr/config" # runtime directory for timekpr time control files TK_WORK_DIR = "/var/lib/timekpr/work" # directory for shared files (images, gui definitions, etc.) TK_SHARED_DIR = "/usr/share/timekpr" # directory for log files TK_LOGFILE_DIR = "/var/log" # localization TK_LOCALIZATION_DIR = "/usr/share/locale" # ## development ## # main config file TK_MAIN_CONFIG_DIR_DEV = "../resource/server" # runtime directory for timekpr user configuration files TK_CONFIG_DIR_DEV = "../../runtime.tmp" # runtime directory for timekpr time control files TK_WORK_DIR_DEV = "../../runtime.tmp" # directory for shared files (images, gui definitions, etc.) TK_SHARED_DIR_DEV = "../resource" # directory for log files TK_LOGFILE_DIR_DEV = "../../runtime.tmp" # localization TK_LOCALIZATION_DIR_DEV = "../resource/locale" # retry cnt for various actions TK_MAX_RETRIES = 5 # max symbols to search for pattern in cmdline for PlayTime TK_MAX_CMD_SRCH = 512 # ## dbus ## # common TK_DBUS_PROPERTIES_INTERFACE = "org.freedesktop.DBus.Properties" # login1 TK_DBUS_L1_OBJECT = "org.freedesktop.login1" TK_DBUS_L1_PATH = "/org/freedesktop/login1" TK_DBUS_L1_MANAGER_INTERFACE = "org.freedesktop.login1.Manager" # ck TK_DBUS_CK_OBJECT = "org.freedesktop.ConsoleKit" TK_DBUS_CK_PATH = "/org/freedesktop/ConsoleKit" TK_DBUS_CK_MANAGER_INTERFACE = "org.freedesktop.ConsoleKit.Manager" # seat / user / session / screensaver TK_DBUS_SEAT_OBJECT = "org.freedesktop.login1.Seat" TK_DBUS_USER_OBJECT = "org.freedesktop.login1.User" TK_DBUS_SESSION_OBJECT = "org.freedesktop.login1.Session" # path / objects / interfaces TK_DBUS_BUS_NAME = "com.timekpr.server" TK_DBUS_SERVER_PATH = "/com/timekpr/server" TK_DBUS_ADMIN_INTERFACE = "com.timekpr.server.admin" TK_DBUS_USER_NOTIF_PATH_PREFIX = "/com/timekpr/server/user/" TK_DBUS_USER_NOTIF_INTERFACE = "com.timekpr.server.user.notifications" TK_DBUS_USER_LIMITS_INTERFACE = "com.timekpr.server.user.limits" TK_DBUS_USER_SESSION_ATTRIBUTE_INTERFACE = "com.timekpr.server.user.sessionattributes" TK_DBUS_USER_ADMIN_INTERFACE = "com.timekpr.server.user.admin" # actual user session validation and control TK_CTRL_SCR_N = "scrs" TK_CTRL_SCR_K = "scrs:key" TK_CTRL_SCR_R = "scrs:retr" # WORKAROUNDS section for use in Gnome and similar (almost everyone makes their own screensaver dbus interface these days, KDE (of the biggest players) is not) TK_SCR_XDGCD_OVERRIDE = [ ["GNOME", "gnome"], ["UNITY", "gnome"], ["MATE", "mate"], ["XFCE", "xfce"], ["CINNAMON", "cinnamon"]] # DBUS performance measurement TK_DBUS_ANSWER_TIME = 3 # user and their restriction constants TK_CTRL_UID = "UID" # user id TK_CTRL_UNAME = "UNAME" # user name TK_CTRL_UPATH = "UPATH" # user path on dbus TK_CTRL_FCNTD = "FCNTD" # final countdown TK_CTRL_RESTY = "RESTY" # restricton type: lock, suspend, suspendwake, terminate, shutdown TK_CTRL_RTDEL = "RTDEL" # retry delay before next attempt to enforce restrictions TK_CTRL_RTDEA = "RTDEA" # retry delay (additional delay for lock in case of suspend) TK_CTRL_USACT = "USACT" # whether user is active TK_CTRL_USLCK = "USLCK" # whether user screen is locked TK_CTRL_USWKU = "USWKU" # wake up time for computer if one is specified TK_CTRL_LCDEL = 1 # lock cycle delay (how many ticks happen before repetitive lock) TK_CTRL_SCDEL = 20 # suspend cycle delay (how many ticks happen before repetitive suspend) # restriction / lockout types TK_CTRL_RES_L = "lock" TK_CTRL_RES_S = "suspend" TK_CTRL_RES_W = "suspendwake" TK_CTRL_RES_T = "terminate" TK_CTRL_RES_D = "shutdown" # wake up RTC file TK_CTRL_WKUPF = "/sys/class/rtc/rtc0/wakealarm" # session properties TK_CTRL_DBUS_SESS_OBJ = "SESSION_OBJECT" TK_CTRL_DBUS_SESS_IF = "SESSION_INTERFACE" TK_CTRL_DBUS_SESS_PROP_IF = "SESSION_PROPERTIES_INTERFACE" TK_CTRL_DBUS_SESS_PROP = "SESSION_STATIC_PROPERTIES" # limit configuration TK_CTRL_NDAY = "NEXTDAY" # next day idx TK_CTRL_PDAY = "PREVDAY" # previous day idx TK_CTRL_LIMITD = "LIMITD" # limit idx / today TK_CTRL_LEFTD = "LEFTD" # time left today idx TK_CTRL_LEFT = "LEFT" # time left idx (continously) TK_CTRL_LEFTW = "LEFTW" # time left for week TK_CTRL_LEFTM = "LEFTM" # time left for month TK_CTRL_LCHECK = "LCHK" # last checked idx TK_CTRL_LSAVE = "LSAVE" # last saved idx TK_CTRL_LMOD = "LMOD" # file modification idx (control) TK_CTRL_LCMOD = "LMCOD" # file modification idx (config) TK_CTRL_LIMITW = "LIMITW" # left per week idx TK_CTRL_LIMITM = "LIMITM" # left per month idx TK_CTRL_ACT = "ACTIVE" # is hour enabled TK_CTRL_UACC = "UACC" # is hour unaccounted TK_CTRL_SLEEP = "SLEEP" # time spent in "inactive" TK_CTRL_SPENT = "SPENT" # time spent in this session TK_CTRL_SPENTBD = "SPENTBD" # time balance spent in this day TK_CTRL_SPENTH = "SPENTH" # time spent in this hour TK_CTRL_SPENTD = "SPENTD" # time spent in this day TK_CTRL_SPENTW = "SPENTW" # time spent for week TK_CTRL_SPENTM = "SPENTM" # time spent for month TK_CTRL_SMIN = "STARTMIN" # start minute in this hour TK_CTRL_EMIN = "ENDMIN" # end minute in this hour TK_CTRL_INT = "INTERVALS" # intervals of time available to user TK_CTRL_TRACK = "TRACKI" # whether to track inactive sessions TK_CTRL_HIDEI = "HIDEI" # whether to hide timekpr icon TK_CTRL_TNL = "TNL" # time not limited TK_CTRL_PTTLE = "PTTLE" # PlayTime enabled TK_CTRL_PTCNT = "PTCNT" # PlayTime counters TK_CTRL_PTSPD = "PTSPD" # time spent for PlayTime TK_CTRL_PTLPD = "PTLPD" # time left for PlayTime TK_CTRL_PTTLO = "PTTLO" # PlayTime limit override TK_CTRL_PTAUH = "PTAUH" # PlayTime allowed during unaccounted intervals TK_CTRL_PTLMT = "PTLMT" # time limits for each day for PlayTime TK_CTRL_PTLST = "PTLST" # process list for PlayTime TK_CTRL_PTLSTC = "PTLSTC" # process list count for PlayTime # notificaton limits TK_NOTIF_LEFT = "LEFT" TK_NOTIF_INTERVAL = "INTERVAL" TK_NOTIF_URGENCY = "URGENCY" # notification idx config TK_ICON_NOTIF = "NOTIF-ICON" TK_ICON_STAT = "STATUS-ICON" TK_DBUS_PRIO = "DBUS-PRIO" # session types (and whether they are subject to termination) # "unspecified" (for cron PAM sessions and suchalike), "tty" (for text logins) or "x11"/"mir"/"wayland" (for graphical logins). # real TK_SESSION_TYPES_CTRL = "x11;wayland;mir" TK_SESSION_TYPES_EXCL = "tty;unspecified" # exclude users (test user for timekpr and all known login managers) TK_USERS_TEST = "testtimekpr" TK_USERS_LOGIN_MANAGERS = "gdm;gdm3;kdm;lightdm;mdm;lxdm;xdm;sddm;cdm" TK_USERS_EXCL = "%s;%s" % (TK_USERS_TEST, TK_USERS_LOGIN_MANAGERS) # ## user defaults ## # default value for allowed hours TK_ALLOWED_HOURS = "0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23" # default value for allowed week days TK_ALLOWED_WEEKDAYS = "1;2;3;4;5;6;7" # default value for limit per hour TK_LIMIT_PER_MINUTE = 60 # default value for limit per hour TK_LIMIT_PER_HOUR = 3600 # default value for limit per day TK_LIMIT_PER_DAY = 86400 # default value for limit per week TK_LIMIT_PER_WEEK = TK_LIMIT_PER_DAY*7 # default value for limit per month TK_LIMIT_PER_MONTH = TK_LIMIT_PER_DAY*31 # default value for limit per every weekday TK_LIMITS_PER_WEEKDAYS = "%s;%s;%s;%s;%s;%s;%s" % (TK_LIMIT_PER_DAY, TK_LIMIT_PER_DAY, TK_LIMIT_PER_DAY, TK_LIMIT_PER_DAY, TK_LIMIT_PER_DAY, TK_LIMIT_PER_DAY, TK_LIMIT_PER_DAY) # default value for nitification levels TK_NOTIFICATION_LEVELS = "3600[3];1800[2];600[1];300[0]" TK_PT_NOTIFICATION_LEVELS = "180[1]" # ## user PlayTime defaults ## # enabled TK_PLAYTIME_ENABLED = False # default value for allowed week days TK_PLAYTIME_ALLOWED_WEEKDAYS = "1;2;3;4;5;6;7" # how much PlayTime is allowed per allowed days TK_PLAYTIME_LIMITS_PER_WEEKDAYS = "0;0;0;0;0;0;0" # ## default values for control ## # time control # in-memory poll time TK_POLLTIME = 3 # flush interval TK_SAVE_INTERVAL = 30 # time left for putting user on kill list TK_TERMINATION_TIME = 15 # time left for final warning time TK_FINAL_COUNTDOWN_TIME = 10 # time left for final warning time TK_FINAL_NOTIFICATION_TIME = 60 # default value for tracking inactive sessions TK_TRACK_INACTIVE = False # default value for tracking inactive sessions TK_HIDE_TRAY_ICON = False # ## files ## # config TK_MAIN_CONFIG_FILE = "timekpr.conf" TK_USER_CONFIG_FILE = "timekpr.%s.conf" TK_UNAME_SRCH_LN_LMT = 10 # this defines line count for verifying username in first n lines # ## timekpr notification config ## # priorites TK_PRIO_LOW = "low" TK_PRIO_NORMAL = "normal" TK_PRIO_WARNING = "warning" TK_PRIO_IMPORTANT = "important" TK_PRIO_CRITICAL = "critical" TK_PRIO_IMPORTANT_INFO = "important_info" TK_PRIO_UACC = "unaccounted" # notification levels mapping from / to codes TK_PRIO_LVL_MAP = {"4": TK_PRIO_UACC, "3": TK_PRIO_LOW, "2": TK_PRIO_WARNING, "1": TK_PRIO_IMPORTANT, "0": TK_PRIO_CRITICAL, TK_PRIO_UACC: "4", TK_PRIO_LOW: "3", TK_PRIO_WARNING: "2", TK_PRIO_IMPORTANT: "1", TK_PRIO_CRITICAL: "0"} # config TK_PRIO_CONF = {} TK_PRIO_CONF["logo"] = {TK_ICON_STAT: "timekpr-logo.svg", TK_ICON_NOTIF: "dialog-information", TK_DBUS_PRIO: dbus.Byte(0, variant_level=1)} TK_PRIO_CONF["client-logo"] = {TK_ICON_STAT: "timekpr-client-logo.svg", TK_ICON_NOTIF: "dialog-information", TK_DBUS_PRIO: dbus.Byte(0, variant_level=1)} TK_PRIO_CONF["unlimited"] = {TK_ICON_STAT: "timekpr-padlock-unlimited-green.svg", TK_ICON_NOTIF: "dialog-information", TK_DBUS_PRIO: dbus.Byte(0, variant_level=1)} TK_PRIO_CONF[TK_PRIO_LOW] = {TK_ICON_STAT: "timekpr-padlock-limited-green.svg", TK_ICON_NOTIF: "dialog-information", TK_DBUS_PRIO: dbus.Byte(0, variant_level=1)} TK_PRIO_CONF[TK_PRIO_NORMAL] = {TK_ICON_STAT: "timekpr-padlock-limited-green.svg", TK_ICON_NOTIF: "dialog-information", TK_DBUS_PRIO: dbus.Byte(1, variant_level=1)} TK_PRIO_CONF[TK_PRIO_WARNING] = {TK_ICON_STAT: "timekpr-padlock-limited-yellow.svg", TK_ICON_NOTIF: "dialog-warning", TK_DBUS_PRIO: dbus.Byte(1, variant_level=1)} TK_PRIO_CONF[TK_PRIO_IMPORTANT] = {TK_ICON_STAT: "timekpr-padlock-limited-red.svg", TK_ICON_NOTIF: "dialog-warning", TK_DBUS_PRIO: dbus.Byte(1, variant_level=1)} TK_PRIO_CONF[TK_PRIO_CRITICAL] = {TK_ICON_STAT: "timekpr-padlock-limited-red.svg", TK_ICON_NOTIF: "dialog-error", TK_DBUS_PRIO: dbus.Byte(2, variant_level=1)} TK_PRIO_CONF[TK_PRIO_IMPORTANT_INFO] = {TK_ICON_STAT: "timekpr-padlock-limited-yellow.svg", TK_ICON_NOTIF: "dialog-information", TK_DBUS_PRIO: dbus.Byte(1, variant_level=1)} TK_PRIO_CONF[TK_PRIO_UACC] = {TK_ICON_STAT: "timekpr-padlock-limited-uacc.svg", TK_ICON_NOTIF: "dialog-warning", TK_DBUS_PRIO: dbus.Byte(1, variant_level=1)} # ## timekpr notification config ## # init python gettext gettext.bindtextdomain("timekpr", TK_LOCALIZATION_DIR if not TK_DEV_ACTIVE else TK_LOCALIZATION_DIR_DEV) gettext.textdomain("timekpr") # init actual libc gettext locale.bindtextdomain("timekpr", TK_LOCALIZATION_DIR if not TK_DEV_ACTIVE else TK_LOCALIZATION_DIR_DEV) locale.textdomain("timekpr") # define admin commands TK_ADMIN_COMMANDS = { # "--setloglevel" : "" # ,"--setpolltime" : "" # ,"--setsavetime" : "" # ,"--settrackinactive" : "" # ,"--setterminationtime" : "" # ,"--setfinalwarningtime" : "" # ,"--setsessiontypes" : "" # ,"--setexcludedsessiontypes" : "" # ,"--setexcludedusers" : "" } # define user admin commands TK_USER_ADMIN_COMMANDS = { "--help" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_HELP"), "timekpra --help"), "--userlist" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_USERLIST"), "timekpra --userlist"), "--userinfo" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_USERCONFIG"), "timekpra --userinfo 'testuser'"), "--setalloweddays" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETALLOWEDDAYS"), "timekpra --setalloweddays 'testuser' '1;2;3;4;5'"), "--setallowedhours" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETALLOWEDHOURS"), "timekpra --setallowedhours 'testuser' 'ALL' '7;8;9;10;11[00-30];!14;!15;17;18;19;20[00-45]'"), "--settimelimits" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETTIMELIMITS"), "timekpra --settimelimits 'testuser' '7200;7200;7200;7200;10800'"), "--settimelimitweek" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETTIMELIMITWK"), "timekpra --settimelimitweek 'testuser' '50000'"), "--settimelimitmonth" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETTIMELIMITMON"), "timekpra --settimelimitmonth 'testuser' '200000'"), "--settrackinactive" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETTRACKINACTIVE"), "timekpra --settrackinactive 'testuser' 'false'"), "--sethidetrayicon" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETHIDETRAYICON"), "timekpra --sethidetrayicon 'testuser' 'false'"), "--setlockouttype" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETLOCKOUTTYPE"), "timekpra --setlockouttype 'testuser' 'terminate'\n timekpra --setlockouttype 'testuser' 'suspendwake;7;18'"), "--settimeleft" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETTIMELEFT"), "timekpra --settimeleft 'testuser' '+' 3600"), "--setplaytimeenabled" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETPLAYTIMEENABLED"), "timekpra --setplaytimeenabled 'testuser' 'false'"), "--setplaytimelimitoverride" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETPLAYTIMELIMITOVERRIDE"), "timekpra --setplaytimelimitoverride 'testuser' 'false'"), "--setplaytimeunaccountedintervalsflag" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETPLAYTIMEUNACCOUNTEDINTARVALSFLAG"), "timekpra --setplaytimeunaccountedintervalsflag 'testuser' 'false'"), "--setplaytimealloweddays" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETPLAYTIMEALLOWEDDAYS"), "timekpra --setplaytimealloweddays 'testuser' '1;2;3;4;5'"), "--setplaytimelimits" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETPLAYTIMELIMITS"), "timekpra --setplaytimelimits 'testuser' '1800;1800;1800;1800;3600'"), "--setplaytimeactivities" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETPLAYTIMEACTIVITIES"), "timekpra --setplaytimeactivities 'testuser' 'DOOMEternalx64vk.exe[Doom Eternal];csgo_linux[CS: GO];firefox[Firefox browser]'"), "--setplaytimeleft" : "%s:\n %s" % (msg.getTranslation("TK_MSG_USER_ADMIN_CMD_SETPLAYTIMELEFT"), "timekpra --setplaytimeleft 'testuser' '+' 3600") } def getNotificationPrioriy(pPriority): """Get the proper notification level""" # if we have it, just return it, else fallback to logo if pPriority in TK_PRIO_CONF: result = pPriority else: result = "logo" # return return result # this defines messages for use in notifications TK_MSG_CODE_TIMEUNLIMITED = "TIME_UNLIMITED" TK_MSG_CODE_TIMELEFT = "TIME_LEFT" TK_MSG_CODE_TIMECRITICAL = "TIME_CRITICAL" TK_MSG_CODE_TIMELEFTCHANGED = "TIME_LIMIT_CHANGED" TK_MSG_CODE_TIMECONFIGCHANGED = "TIME_CONFIG_CHANGED" TK_MSG_CODE_REMOTE_COMMUNICATION_ERROR = "TIMEKPR_REMOTE_COMMUNICATION_ERROR" TK_MSG_CODE_REMOTE_INVOCATION_ERROR = "TIMEKPR_REMOTE_INVOCATION_ERROR" TK_MSG_CODE_ICON_INIT_ERROR = "TIMEKPR_ICON_INIT_ERROR" TK_MSG_CODE_FEATURE_SCR_NOT_AVAILABLE_ERROR = "TIMEKPR_SCR_FEATURE_NOT_AVAILABLE_ERROR" timekpr-next/common/constants/messages.py000664 001750 001750 00000071202 14017261747 022675 0ustar00bezvfedubezvfedu000000 000000 """ Created on Mar 19, 2019 @author: mjasnik """ # imports from gettext import ngettext as _translatePlural from gettext import gettext as _translateSingle def _(pMsgS): """Make automated tools like poedit to pick up translations, which will actually be translated later""" return pMsgS def __(pMsgS, pMsgP): """Make automated tools like poedit to pick up translations, which will actually be translated later""" return pMsgS, pMsgP # ## This module is responsible for all message translations for timekpr ## """Initialize all stuff for messages""" # messages _messages = {} def initMessages(): """Initialize all messages""" # ## define user admin command texts ## _messages["TK_MSG_USER_ADMIN_CMD_HELP"] = {"s": _("==> print help, example")} _messages["TK_MSG_USER_ADMIN_CMD_USERLIST"] = {"s": _("==> get saved user list from the server, example")} _messages["TK_MSG_USER_ADMIN_CMD_USERCONFIG"] = {"s": _("==> get user configuration and time information from the server, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETALLOWEDDAYS"] = {"s": _("==> set allowed days for the user, example")} # TRANSLATORS: please DO NOT translate the keyword "ALL" _messages["TK_MSG_USER_ADMIN_CMD_SETALLOWEDHOURS"] = {"s": _("==> set allowed hours for the specified day, or \"ALL\" for every day, optionally specify start and end minutes in brackets like this [x-y], additionally specify ! in front of hour if it doesn't have to be accounted (free time for user), example")} _messages["TK_MSG_USER_ADMIN_CMD_SETTIMELIMITS"] = {"s": _("==> set time limits for all allowed days, the number of values must not exceed the allowed days for the user, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETTIMELIMITWK"] = {"s": _("==> set time limit per week, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETTIMELIMITMON"] = {"s": _("==> set time limit per month, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETTRACKINACTIVE"] = {"s": _("==> set whether to track inactive user sessions, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETHIDETRAYICON"] = {"s": _("==> set whether to hide tray icon and prevent notifications, example")} # TRANSLATORS: please DO NOT translate the keywords: "lock", "suspend", "suspendwake", "terminate", "shutdown" _messages["TK_MSG_USER_ADMIN_CMD_SETLOCKOUTTYPE"] = {"s": _("==> set restriction / lockout type (\"lock\" - lock session, \"suspend\" - suspend the computer, \"suspendwake\" - suspend and wake up, \"terminate\" - terminate sessions, \"shutdown\" - shutdown the computer), examples")} _messages["TK_MSG_USER_ADMIN_CMD_SETTIMELEFT"] = {"s": _("==> set time left for the user at the current moment of time: \"+\" (add time), \"-\" (subtract time), \"=\" (set exact time available), example (add one hour)")} _messages["TK_MSG_USER_ADMIN_CMD_SETPLAYTIMEENABLED"] = {"s": _("==> set whether PlayTime is enabled for the user, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETPLAYTIMELIMITOVERRIDE"] = {"s": _("==> set whether PlayTime must be accounted instead of normal activity, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETPLAYTIMEUNACCOUNTEDINTARVALSFLAG"] = {"s": _("==> set whether PlayTime activities are allowed during unaccounted (\"∞\") intervals, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETPLAYTIMEALLOWEDDAYS"] = {"s": _("==> set allowed days for PlayTime activities, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETPLAYTIMELIMITS"] = {"s": _("==> set PlayTime limits for all allowed days, the number of values must not exceed the allowed PlayTime allowed days for the user, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETPLAYTIMEACTIVITIES"] = {"s": _("==> set PlayTime activity process masks, for which the time is accounted, example")} _messages["TK_MSG_USER_ADMIN_CMD_SETPLAYTIMELEFT"] = {"s": _("==> set PlayTime left for the user at the current moment of time: \"+\" (add time), \"-\" (subtract time), \"=\" (set exact time available), example (add one hour)")} # ## this defines messages for use in configuration validation ## _messages["TK_MSG_ADMIN_CHK_CTRLSESSIONS_NONE"] = {"s": _("Control sessions types are not passed")} _messages["TK_MSG_ADMIN_CHK_CTRLSESSIONS_INVALID"] = {"s": _("Control sessions types list is not correct")} _messages["TK_MSG_ADMIN_CHK_CTRLSESSIONS_INVALID_SET"] = {"s": _("Control sessions types list is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_EXCLSESSIONW_NONE"] = {"s": _("Excluded session types are not passed")} _messages["TK_MSG_ADMIN_CHK_EXCLSESSIONS_INVALID"] = {"s": _("Excluded session types list is not correct")} _messages["TK_MSG_ADMIN_CHK_EXCLSESSIONS_INVALID_SET"] = {"s": _("Excluded session types list is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_EXCLUSERS_NONE"] = {"s": _("Excluded user list is not passed")} _messages["TK_MSG_ADMIN_CHK_EXCLUSERS_INVALID"] = {"s": _("Excluded user list is not correct")} _messages["TK_MSG_ADMIN_CHK_EXCLUSERS_INVALID_SET"] = {"s": _("Excluded user list is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_FINALWARNTIME_NONE"] = {"s": _("Final warning time is not passed")} _messages["TK_MSG_ADMIN_CHK_FINALWARNTIME_INVALID"] = {"s": _("Final warning time \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_FINALWARNTIME_INVALID_SET"] = {"s": _("Final warning time \"%%s\" is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_FINALNOTIFTIME_NONE"] = {"s": _("Final notification time is not passed")} _messages["TK_MSG_ADMIN_CHK_FINALNOTIFTIME_INVALID"] = {"s": _("Final notification time \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_FINALNOTIFTIME_INVALID_SET"] = {"s": _("Final notification time \"%%s\" is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_TERMTIME_NONE"] = {"s": _("Termination time is not passed")} _messages["TK_MSG_ADMIN_CHK_TERMTIME_INVALID"] = {"s": _("Termination time \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_TERMTIME_INVALID_SET"] = {"s": _("Termination time \"%%s\" is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_TRACKINACTIVE_NONE"] = {"s": _("Track inactive is not passed")} _messages["TK_MSG_ADMIN_CHK_TRACKINACTIVE_INVALID"] = {"s": _("Track inactive \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_TRACKINACTIVE_INVALID_SET"] = {"s": _("Track inactive \"%%s\" is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_LOGLEVEL_NONE"] = {"s": _("Log level is not passed")} _messages["TK_MSG_ADMIN_CHK_LOGLEVEL_INVALID"] = {"s": _("Log level \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_LOGLEVEL_INVALID_SET"] = {"s": _("Log level \"%%s\" is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_POLLTIME_NONE"] = {"s": _("Poll time is not passed")} _messages["TK_MSG_ADMIN_CHK_POLLTIME_INVALID"] = {"s": _("Poll time \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_POLLTIME_INVALID_SET"] = {"s": _("Poll time \"%%s\" is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_SAVETIME_NONE"] = {"s": _("Save time is not passed")} _messages["TK_MSG_ADMIN_CHK_SAVETIME_INVALID"] = {"s": _("Save time \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_SAVETIME_INVALID_SET"] = {"s": _("Save time \"%%s\" is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_PLAYTIMEENABLED_NONE"] = {"s": _("PlayTime flag is not passed")} _messages["TK_MSG_ADMIN_CHK_PLAYTIMEENABLED_INVALID"] = {"s": _("PlayTime flag \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_PLAYTIMEENABLED_INVALID_SET"] = {"s": _("PlayTime flag \"%%s\" is not correct and cannot be set")} _messages["TK_MSG_ADMIN_CHK_PLAYTIME_ENH_ACT_MON_ENABLED_NONE"] = {"s": _("PlayTime enhanced activity monitor flag is not passed")} _messages["TK_MSG_ADMIN_CHK_PLAYTIME_ENH_ACT_MON_ENABLED_INVALID"] = {"s": _("PlayTime enhanced activity monitor flag \"%%s\" is not correct")} _messages["TK_MSG_ADMIN_CHK_PLAYTIME_ENH_ACT_MON_ENABLED_INVALID_SET"] = {"s": _("PlayTime enhanced activity monitor flag \"%%s\" is not correct and cannot be set")} # ## this defines messages for use in user configuration validation ## _messages["TK_MSG_USER_ADMIN_CHK_ALLOWEDHOURS_DAY_NONE"] = {"s": _("User's \"%%s\" day number must be present")} _messages["TK_MSG_USER_ADMIN_CHK_ALLOWEDHOURS_DAY_INVALID"] = {"s": _("User's \"%%s\" day number must be between 1 and 7")} _messages["TK_MSG_USER_ADMIN_CHK_ALLOWEDHOURS_INVALID_SET"] = {"s": _("User's \"%%s\" allowed hours are not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_DAYLIST_NONE"] = {"s": _("User's \"%%s\" day list is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_DAYLIST_INVALID"] = {"s": _("User's \"%%s\" day list is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_DAYLIST_INVALID_SET"] = {"s": _("User's \"%%s\" day list is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_DAILYLIMITS_NONE"] = {"s": _("User's \"%%s\" day limits list is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_DAILYLIMITS_INVALID"] = {"s": _("User's \"%%s\" day limits list is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_DAILYLIMITS_INVALID_SET"] = {"s": _("User's \"%%s\" day limits list is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_TIMELIMIT_OPERATION_INVALID"] = {"s": _("User's \"%%s\" time operation can be one of these: - + =")} _messages["TK_MSG_USER_ADMIN_CHK_TIMELIMIT_INVALID"] = {"s": _("User's \"%%s\" time limit is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_TIMELIMIT_INVALID_SET"] = {"s": _("User's \"%%s\" time limit is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_MONTHLYALLOWANCE_NONE"] = {"s": _("User's \"%%s\" monthly allowance is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_MONTHLYALLOWANCE_INVALID"] = {"s": _("User's \"%%s\" monthly allowance is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_MONTHLYALLOWANCE_INVALID_SET"] = {"s": _("User's \"%%s\" monthly allowance is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_TRACKINACTIVE_NONE"] = {"s": _("User's \"%%s\" track inactive flag is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_TRACKINACTIVE_INVALID"] = {"s": _("User's \"%%s\" track inactive flag is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_TRACKINACTIVE_INVALID_SET"] = {"s": _("User's \"%%s\" track inactive flag is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_HIDETRAYICON_NONE"] = {"s": _("User's \"%%s\" hide tray icon flag is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_HIDETRAYICON_INVALID"] = {"s": _("User's \"%%s\" hide tray icon flag is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_HIDETRAYICON_INVALID_SET"] = {"s": _("User's \"%%s\" hide tray icon flag is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_LOCKOUTTYPE_NONE"] = {"s": _("User's \"%%s\" restriction / lockout type is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_LOCKOUTTYPE_INVALID"] = {"s": _("User's \"%%s\" restriction / lockout type is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_LOCKOUTTYPE_INVALID_SET"] = {"s": _("User's \"%%s\" restriction / lockout type is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_WEEKLYALLOWANCE_NONE"] = {"s": _("User's \"%%s\" weekly allowance is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_WEEKLYALLOWANCE_INVALID"] = {"s": _("User's \"%%s\" weekly allowance is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_WEEKLYALLOWANCE_INVALID_SET"] = {"s": _("User's \"%%s\" weekly allowance is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_PT_ENABLE_FLAG_NONE"] = {"s": _("User's \"%%s\" PlayTime enable flag is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_PT_ENABLE_FLAG_INVALID"] = {"s": _("User's \"%%s\" PlayTime enable flag is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_PT_ENABLE_FLAG_INVALID_SET"] = {"s": _("User's \"%%s\" PlayTime enable flag is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_PT_OVERRIDE_FLAG_NONE"] = {"s": _("User's \"%%s\" PlayTime override flag is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_PT_OVERRIDE_FLAG_INVALID"] = {"s": _("User's \"%%s\" PlayTime override flag is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_PT_OVERRIDE_FLAG_INVALID_SET"] = {"s": _("User's \"%%s\" PlayTime override flag is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_PT_UNACC_INT_FLAG_NONE"] = {"s": _("User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_PT_UNACC_INT_FLAG_INVALID"] = {"s": _("User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_PT_UNACC_INT_FLAG_INVALID_SET"] = {"s": _("User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_PT_DAYLIST_NONE"] = {"s": _("User's \"%%s\" PlayTime day list is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_PT_DAYLIST_INVALID"] = {"s": _("User's \"%%s\" PlayTime day list is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_PT_DAYLIST_INVALID_SET"] = {"s": _("User's \"%%s\" PlayTime day list is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_PT_DAYLIMITS_NONE"] = {"s": _("User's \"%%s\" PlayTime day limits list is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_PT_DAYLIMITS_INVALID"] = {"s": _("User's \"%%s\" PlayTime day limits list is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_PT_DAYLIMITS_INVALID_SET"] = {"s": _("User's \"%%s\" PlayTime day limits list is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_PT_ACTIVITIES_NONE"] = {"s": _("User's \"%%s\" PlayTime day limits list is not passed")} _messages["TK_MSG_USER_ADMIN_CHK_PT_ACTIVITIES_INVALID"] = {"s": _("User's \"%%s\" PlayTime day limits list is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_PT_ACTIVITIES_INVALID_SET"] = {"s": _("User's \"%%s\" PlayTime day limits list is not correct and cannot be set")} _messages["TK_MSG_USER_ADMIN_CHK_PT_TIMELIMIT_OPERATION_INVALID"] = {"s": _("User's \"%%s\" PlayTime operation can be one of these: - + =")} _messages["TK_MSG_USER_ADMIN_CHK_PT_TIMELIMIT_INVALID"] = {"s": _("User's \"%%s\" set PlayTime limit is not correct")} _messages["TK_MSG_USER_ADMIN_CHK_PT_TIMELIMIT_INVALID_SET"] = {"s": _("User's \"%%s\" PlayTime time limit is not correct and cannot be set")} # ## this defines messages for use in configuration loader ## # TRANSLATORS: this message must be 80 symbols long at max _messages["TK_MSG_CONFIG_LOADER_ERROR_GENERIC"] = {"s": _("Unexpected ERROR while loading configuration. Please inspect Timekpr-nExT log files")} # TRANSLATORS: this message must be 80 symbols long at max _messages["TK_MSG_CONFIG_LOADER_UNEXPECTED_ERROR"] = {"s": _("Unexpected ERROR getting configuration. Please inspect Timekpr-nExT log files")} # TRANSLATORS: this message must be 80 symbols long at max _messages["TK_MSG_CONFIG_LOADER_USER_UNEXPECTED_ERROR"] = {"s": _("Unexpected ERROR getting user configuration. Please inspect Timekpr-nExT log files")} # TRANSLATORS: this message must be 80 symbols long at max _messages["TK_MSG_CONFIG_LOADER_USERLIST_UNEXPECTED_ERROR"] = {"s": _("Unexpected ERROR getting user list. Please inspect Timekpr-nExT log files")} # TRANSLATORS: this message must be 80 symbols long at max _messages["TK_MSG_CONFIG_LOADER_SAVECONFIG_UNEXPECTED_ERROR"] = {"s": _("Unexpected ERROR updating configuration. Please inspect Timekpr-nExT log files")} # TRANSLATORS: this message must be 80 symbols long at max _messages["TK_MSG_CONFIG_LOADER_SAVECONTROL_UNEXPECTED_ERROR"] = {"s": _("Unexpected ERROR updating control. Please inspect Timekpr-nExT log files")} _messages["TK_MSG_CONFIG_LOADER_USERCONFIG_NOTFOUND"] = {"s": _("User \"%%s\" configuration is not found")} _messages["TK_MSG_CONFIG_LOADER_USERCONTROL_NOTFOUND"] = {"s": _("User \"%%s\" control file is not found")} _messages["TK_MSG_CONFIG_LOADER_USER_NOTFOUND"] = {"s": _("User \"%%s\" is not found")} # ## this defines messages for use in notifications ## _messages["TK_MSG_STATUS_CONNECTED"] = {"s": _("Connected")} _messages["TK_MSG_STATUS_CONNECTING"] = {"s": _("Connecting...")} _messages["TK_MSG_STATUS_CONNECTION_FAILED"] = {"s": _("Failed to connect")} # TRANSLATORS: this message must be 80 symbols long at max _messages["TK_MSG_STATUS_CONNECTION_ACCESS_DENIED"] = {"s": _("Please reopen the application if you are superuser and Timekpr-nExT is running")} _messages["TK_MSG_STATUS_STARTED"] = {"s": _("Started")} _messages["TK_MSG_STATUS_USER_CONFIG_RETRIEVED"] = {"s": _("User configuration retrieved")} _messages["TK_MSG_STATUS_CONFIG_RETRIEVED"] = {"s": _("Configuration retrieved")} _messages["TK_MSG_STATUS_TRACKINACTIVE_PROCESSED"] = {"s": _("Track inactive for user has been processed")} _messages["TK_MSG_STATUS_HIDETRAYICON_PROCESSED"] = {"s": _("Hide tray icon for user has been processed")} _messages["TK_MSG_STATUS_LOCKOUTTYPE_PROCESSED"] = {"s": _("Restriction / lockout type for user has been processed")} _messages["TK_MSG_STATUS_ADJUSTTIME_PROCESSED"] = {"s": _("Additional time for user has been processed")} _messages["TK_MSG_STATUS_PT_ADJUSTTIME_PROCESSED"] = {"s": _("Additional PlayTime for user has been processed")} _messages["TK_MSG_STATUS_WKMONADJUSTTIME_PROCESSED"] = {"s": _("Weekly and monthly limits for user have been processed")} _messages["TK_MSG_STATUS_ALLOWEDDAYS_PROCESSED"] = {"s": _("Allowed days for user have been processed")} _messages["TK_MSG_STATUS_TIMELIMITS_PROCESSED"] = {"s": _("Day time limits for user have been processed")} _messages["TK_MSG_STATUS_ALLOWEDHOURS_PROCESSED"] = {"s": _("Allowed hours for user have been processed")} _messages["TK_MSG_STATUS_CONFIGURATION_SAVED"] = {"s": _("Timekpr-nExT configuration has been saved")} _messages["TK_MSG_STATUS_USER_LIMIT_CONFIGURATION_SAVED"] = {"s": _("User time limits have been saved")} _messages["TK_MSG_STATUS_USER_PT_LIMIT_CONFIGURATION_SAVED"] = {"s": _("User PlayTime limits have been saved")} _messages["TK_MSG_STATUS_USER_ADDOPTS_CONFIGURATION_SAVED"] = {"s": _("User additional options have been saved")} _messages["TK_MSG_STATUS_PT_ENABLEMENT_PROCESSED"] = {"s": _("Enable PlayTime for the user has been processed")} _messages["TK_MSG_STATUS_PT_OVERRIDE_PROCESSED"] = {"s": _("PlayTime override flag for the user has been processed")} _messages["TK_MSG_STATUS_PT_ALLOWED_UNLIMITED_INTERVALS_PROCESSED"] = {"s": _("PlayTime allowed during unaccounted intervals flag for the user has been processed")} _messages["TK_MSG_STATUS_PT_ALLOWEDDAYS_PROCESSED"] = {"s": _("PlayTime allowed days for user have been processed")} _messages["TK_MSG_STATUS_PT_TIMELIMITS_PROCESSED"] = {"s": _("PlayTime day limits for user have been processed")} _messages["TK_MSG_STATUS_PT_ACTIVITIES_PROCESSED"] = {"s": _("PlayTime activities for user have been processed")} _messages["TK_MSG_STATUS_NODAY_SELECTED"] = {"s": _("Please select a day to set the limits")} _messages["TK_MSG_STATUS_INTERVAL_OVERLAP_DETECTED"] = {"s": _("That interval overlaps with an existing one")} _messages["TK_MSG_STATUS_INTERVALSTART_CONFLICT_DETECTED"] = {"s": _("That interval's start conflicts with an existing one")} _messages["TK_MSG_STATUS_INTERVALEND_CONFLICT_DETECTED"] = {"s": _("That interval's end conflicts with an existing one")} _messages["TK_MSG_STATUS_INTERVAL_DUPLICATE_DETECTED"] = {"s": _("That interval's start or end duplicates an existing one")} _messages["TK_MSG_STATUS_INTERVAL_STARTENDEQUAL_DETECTED"] = {"s": _("Interval start cannot be the same as end")} _messages["TK_MSG_STATUS_INTERVAL_ENDLESSTHANSTART_DETECTED"] = {"s": _("Interval's start cannot be later than end")} _messages["TK_MSG_STATUS_NOHOUR_SELECTED"] = {"s": _("Please select an hour interval to remove")} _messages["TK_MSG_STATUS_INTERVAL_REMOVED"] = {"s": _("Interval removed")} _messages["TK_MSG_STATUS_INTERFACE_NOTREADY"] = {"s": _("Timekpr-nExT interface is not yet ready")} # ## this defines messages for use in CLI ## _messages["TK_MSG_CONSOLE_GUI_NOT_AVAILABLE"] = {"s": _("WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, but no displays are available, thus running in CLI...")} _messages["TK_MSG_CONSOLE_COMMAND_INCORRECT"] = {"s": _("The command is incorrect:")} _messages["TK_MSG_CONSOLE_USAGE_NOTES"] = {"s": _("The usage of Timekpr-nExT admin client is as follows:")} _messages["TK_MSG_CONSOLE_USAGE_NOTICE_HEAD"] = {"s": _("---=== NOTICE ===---")} _messages["TK_MSG_CONSOLE_USAGE_NOTICE_TIME"] = {"s": _("numeric time values are in seconds")} _messages["TK_MSG_CONSOLE_USAGE_NOTICE_DAYS"] = {"s": _("weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, format: 1-7)")} _messages["TK_MSG_CONSOLE_USAGE_NOTICE_HOURS"] = {"s": _("hours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)")} _messages["TK_MSG_CONSOLE_USERS_TOTAL"] = {"s": __("%(n)s user in total:", "%(n)s users in total:")[0], "p": __("%(n)s user in total:", "%(n)s users in total:")[1]} _messages["TK_MSG_CONSOLE_CONFIG_FOR"] = {"s": _("Configuration for user %s:")} # ## this defines messages for use in menus ## _messages["TK_MSG_MENU_TIME_LEFT"] = {"s": _("Time left...")} _messages["TK_MSG_MENU_CONFIGURATION"] = {"s": _("Limits & Configuration")} _messages["TK_MSG_MENU_ABOUT"] = {"s": _("About")} # ## GUI labels ## _messages["TK_MSG_LOGO_LABEL"] = {"s": _("Keep control of computer usage")} _messages["TK_MSG_DAY_LIST_DAY_LABEL"] = {"s": _("Day")} _messages["TK_MSG_DAY_LIST_ENABLED_LABEL"] = {"s": _("Enabled")} _messages["TK_MSG_DAY_LIST_LIMIT_LABEL"] = {"s": _("Limit")} _messages["TK_MSG_DAY_INTERVALS_FROM_LABEL"] = {"s": _("From")} _messages["TK_MSG_DAY_INTERVALS_FROM_PHLD_LABEL"] = {"s": _("from...")} _messages["TK_MSG_DAY_INTERVALS_TO_LABEL"] = {"s": _("To")} _messages["TK_MSG_DAY_INTERVALS_TO_PHLD_LABEL"] = {"s": _("to...")} _messages["TK_MSG_WK_MON_LABEL"] = {"s": _("Period")} _messages["TK_MSG_WK_MON_LIMIT_LABEL"] = {"s": _("Limit")} _messages["TK_MSG_WEEKLY_LABEL"] = {"s": _("Weekly")} _messages["TK_MSG_MONTHLY_LABEL"] = {"s": _("Monthly")} _messages["TK_MSG_TRACKED_SESSIONS_LABEL"] = {"s": _("Session type")} _messages["TK_MSG_TRACKED_SESSIONS_PHLD_LABEL"] = {"s": _("session type...")} _messages["TK_MSG_UNTRACKED_SESSIONS_LABEL"] = {"s": _("Session type")} _messages["TK_MSG_UNTRACKED_SESSIONS_PHLD_LABEL"] = {"s": _("session type...")} _messages["TK_MSG_EXCLUDED_USERS_LABEL"] = {"s": _("Username")} _messages["TK_MSG_EXCLUDED_USERS_PHLD_LABEL"] = {"s": _("username...")} _messages["TK_MSG_PLAYTIME_ACTIVITY_MASK_LABEL"] = {"s": _("Process mask")} _messages["TK_MSG_PLAYTIME_ACTIVITY_MASK_PHLD_LABEL"] = {"s": _("executable mask...")} _messages["TK_MSG_PLAYTIME_ACTIVITY_DESCRIPTION_LABEL"] = {"s": _("Process description")} _messages["TK_MSG_PLAYTIME_ACTIVITY_DESCRIPTION_PHLD_LABEL"] = {"s": _("process description...")} _messages["TK_MSG_NOTIF_CONFIG_TIME_LABEL"] = {"s": _("Time")} _messages["TK_MSG_NOTIF_CONFIG_TIME_PHLD_LABEL"] = {"s": _("time...")} _messages["TK_MSG_NOTIF_CONFIG_IMPORTANCE_LABEL"] = {"s": _("Importance")} _messages["TK_MSG_NOTIF_CONFIG_IMPORTANCE_PHLD_LABEL"] = {"s": _("importance...")} # ## this defines messages for use in notifications ## _messages["TK_MSG_NOTIFICATION_TITLE"] = {"s": _("Timekpr-nExT notification")} _messages["TK_MSG_NOTIFICATION_PLAYTIME_TITLE"] = {"s": _("Timekpr-nExT PlayTime notification")} _messages["TK_MSG_NOTIFICATION_NOT_LIMITED"] = {"s": _("Your time is not limited today")} _messages["TK_MSG_NOTIFICATION_ALLOWANCE_CHANGED"] = {"s": _("Time allowance has changed, please note new time left!")} _messages["TK_MSG_NOTIFICATION_CONFIGURATION_CHANGED"] = {"s": _("Time limit configuration has changed, please note new configuration!")} _messages["TK_MSG_NOTIFICATION_CANNOT_CONNECT"] = {"s": _("There is a problem connecting to Timekpr-nExT daemon (%%s)!")} _messages["TK_MSG_NOTIFICATION_CANNOT_COMMUNICATE"] = {"s": _("There is a problem communicating to Timekpr-nExT (%%s)!")} _messages["TK_MSG_NOTIFICATION_CANNOT_INIT_ICON"] = {"s": _("Icon initialization error (%%s)!")} # TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly _messages["TK_MSG_NOTIFICATION_TIME_IS_UP_1T"] = {"s": _("Your time is up, you will be forcibly logged out in")} # TRANSLATORS: this is a part of message "Your time is up, your computer will be forcibly shutdown in %s seconds", please translate accordingly _messages["TK_MSG_NOTIFICATION_TIME_IS_UP_1D"] = {"s": _("Your time is up, your computer will be forcibly shutdown in")} # TRANSLATORS: this is a part of message "Your time is up, your session will be forcibly locked in %s seconds", please translate accordingly _messages["TK_MSG_NOTIFICATION_TIME_IS_UP_1L"] = {"s": _("Your time is up, your session will be forcibly locked in")} # TRANSLATORS: this is a part of message ", Your computer will be forcibly suspended in %s seconds", please translate accordingly _messages["TK_MSG_NOTIFICATION_TIME_IS_UP_1S"] = {"s": _("Your time is up, your computer will be forcibly suspended in")} # TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly _messages["TK_MSG_NOTIFICATION_TIME_IS_UP_2"] = {"s": __("%(n)s second", "%(n)s seconds")[0], "p": __("%(n)s second", "%(n)s seconds")[1]} _messages["TK_MSG_NOTIFICATION_CONNECTION_ERROR"] = {"s": _("Internal connection error, please check log files")} # TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly _messages["TK_MSG_NOTIFICATION_TIME_LEFT_1"] = {"s": __("You have %(n)s hour", "You have %(n)s hours")[0], "p": __("You have %(n)s hour", "You have %(n)s hours")[1]} # TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly _messages["TK_MSG_NOTIFICATION_TIME_LEFT_2"] = {"s": __("%(n)s minute", "%(n)s minutes")[0], "p": __("%(n)s minute", "%(n)s minutes")[1]} # TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly _messages["TK_MSG_NOTIFICATION_TIME_LEFT_3"] = {"s": __("%(n)s second left", "%(n)s seconds left")[0], "p": __("%(n)s second left", "%(n)s seconds left")[1]} # TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) of PlayTime left" please translate accordingly _messages["TK_MSG_NOTIFICATION_PLAYTIME_LEFT_3"] = {"s": __("%(n)s second left", "%(n)s seconds of PlayTime left")[0], "p": __("%(n)s second of PlayTime left", "%(n)s seconds of PlayTime left")[1]} _messages["TK_MSG_NOTIFICATION_SCR_FEATURE_NOT_AVAILABLE"] = {"s": _("Feature \"%%s\", which is used to detect idle time, cannot be enabled!\nIdle / inactive time might not be accounted when screen is locked!")} # ## misc errors ## _messages["TK_MSG_UNEXPECTED_ERROR"] = {"s": _("UNEXPECTED ERROR: %%s")} _messages["TK_MSG_PARSE_ERROR"] = {"s": _("PARAMETER PARSE ERROR (please check parameter validity): %%s")} _messages["TK_MSG_DBUS_COMMUNICATION_COMMAND_FAILED"] = {"s": _("Command FAILED: access denied")} _messages["TK_MSG_DBUS_COMMUNICATION_COMMAND_NOT_ACCEPTED"] = {"s": _("Command FAILED: communication was not accepted")} _messages["TK_MSG_TRANSLATION_NOTFOUND"] = {"s": _("n/a")} _messages["TK_MSG_TRANSLATOR_CREDITS"] = {"s": "please-enter-translator-credits"} # special case # init initMessages() def getTranslation(pMsgCode, n=None): """Get message translation""" # initial result = None # in case translation not found if pMsgCode not in _messages: result = _translateSingle(_messages["TK_MSG_TRANSLATION_NOTFOUND"]["s"]) else: # we need to translate plurals if "p" in _messages[pMsgCode] and n is not None: # numbers try: result = _translatePlural(_messages[pMsgCode]["s"], _messages[pMsgCode]["p"], n) % {"n": n} except Exception: pass # if translation was not plural or plural failed if result is None: # single result = _translateSingle(_messages[pMsgCode]["s"]).replace("%%", "%") # result return result # main start if __name__ == "__main__": print(getTranslation("TK_MSG_USER_ADMIN_CMD_USERLIST_N/A")) print(getTranslation("TK_MSG_USER_ADMIN_CMD_HELP")) print(getTranslation("TK_MSG_CONSOLE_USERS_TOTAL", 1)) print(getTranslation("TK_MSG_CONSOLE_USERS_TOTAL", 2)) timekpr-next/common/constants/__init__.py000664 001750 001750 00000000000 13476006650 022607 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/common/log/000775 001750 001750 00000000000 14017261747 017257 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/common/log/log.py000664 001750 001750 00000007144 14017261747 020420 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # imports from datetime import datetime import os # timekpr imports from timekpr.common.constants import constants as cons # default logging _LOG_LEVEL = cons.TK_LOG_LEVEL_INFO # logging to file _LOG_FILE = None # logging buffer (before we know where to put log file) _LOG_PEND_EVT_CNT = 0 _LOG_PEND_FLUSH_CNT = 0 _LOG_BUFFER = [] # log names def _getLogFileName(pWho, pUserName): """Get log file""" # log file logFile = (cons.TK_LOG_FILE_CLIENT if pWho == cons.TK_LOG_OWNER_CLIENT else (cons.TK_LOG_FILE_ADMIN if pWho == cons.TK_LOG_OWNER_ADMIN else (cons.TK_LOG_FILE_ADMIN_SU if pWho == cons.TK_LOG_OWNER_ADMIN_SU else cons.TK_LOG_FILE))) # replace user in log file return(logFile.replace(cons.TK_LOG_USER, pUserName, 1)) def _output(pText): """Print to console and/or file""" global _LOG_FILE, _LOG_PEND_EVT_CNT, _LOG_BUFFER # format text logText = "%s: %s" % (datetime.now().strftime(cons.TK_LOG_DATETIME_FORMAT), pText) # prepare a line for file _LOG_BUFFER.append("%s\n" % (logText)) # in development mode, we spit out in console as well if cons.TK_DEV_ACTIVE: print(logText) # log only if enough calls are passed to log if _LOG_PEND_EVT_CNT >= cons.TK_LOG_AUTO_FLUSH_EVT_CNT: # write buffers to log file flushLogFile() def setLogging(pLogLevel, pLogDir, pWho, pUserName): """Set up logging (this function expects 4 tuples: log level, log directory, log owner and username""" global _LOG_FILE # set up level setLogLevel(pLogLevel) # set up file _LOG_FILE = os.path.join(pLogDir, _getLogFileName(pWho, pUserName)) def isLoggingActive(): """Is debug enabled""" global _LOG_FILE # check whether debug is enabled return _LOG_FILE is not None def isDebugEnabled(pDebugLevel=cons.TK_LOG_LEVEL_DEBUG): """Is debug enabled""" global _LOG_LEVEL # check whether debug is enabled if pDebugLevel <= _LOG_LEVEL: return True def getLogLevel(): """Return log level""" global _LOG_LEVEL # return return _LOG_LEVEL def setLogLevel(pLvl): """Set up log level""" global _LOG_LEVEL # set _LOG_LEVEL = pLvl def log(pLvl, pText): """Print to console""" global _LOG_LEVEL, _LOG_PEND_EVT_CNT # check debug level and output if pLvl <= _LOG_LEVEL: # add to pending event cnt _LOG_PEND_EVT_CNT += 1 # redirect to output _output(pText) def autoFlushLogFile(): """This will flush the log file to file""" # iport globals global _LOG_PEND_FLUSH_CNT # reset flush _LOG_PEND_FLUSH_CNT += 1 # when the time has come, just flush the log file if _LOG_PEND_FLUSH_CNT >= cons.TK_POLLTIME: # flush the log flushLogFile() def flushLogFile(): """This will flush the log file to file""" # iport globals global _LOG_FILE, _LOG_BUFFER, _LOG_PEND_EVT_CNT, _LOG_PEND_FLUSH_CNT # we can only flush if there is a file if _LOG_FILE is not None and len(_LOG_BUFFER) > 0: try: # open log file with open(_LOG_FILE, "a") as logFile: # write whole buffer to log file logFile.writelines(_LOG_BUFFER) # reset _LOG_PEND_EVT_CNT = 0 _LOG_PEND_FLUSH_CNT = 0 _LOG_BUFFER.clear() except Exception as ex: # spit out to console consoleOut("ERROR, CAN NOT WRITE TO LOG DUE TO:\n%s" % (ex)) def consoleOut(*args): """Print everything passed to console""" # currently just output the stuff print(*args) timekpr-next/common/log/__init__.py000664 001750 001750 00000000000 13476006650 021354 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/common/utils/000775 001750 001750 00000000000 14064575714 017642 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/common/utils/notifications.py000664 001750 001750 00000031016 14064575714 023066 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # imports import dbus.service from datetime import datetime # timekpr imports from timekpr.common.log import log from timekpr.common.constants import constants as cons class timekprNotificationManager(dbus.service.Object): """Notification manager""" # --------------- initialization / control methods --------------- # def __init__(self, pBusName, pUserName, pTimekprConfig): """Initialize notification manager""" log.log(cons.TK_LOG_LEVEL_INFO, "start init notifications") # config self._timekprConfig = pTimekprConfig # last notification self._userName = pUserName self._userNameDBUS = self._userName.replace(".", "").replace("-", "") self._lastNotified = datetime.now().replace(microsecond=0) self._notificationLvl = -1 self._prevNotificationLvl = -1 # ## define notifications levels # notifications are calculated as more than specified limit in ascending order, e.g. if there is 2400 seconds # left, it means that (3600 > 2400 > 1800) second level is chosen self._notificationLimits = ( # ## historical config, just for reference ## # {cons.TK_NOTIF_LEFT: 3600*2, cons.TK_NOTIF_INTERVAL: 3600*2, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_LOW} # ,{cons.TK_NOTIF_LEFT: 3600, cons.TK_NOTIF_INTERVAL: 3600, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_LOW} # ,{cons.TK_NOTIF_LEFT: 1800, cons.TK_NOTIF_INTERVAL: 1800, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_NORMAL} # ,{cons.TK_NOTIF_LEFT: 300, cons.TK_NOTIF_INTERVAL: 600, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_WARNING} # ,{cons.TK_NOTIF_LEFT: 60, cons.TK_NOTIF_INTERVAL: 120, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_IMPORTANT} # ,{cons.TK_NOTIF_LEFT: 0, cons.TK_NOTIF_INTERVAL:60, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_CRITICAL} # ,{cons.TK_NOTIF_LEFT: -cons.TK_LIMIT_PER_DAY*31, cons.TK_NOTIF_INTERVAL: 10, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_CRITICAL} # ## since notifications are client responsibility, but we still need to send them at some point, so this is a placeholder config ## # ## notification levels should not matter anymore, when message arrives to client, it will calc prio depending on it's config ## {cons.TK_NOTIF_LEFT: self._timekprConfig.getTimekprFinalNotificationTime, cons.TK_NOTIF_INTERVAL: self._getTwoDaysTime, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_LOW}, {cons.TK_NOTIF_LEFT: self._getZeroDaysTime, cons.TK_NOTIF_INTERVAL: self._timekprConfig.getTimekprFinalNotificationTime, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_CRITICAL}, {cons.TK_NOTIF_LEFT: self._getLongestTimeNeg, cons.TK_NOTIF_INTERVAL: self._getLongestTime, cons.TK_NOTIF_URGENCY: cons.TK_PRIO_CRITICAL} ) # init DBUS super().__init__(pBusName, cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS) log.log(cons.TK_LOG_LEVEL_INFO, "finish init notifications") # --------------- helper methods --------------- # # a time ceiling of time for comparison def _getLongestTime(self): return cons.TK_LIMIT_PER_DAY * 31 # a time floor of time for comparison def _getLongestTimeNeg(self): return -self._getLongestTime # max time user could have def _getTwoDaysTime(self): return cons.TK_LIMIT_PER_DAY * 2 # 0 time def _getZeroDaysTime(self): return 0 # --------------- worker methods --------------- # def deInitUser(self): """Leave the connection""" # un-init DBUS super().remove_from_connection() def processTimeLeft(self, pForce, pTimeValues): """Process notifications and send signals if needed""" log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "start processTimeLeft") # save old level self._prevNotificationLvl = self._notificationLvl # defaults newNotificatonLvl = -1 effectiveDatetime = datetime.now().replace(microsecond=0) # find current limit for i in self._notificationLimits: # set up new level newNotificatonLvl += 1 # check if pTimeValues[cons.TK_CTRL_LEFT] >= i[cons.TK_NOTIF_LEFT](): # set up new level self._notificationLvl = newNotificatonLvl # we found what we needed break # timeleft timeLeft = dbus.Dictionary({}, signature="si") timeLeft[cons.TK_CTRL_LEFTD] = int(pTimeValues[cons.TK_CTRL_LEFTD]) timeLeft[cons.TK_CTRL_LEFT] = int(pTimeValues[cons.TK_CTRL_LEFT]) timeLeft[cons.TK_CTRL_SPENT] = int(pTimeValues[cons.TK_CTRL_SPENT]) timeLeft[cons.TK_CTRL_SPENTW] = int(pTimeValues[cons.TK_CTRL_SPENTW]) timeLeft[cons.TK_CTRL_SPENTM] = int(pTimeValues[cons.TK_CTRL_SPENTM]) timeLeft[cons.TK_CTRL_SLEEP] = int(pTimeValues[cons.TK_CTRL_SLEEP]) timeLeft[cons.TK_CTRL_TRACK] = (1 if pTimeValues[cons.TK_CTRL_TRACK] else 0) timeLeft[cons.TK_CTRL_HIDEI] = (1 if pTimeValues[cons.TK_CTRL_HIDEI] else 0) timeLeft[cons.TK_CTRL_TNL] = pTimeValues[cons.TK_CTRL_TNL] # include PlayTime (if enabled, check is done for couple of mandatory values) if cons.TK_CTRL_PTTLO in pTimeValues and cons.TK_CTRL_PTSPD in pTimeValues: timeLeft[cons.TK_CTRL_PTTLO] = (1 if pTimeValues[cons.TK_CTRL_PTTLO] else 0) timeLeft[cons.TK_CTRL_PTAUH] = (1 if pTimeValues[cons.TK_CTRL_PTAUH] else 0) timeLeft[cons.TK_CTRL_PTSPD] = int(pTimeValues[cons.TK_CTRL_PTSPD]) timeLeft[cons.TK_CTRL_PTLPD] = int(pTimeValues[cons.TK_CTRL_PTLPD]) timeLeft[cons.TK_CTRL_PTLSTC] = int(pTimeValues[cons.TK_CTRL_PTLSTC]) # save calculated urgency (calculated may get overridden by uacc) notifUrgency = cons.TK_PRIO_UACC if pTimeValues[cons.TK_CTRL_UACC] else self._notificationLimits[self._notificationLvl][cons.TK_NOTIF_URGENCY] # inform clients about time left in any case self.timeLeft(notifUrgency, timeLeft) # if notification levels changed (and it was not the first iteration) if (pForce) or (self._notificationLvl != self._prevNotificationLvl) or ((effectiveDatetime - self._lastNotified).total_seconds() >= self._notificationLimits[self._notificationLvl][cons.TK_NOTIF_INTERVAL]() and not pTimeValues[cons.TK_CTRL_UACC]): # set up last notified self._lastNotified = effectiveDatetime # if time left is whole day, we have no limit (as an additonal limit is the hours, so check if accounting is actually correct) if timeLeft[cons.TK_CTRL_TNL] > 0: # we send no limit just once if self._prevNotificationLvl < 0 or pForce: # no limit self.timeNoLimitNotification(cons.TK_PRIO_LOW) else: # limit self.timeLeftNotification(notifUrgency, max(pTimeValues[cons.TK_CTRL_LEFT], 0), max(pTimeValues[cons.TK_CTRL_LEFTD], 0), pTimeValues[cons.TK_CTRL_LIMITD]) log.log(cons.TK_LOG_LEVEL_DEBUG, "time left, tlrow: %i, tleftd: %i, tlimd: %i, notification lvl: %s, priority: %s, force: %s" % (pTimeValues[cons.TK_CTRL_LEFT], pTimeValues[cons.TK_CTRL_LEFTD], pTimeValues[cons.TK_CTRL_LIMITD], self._notificationLvl, notifUrgency, str(pForce))) log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "finish processTimeLeft") def processTimeLimits(self, pTimeLimits): """Enable sending out the limits config""" # dbus dict for holding days timeLimits = dbus.Dictionary(signature="sv") # convert this all to dbus for rKey, rValue in pTimeLimits.items(): # weekly & monthly limits are set differently if rKey in (cons.TK_CTRL_LIMITW, cons.TK_CTRL_LIMITM): # this is to comply with standard limits structure timeLimits[rKey] = dbus.Dictionary(signature="sv") timeLimits[rKey][rKey] = dbus.Int32(rValue) # PlayTime flags elif rKey in (cons.TK_CTRL_PTTLO, cons.TK_CTRL_PTAUH, cons.TK_CTRL_PTTLE): # this is to comply with standard limits structure timeLimits[rKey] = dbus.Dictionary(signature="sv") timeLimits[rKey][rKey] = dbus.Int32(rValue) # PlayTime lists elif rKey in (cons.TK_CTRL_PTLMT, cons.TK_CTRL_PTLST): # dbus dict for holding days, limits and activities timeLimits[rKey] = dbus.Dictionary(signature="sv") timeLimits[rKey][rKey] = dbus.Array(signature="av") # fill in limits or activities (both have 2 node arrays) for rSubValue in rValue: timeLimits[rKey][rKey].append(dbus.Array([rSubValue[0], rSubValue[1]], signature=("i" if rKey == cons.TK_CTRL_PTLMT else "s"))) else: # dbus dict for holding limits and intervals timeLimits[rKey] = dbus.Dictionary(signature="sv") timeLimits[rKey][cons.TK_CTRL_LIMITD] = rValue[cons.TK_CTRL_LIMITD] # dbus list for holding intervals timeLimits[rKey][cons.TK_CTRL_INT] = dbus.Array(signature="av") # set up dbus dict for rLimit in rValue[cons.TK_CTRL_INT]: # add intervals timeLimits[rKey][cons.TK_CTRL_INT].append(dbus.Array([rLimit[0], rLimit[1], rLimit[2]], signature="i")) if log.isDebugEnabled(cons.TK_LOG_LEVEL_EXTRA_DEBUG): log.log(cons.TK_LOG_LEVEL_EXTRA_DEBUG, "TLDB: %s" % (str(timeLimits))) # process self.timeLimits(cons.TK_PRIO_LOW, timeLimits) def processEmergencyNotification(self, pFinalNotificationType, pCountdown): """Emergency notifcation call wrapper""" # forward to dbus self.timeCriticalNotification(pFinalNotificationType, cons.TK_PRIO_CRITICAL, pCountdown) def procesSessionAttributes(self, pWhat, pKey): """Session attribute verification wrapper""" # forward to dbus self.sessionAttributeVerification(pWhat, pKey) # --------------- DBUS / communication methods (verification, user session states) --------------- # @dbus.service.signal(cons.TK_DBUS_USER_SESSION_ATTRIBUTE_INTERFACE, signature="ss") def sessionAttributeVerification(self, pWhat, pKey): """Send out signal""" # this just passes time back pass # --------------- DBUS / communication methods (limits, config) --------------- # @dbus.service.signal(cons.TK_DBUS_USER_LIMITS_INTERFACE, signature="sa{si}") def timeLeft(self, pPriority, pTimeLeft): """Send out signal""" # this just passes time back pass @dbus.service.signal(cons.TK_DBUS_USER_LIMITS_INTERFACE, signature="sa{sa{sv}}") def timeLimits(self, pPriority, pTimeLimits): """Send out signal""" # this just passes time back pass # --------------- DBUS / communication methods (notifications) --------------- # @dbus.service.signal(cons.TK_DBUS_USER_NOTIF_INTERFACE, signature="siii") def timeLeftNotification(self, pPriority, pTimeLeftTotal, pTimeLeftToday, pTimeLimitToday): """Send out signal""" log.log(cons.TK_LOG_LEVEL_DEBUG, "sending tln: %i" % (pTimeLeftTotal)) # You have %s to use continously, including %s ouf of %s today pass @dbus.service.signal(cons.TK_DBUS_USER_NOTIF_INTERFACE, signature="ssi") def timeCriticalNotification(self, pFinalNotificationType, pPriority, pSecondsLeft): """Send out signal""" log.log(cons.TK_LOG_LEVEL_DEBUG, "sending tcn: %s, %i" % (pFinalNotificationType, pSecondsLeft)) # Your time is up, you will be forcibly logged / locked / suspended / shutdown out in %i seconds! pass @dbus.service.signal(cons.TK_DBUS_USER_NOTIF_INTERFACE, signature="s") def timeNoLimitNotification(self, pPriority): """Send out signal""" log.log(cons.TK_LOG_LEVEL_DEBUG, "sending ntln") # Congratulations, your time is not limited today pass @dbus.service.signal(cons.TK_DBUS_USER_NOTIF_INTERFACE, signature="s") def timeLeftChangedNotification(self, pPriority): """Send out signal""" log.log(cons.TK_LOG_LEVEL_DEBUG, "sending tlcn") # Limits have changed and applied pass @dbus.service.signal(cons.TK_DBUS_USER_NOTIF_INTERFACE, signature="s") def timeConfigurationChangedNotification(self, pPriority): """Send out signal""" log.log(cons.TK_LOG_LEVEL_DEBUG, "sending tccn") # Configuration has changed, new limits may have been applied pass timekpr-next/common/utils/misc.py000664 001750 001750 00000024317 14064575714 021156 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # defaults _START_TIME = None _END_TIME = None _RESULT = 0 # imports from datetime import datetime import os import pwd import inspect try: import psutil _PSUTIL = True except (ImportError, ValueError): _PSUTIL = False pass # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log # this is needed for debugging purposes def whoami(): """Return callers name from the call stack, the 0 is this function, prev is the one needd""" return inspect.stack()[1][3] def getNormalizedUserNames(pUID=None, pUser=None): """Get usernames and/or normalize them""" user = pUser userName = None userNameFull = "" try: # if we need to get one if pUID is not None: # user user = pwd.getpwuid(pUID) # we have user if user is not None: # username userName = user.pw_name userNameFull = user.pw_gecos # workaround for distros that have one or more "," at the end of user full name userNameFull = userNameFull.rstrip(",") # if username is exactly the same as full name, no need to show it separately userNameFull = userNameFull if userNameFull != userName else "" except KeyError: pass # full username return userName, userNameFull def measureTimeElapsed(pStart=False, pStop=False, pResult=False): """Calculate the time difference in the simplest manner""" # init globals (per import) global _START_TIME global _END_TIME global _RESULT # set up start if pStart: _START_TIME = datetime.now() # set up end if pStop: _END_TIME = datetime.now() _RESULT = (_END_TIME - _START_TIME).total_seconds() _START_TIME = _END_TIME # return return _RESULT def checkAndSetRunning(pAppName, pUserName=""): """Check whether application is already running""" # set up pidfile name pidFile = os.path.join(cons.TK_LOG_TEMP_DIR, "%s.%s" % ((pAppName if pUserName == "" else "%s.%s" % (pAppName, pUserName)), cons.TK_LOG_PID_EXT)) processPid = "0" processCmd = "" isAlreadyRunning = False # check if we have pid file for the app if os.path.isfile(pidFile): # if we have a file, we read the pid from there with open(pidFile, "r") as pidfile: processPid = pidfile.readline().rstrip("\n").rstrip("\r") # so we have a running app, now we check whether its our app if processPid != "0": # get process commandline procPidFile = os.path.join("/proc", processPid, "cmdline") # check whether we have a process running with this pid if os.path.isfile(procPidFile): # we wrap this with try in case pid is very short-lived try: with open(procPidFile, "r") as pidfile: processCmd = pidfile.readline() except Exception: processCmd = "" # check if this is our process if pAppName in processCmd: # we are running isAlreadyRunning = True # print this to console as well print("Timekpr-nExT \"%s\" is already running for user \"%s\"" % (pAppName, pUserName if pUserName != "" else "ŗoot")) else: # set our pid with open(pidFile, "w") as pidfile: processCmd = pidfile.write(str(os.getpid())) # return whether we are running return isAlreadyRunning def killLeftoverUserProcesses(pUserName, pTimekprConfig): """Kill leftover processes for user""" # if psutil is not available, do nothing global _PSUTIL if not _PSUTIL: return # determine which sessions we are going to kill (either graphical or tty) # this is somewhat interesting as for processes we cannot exactly tell whether it's graphical or not, but we check terminal sessions, # if terminal is not set, then it's assumed graphical or so killTty = False killGUI = False killedProcesses = 0 otherProcesses = 0 # build up killing session types sessinTypesForKill = [rSessionType for rSessionType in pTimekprConfig.getTimekprSessionsCtrl() if rSessionType not in pTimekprConfig.getTimekprSessionsExcl()] # check for graphical for sessionType in cons.TK_SESSION_TYPES_CTRL.split(";"): # check for kill if sessionType in sessinTypesForKill: killGUI = True break # check for graphical for sessionType in cons.TK_SESSION_TYPES_EXCL.split(";"): # check for kill if sessionType in sessinTypesForKill: killTty = True break # get all processes for this user for userProc in psutil.process_iter(): # process info procInfo = userProc.as_dict(attrs=["pid", "ppid", "name", "username", "terminal"]) # check for username and for processes that originates from init (the rest should be terminated along with the session) if procInfo["username"] == pUserName: # if originates from init if procInfo["ppid"] in (0, 1): # normalize terminal (only real terminals are considered terminals) terminal = procInfo["terminal"] if (procInfo["terminal"] is not None and "/dev/pts/" not in procInfo["terminal"]) else None # logging log.log(cons.TK_LOG_LEVEL_INFO, "INFO: got leftover process, pid: %s, ppid: %s, username: %s, name: %s, terminal: %s, effective terminal: %s" % (procInfo["pid"], procInfo["ppid"], procInfo["username"], procInfo["name"], procInfo["terminal"], terminal)) # kill processes if they are terminal and terminals are tracked or they are not terminal processes if (terminal is not None and killTty) or (terminal is None and killGUI): try: # get process and kill it userPrc = psutil.Process(procInfo["pid"]) # killing time if cons.TK_DEV_ACTIVE: log.log(cons.TK_LOG_LEVEL_INFO, "DEVELOPMENT ACTIVE, not killing my own processes, sorry...") else: # asking process to terminate userPrc.terminate() except psutil.Error as psErr: log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: killing %s failed (%s)" % (procInfo["pid"], str(psErr))) pass else: # count killed processes killedProcesses += 1 else: # do not kill terminal sessions if ones are not tracked log.log(cons.TK_LOG_LEVEL_INFO, "INFO: NOT killing process %s as it's from sessions which are not being tracked" % (procInfo["pid"])) else: # count other processes otherProcesses += 1 # log log.log(cons.TK_LOG_LEVEL_INFO, "INFO: %i session related processes were killed, %i other processes for user were not killed" % (killedProcesses, otherProcesses)) def findHourStartEndMinutes(pStr): """Separate name and desription in brackets""" # hour, start, end hour = None sMin = None eMin = None uacc = None # get len beforehand ln = len(pStr) if pStr is not None else 0 # it makes sense to calc stuff only when there is a hour defined if ln > 0: # is hour unaccounted uacc = True if pStr[0] == "!" else False # in case of unlimited hour actual len is smaller ln = ln - 1 if uacc else ln # get hour (ex: 1 or 11) if 1 <= ln <= 2: # hour, start, end hour = pStr[1:] if uacc else pStr sMin = 0 eMin = 60 # get hours and minutes (ex: 1[1:1] or 11[11:22]) elif 6 <= ln <= 9: # find minutes beg = 1 if uacc else 0 st = pStr.find("[") sep = pStr.find("-") # failover to : (currently undocumented) sep = sep if not sep < 0 else pStr.find(":") en = pStr.find("]") # in case user config is broken, we cannot determine stuff if st < 0 or en < 0 or sep < 0 or not st < sep < en: # nothing pass else: # hour, start, end try: # determine hour and minutes (and check for errors as well) hour = int(pStr[beg:st]) sMin = int(pStr[st+1:sep]) eMin = int(pStr[sep+1:en]) # checks for errors (and raise one if there is an error) hour = hour if 0 <= hour <= 23 else 1/0 sMin = sMin if 0 <= sMin <= 60 else 1/0 eMin = eMin if 0 <= eMin <= 60 else 1/0 eMin = eMin if sMin < eMin else 1/0 except (ValueError, ZeroDivisionError): # hour, start, end hour = None sMin = None eMin = None uacc = None # return return hour, sMin, eMin, uacc def splitConfigValueNameParam(pStr): """Separate value and param in brackets""" # name and its value value = None param = None # nothing if len(pStr) < 2: # can not be a normal value pass else: try: # find description ("") is for backwards compatibility st = pStr.find("(\"") # compatibility description start en = pStr.find("\")") # compatibility description end ln = 1 if st < 0 else 2 # compatility case searches for 2 letters, new one 1 # new style config st = pStr.find("[") if st < 0 else st # new style config en = pStr.find("]") if en < 0 else en # new style config st = en if st < 0 else st # no description, we'll get just pattern # process and its description value = pStr[0:st if st > 0 else len(pStr)] param = "" if st < 0 else pStr[st+ln:en if en >= 0 else len(pStr)] except: # it doesn't matter which error occurs value = None param = None # return return value, param timekpr-next/common/utils/config.py000664 001750 001750 00000262515 14017261747 021470 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # imports import configparser from datetime import datetime import re import os import shutil import getpass # timekpr imports from timekpr.common.log import log from timekpr.common.constants import constants as cons from timekpr.common.utils.misc import findHourStartEndMinutes as findHourStartEndMinutes from timekpr.common.utils.misc import splitConfigValueNameParam as splitConfigValueNameParam # ## GLOBAL ## # key pattern search RE_KEYFINDER = re.compile("^ *([A-Z]+[A-Z_]+[0-9]*) *=.*$") RE_ARRAYKEYFINDER = re.compile("^##([A-Z]+[A-Z_]+)##.*$") def _saveConfigFile(pConfigFile, pKeyValuePairs): """Save the config file using custom helper function""" global RE_KEYFINDER, RE_ARRAYKEYFINDER # edit control file (using alternate method because configparser looses comments in the process) # make a backup of the file shutil.copy(pConfigFile, pConfigFile + cons.TK_BACK_EXT) # read backup and write actual config file with open(pConfigFile + cons.TK_BACK_EXT, "r") as srcFile, open(pConfigFile, "w") as dstFile: # destination file dstLines = [] # read line and do manipulations for rLine in srcFile: # def line line = rLine # if line matches parameter pattern, we look up for that key in our value list if RE_KEYFINDER.match(rLine): # check whether we can find the value for it key = RE_KEYFINDER.sub(r"\1", rLine.rstrip()) # if key exists if key in pKeyValuePairs: # in case of placeholder (value = None), just keep the line, else replace it if pKeyValuePairs[key] is not None: # now get the value dstLines.append("%s = %s\n" % (key, pKeyValuePairs[key])) # do not add original line line = None else: # do not add unknown options line = None # search for variable options elif RE_ARRAYKEYFINDER.match(rLine): # check whether we can find the value for it key = RE_ARRAYKEYFINDER.sub(r"\1", rLine.rstrip()) # now get the value dstLines.append("%s" % (rLine)) # if key exists if key in pKeyValuePairs: # append array of values for rVal in pKeyValuePairs[key]: # now get the value dstLines.append("%s\n" % (rVal)) # do not add original line line = None # append if there is a line if line is not None: # add line dstLines.append(line) # save config lines back to file dstFile.writelines(dstLines) def _loadAndPrepareConfigFile(pConfigFileParser, pConfigFile, pLoadOnly=False): """Try to load config file, if that fails, try to read backup file""" # by default fail result = False # process primary and backup files for rFile in (pConfigFile, pConfigFile + cons.TK_BACK_EXT): # if file is ok if os.path.isfile(rFile) and os.path.getsize(rFile) != 0: # copy file back to original (if this is backup file) if rFile != pConfigFile and not pLoadOnly: shutil.copy(rFile, pConfigFile) # read config try: # read config file pConfigFileParser.read(pConfigFile) # success result = True break except Exception: # not load only if not pLoadOnly: # fail, move corrupted file os.rename(rFile, "%s.invalid" % (rFile)) else: # we do not need empty files if os.path.isfile(rFile) and not pLoadOnly: # remove empty file os.remove(rFile) # result return result def _readAndNormalizeValue(pConfigFileParserFn, pSection, pParam, pDefaultValue, pCheckValue, pOverallSuccess): """Read value from parser, if fails, then return default value""" # default values result = pOverallSuccess value = pDefaultValue try: # read value from parser value = pConfigFileParserFn(pSection, pParam) # check min / max if we have numbers if pCheckValue is not None and type(pDefaultValue).__name__ in ("int"): value = min(max(value, -pCheckValue), pCheckValue) # validate date format properly elif type(pDefaultValue).__name__ in ("date", "datetime"): value = datetime.strptime(value, cons.TK_DATETIME_FORMAT) except Exception: # default value value = pDefaultValue # failed result = False # return return result, value def _cleanupValue(pValue): """Clean up value (basically remove stuff from begining and end)""" return(pValue.strip().strip(";") if pValue is not None else None) class timekprConfig(object): """Main configuration class for the server""" def __init__(self): """Initialize stuff""" log.log(cons.TK_LOG_LEVEL_INFO, "initializing configuration manager") # config self._timekprConfig = {} # in dev self._configDirPrefix = os.getcwd() if cons.TK_DEV_ACTIVE else "" # main config self._timekprConfig["TIMEKPR_MAIN_CONFIG_DIR"] = os.path.join(self._configDirPrefix, (cons.TK_MAIN_CONFIG_DIR_DEV if cons.TK_DEV_ACTIVE else cons.TK_MAIN_CONFIG_DIR)) self._configFile = os.path.join(self._timekprConfig["TIMEKPR_MAIN_CONFIG_DIR"], cons.TK_MAIN_CONFIG_FILE) # config parser self._timekprConfigParser = configparser.ConfigParser(allow_no_value=True) self._timekprConfigParser.optionxform = str log.log(cons.TK_LOG_LEVEL_INFO, "finish configuration manager") def __del__(self): """De-initialize stuff""" log.log(cons.TK_LOG_LEVEL_INFO, "de-initializing configuration manager") def loadMainConfiguration(self): """Read main timekpr config file""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start loading configuration") # try to load config file result = _loadAndPrepareConfigFile(self._timekprConfigParser, self._configFile) # value read result resultValue = True # read config failed, we need to initialize if not result: # logging log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: could not parse main configuration file (%s) properly, will use default values" % (self._configFile)) # init config self.initDefaultConfiguration() # re-read the file self._timekprConfigParser.read(self._configFile) # config initialized result = True # general section section = "GENERAL" # read param = "TIMEKPR_VERSION" self._timekprConfig[param] = cons.TK_VERSION # read param = "TIMEKPR_LOGLEVEL" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getint, section, param, pDefaultValue=cons.TK_LOG_LEVEL_INFO, pCheckValue=None, pOverallSuccess=resultValue) # read param = "TIMEKPR_POLLTIME" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getint, section, param, pDefaultValue=cons.TK_POLLTIME, pCheckValue=None, pOverallSuccess=resultValue) # read param = "TIMEKPR_SAVE_TIME" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getint, section, param, pDefaultValue=cons.TK_SAVE_INTERVAL, pCheckValue=None, pOverallSuccess=resultValue) # read param = "TIMEKPR_TRACK_INACTIVE" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getboolean, section, param, pDefaultValue=cons.TK_TRACK_INACTIVE, pCheckValue=None, pOverallSuccess=resultValue) # read param = "TIMEKPR_TERMINATION_TIME" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getint, section, param, pDefaultValue=cons.TK_TERMINATION_TIME, pCheckValue=None, pOverallSuccess=resultValue) # read param = "TIMEKPR_FINAL_WARNING_TIME" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getint, section, param, pDefaultValue=cons.TK_FINAL_COUNTDOWN_TIME, pCheckValue=None, pOverallSuccess=resultValue) # read param = "TIMEKPR_FINAL_NOTIFICATION_TIME" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getint, section, param, pDefaultValue=cons.TK_FINAL_NOTIFICATION_TIME, pCheckValue=None, pOverallSuccess=resultValue) # session section section = "SESSION" # read param = "TIMEKPR_SESSION_TYPES_CTRL" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.get, section, param, pDefaultValue=cons.TK_SESSION_TYPES_CTRL, pCheckValue=None, pOverallSuccess=resultValue) self._timekprConfig[param] = _cleanupValue(self._timekprConfig[param]) # read param = "TIMEKPR_SESSION_TYPES_EXCL" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.get, section, param, pDefaultValue=cons.TK_SESSION_TYPES_EXCL, pCheckValue=None, pOverallSuccess=resultValue) self._timekprConfig[param] = _cleanupValue(self._timekprConfig[param]) # read param = "TIMEKPR_USERS_EXCL" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.get, section, param, pDefaultValue=cons.TK_USERS_EXCL, pCheckValue=None, pOverallSuccess=resultValue) self._timekprConfig[param] = _cleanupValue(self._timekprConfig[param]) # directory section (! in case directories are not correct, they are not overwritten with defaults !) section = "DIRECTORIES" # read param = "TIMEKPR_CONFIG_DIR" result, value = _readAndNormalizeValue(self._timekprConfigParser.get, section, param, pDefaultValue=cons.TK_CONFIG_DIR, pCheckValue=None, pOverallSuccess=result) self._timekprConfig[param] = os.path.join(self._configDirPrefix, value) # read param = "TIMEKPR_WORK_DIR" result, value = _readAndNormalizeValue(self._timekprConfigParser.get, section, param, pDefaultValue=cons.TK_WORK_DIR, pCheckValue=None, pOverallSuccess=result) self._timekprConfig[param] = os.path.join(self._configDirPrefix, value) # read param = "TIMEKPR_SHARED_DIR" result, value = _readAndNormalizeValue(self._timekprConfigParser.get, section, param, pDefaultValue=cons.TK_SHARED_DIR, pCheckValue=None, pOverallSuccess=result) self._timekprConfig[param] = os.path.join(self._configDirPrefix, value) # read param = "TIMEKPR_LOGFILE_DIR" result, value = _readAndNormalizeValue(self._timekprConfigParser.get, section, param, pDefaultValue=cons.TK_LOGFILE_DIR, pCheckValue=None, pOverallSuccess=result) self._timekprConfig[param] = os.path.join(self._configDirPrefix, value) # global PlayTime config section section = "PLAYTIME" # read param = "TIMEKPR_PLAYTIME_ENABLED" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getboolean, section, param, pDefaultValue=cons.TK_PLAYTIME_ENABLED, pCheckValue=None, pOverallSuccess=resultValue) # read param = "TIMEKPR_PLAYTIME_ENHANCED_ACTIVITY_MONITOR_ENABLED" resultValue, self._timekprConfig[param] = _readAndNormalizeValue(self._timekprConfigParser.getboolean, section, param, pDefaultValue=cons.TK_PLAYTIME_ENABLED, pCheckValue=None, pOverallSuccess=resultValue) # if we could not read some values, save what we could + defaults if not resultValue: # logging log.log(cons.TK_LOG_LEVEL_INFO, "WARNING: some values in main config file (%s) could not be read or new configuration option was introduced, valid values and defaults are used / saved instead" % (self._configFile)) # save what we could self.initDefaultConfiguration(True) # if we could not read some values, report that (directories only) if not result: # logging log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: some directory values in main config file (%s) could not be read, valid values and defaults used (config NOT overwritten)" % (self._configFile)) # clear parser self._timekprConfigParser.clear() log.log(cons.TK_LOG_LEVEL_DEBUG, "finish loading configuration") # result return True def initDefaultConfiguration(self, pReuseValues=False): """Save config file (if someone messed up config file, we have to write new one)""" log.log(cons.TK_LOG_LEVEL_INFO, "start saving default configuration") # clear parser self._timekprConfigParser.clear() # save default config section = "DOCUMENTATION" self._timekprConfigParser.add_section(section) self._timekprConfigParser.set(section, "#### this is the main configuration file for timekpr-next") self._timekprConfigParser.set(section, "#### if this file cannot be read properly, it will be overwritten with defaults") section = "GENERAL" self._timekprConfigParser.add_section(section) self._timekprConfigParser.set(section, "#### general configuration section") # set up param param = "TIMEKPR_LOGLEVEL" self._timekprConfigParser.set(section, "# this defines logging level of the timekpr (1 - normal, 2 - debug, 3 - extra debug)") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_LOG_LEVEL_INFO)) # set up param param = "TIMEKPR_POLLTIME" self._timekprConfigParser.set(section, "# this defines polling time (in memory) in seconds") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_POLLTIME)) # set up param param = "TIMEKPR_SAVE_TIME" self._timekprConfigParser.set(section, "# this defines a time for saving user time control file (polling and accounting is done in memory more often, but saving is not)") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_SAVE_INTERVAL)) # set up param param = "TIMEKPR_TRACK_INACTIVE" self._timekprConfigParser.set(section, "# this defines whether to account sessions which are inactive (locked screen, user switched away from desktop, etc.),") self._timekprConfigParser.set(section, "# new users, when created, will inherit this value") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_TRACK_INACTIVE)) # set up param param = "TIMEKPR_TERMINATION_TIME" self._timekprConfigParser.set(section, "# this defines a time interval in seconds prior to assign user a termination sequence") self._timekprConfigParser.set(section, "# 15 seconds before time ends nothing can be done to avoid killing a session") self._timekprConfigParser.set(section, "# this also is the time before initiating a termination sequence if user has logged in inappropriate time") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_TERMINATION_TIME)) # set up param param = "TIMEKPR_FINAL_WARNING_TIME" self._timekprConfigParser.set(section, "# this defines a time interval prior to termination of user sessions when timekpr will send continous final warnings (countdown) until the actual termination") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_FINAL_COUNTDOWN_TIME)) # set up param param = "TIMEKPR_FINAL_NOTIFICATION_TIME" self._timekprConfigParser.set(section, "# this defines a time interval prior to termination of user sessions when timekpr will send one final warning about time left") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_FINAL_NOTIFICATION_TIME)) section = "SESSION" self._timekprConfigParser.add_section(section) self._timekprConfigParser.set(section, "#### this section contains configuration about sessions") # set up param param = "TIMEKPR_SESSION_TYPES_CTRL" self._timekprConfigParser.set(section, "# session types timekpr will track") self._timekprConfigParser.set(section, "%s" % (param), self._timekprConfig[param] if pReuseValues else cons.TK_SESSION_TYPES_CTRL) # set up param param = "TIMEKPR_SESSION_TYPES_EXCL" self._timekprConfigParser.set(section, "# session types timekpr will ignore explicitly") self._timekprConfigParser.set(section, "%s" % (param), self._timekprConfig[param] if pReuseValues else cons.TK_SESSION_TYPES_EXCL) # set up param param = "TIMEKPR_USERS_EXCL" self._timekprConfigParser.set(section, "# users timekpr will ignore explicitly") self._timekprConfigParser.set(section, "%s" % (param), self._timekprConfig[param] if pReuseValues else cons.TK_USERS_EXCL) section = "DIRECTORIES" self._timekprConfigParser.add_section(section) self._timekprConfigParser.set(section, "#### this section contains directory configuration") # set up param param = "TIMEKPR_CONFIG_DIR" self._timekprConfigParser.set(section, "# runtime directory for timekpr user configuration files") self._timekprConfigParser.set(section, "%s" % (param), self._timekprConfig[param] if pReuseValues else cons.TK_CONFIG_DIR) # set up param param = "TIMEKPR_WORK_DIR" self._timekprConfigParser.set(section, "# runtime directory for timekpr time control files") self._timekprConfigParser.set(section, "%s" % (param), self._timekprConfig[param] if pReuseValues else cons.TK_WORK_DIR) # set up param param = "TIMEKPR_SHARED_DIR" self._timekprConfigParser.set(section, "# directory for shared files (images, gui definitions, etc.)") self._timekprConfigParser.set(section, "%s" % (param), self._timekprConfig[param] if pReuseValues else cons.TK_SHARED_DIR) # set up param param = "TIMEKPR_LOGFILE_DIR" self._timekprConfigParser.set(section, "# directory for log files") self._timekprConfigParser.set(section, "%s" % (param), self._timekprConfig[param] if pReuseValues else cons.TK_LOGFILE_DIR) section = "PLAYTIME" self._timekprConfigParser.add_section(section) self._timekprConfigParser.set(section, "#### this section contains global PlayTime activity configuration") # set up param param = "TIMEKPR_PLAYTIME_ENABLED" self._timekprConfigParser.set(section, "# whether PlayTime is enabled globally") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_PLAYTIME_ENABLED)) # set up param param = "TIMEKPR_PLAYTIME_ENHANCED_ACTIVITY_MONITOR_ENABLED" self._timekprConfigParser.set(section, "# whether PlayTime activity monitor will use process command line, including arguments, for monitoring processes (by default only uses the process name)") self._timekprConfigParser.set(section, "%s" % (param), str(self._timekprConfig[param]) if pReuseValues else str(cons.TK_PLAYTIME_ENABLED)) # save the file with open(self._configFile, "w") as fp: self._timekprConfigParser.write(fp) # clear parser self._timekprConfigParser.clear() log.log(cons.TK_LOG_LEVEL_INFO, "finish saving default configuration") def saveTimekprConfiguration(self): """Write new sections of the file""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start saving timekpr configuration") # init dict values = {} # server loglevel param = "TIMEKPR_LOGLEVEL" values[param] = str(self._timekprConfig[param]) # in-memory polling time param = "TIMEKPR_POLLTIME" values[param] = str(self._timekprConfig[param]) # time interval to save user spent time param = "TIMEKPR_SAVE_TIME" values[param] = str(self._timekprConfig[param]) # track inactive (default value) param = "TIMEKPR_TRACK_INACTIVE" values[param] = str(self._timekprConfig[param]) # termination time (allowed login time when there is no time left before user is thrown out) param = "TIMEKPR_TERMINATION_TIME" values[param] = str(self._timekprConfig[param]) # final warning time (countdown to 0 before terminating session) param = "TIMEKPR_FINAL_WARNING_TIME" values[param] = str(self._timekprConfig[param]) # final notification time (final warning before terminating session) param = "TIMEKPR_FINAL_NOTIFICATION_TIME" values[param] = str(self._timekprConfig[param]) # which session types to control param = "TIMEKPR_SESSION_TYPES_CTRL" values[param] = str(self._timekprConfig[param]) # explicitly excludeds ession types (do not count time in these sessions) param = "TIMEKPR_SESSION_TYPES_EXCL" values[param] = str(self._timekprConfig[param]) # which users to exclude from time accounting param = "TIMEKPR_USERS_EXCL" values[param] = str(self._timekprConfig[param]) # whether PlayTime is enabled param = "TIMEKPR_PLAYTIME_ENABLED" values[param] = str(self._timekprConfig[param]) # whether PlayTime enhanced activity monitor is enabled param = "TIMEKPR_PLAYTIME_ENHANCED_ACTIVITY_MONITOR_ENABLED" values[param] = str(self._timekprConfig[param]) # ## pass placeholders for directories ## # config dir param = "TIMEKPR_CONFIG_DIR" values[param] = None # work dir param = "TIMEKPR_WORK_DIR" values[param] = None # shared dir param = "TIMEKPR_SHARED_DIR" values[param] = None # log dir param = "TIMEKPR_LOGFILE_DIR" values[param] = None # edit client config file (using alternate method because configparser looses comments in the process) _saveConfigFile(self._configFile, values) log.log(cons.TK_LOG_LEVEL_DEBUG, "finish saving timekpr configuration") def getTimekprVersion(self): """Get version""" # param param = "TIMEKPR_VERSION" # result return self._timekprConfig[param] def getTimekprLogLevel(self): """Get logging level""" # param param = "TIMEKPR_LOGLEVEL" # result return self._timekprConfig[param] def getTimekprPollTime(self): """Get polling time""" # param param = "TIMEKPR_POLLTIME" # result return self._timekprConfig[param] def getTimekprSaveTime(self): """Get save time""" # param param = "TIMEKPR_SAVE_TIME" # result return self._timekprConfig[param] def getTimekprTrackInactive(self): """Get tracking inactive""" # param param = "TIMEKPR_TRACK_INACTIVE" # result return self._timekprConfig[param] def getTimekprTerminationTime(self): """Get termination time""" # param param = "TIMEKPR_TERMINATION_TIME" # result return self._timekprConfig[param] def getTimekprFinalWarningTime(self): """Get final warning time""" # param param = "TIMEKPR_FINAL_WARNING_TIME" # result return self._timekprConfig[param] def getTimekprFinalNotificationTime(self): """Get final notification time""" # param param = "TIMEKPR_FINAL_NOTIFICATION_TIME" # result return self._timekprConfig[param] def getTimekprSessionsCtrl(self): """Get sessions to control""" # param param = "TIMEKPR_SESSION_TYPES_CTRL" # result return [rVal.strip() for rVal in self._timekprConfig[param].split(";") if rVal != ""] if param in self._timekprConfig else [] def getTimekprSessionsExcl(self): """Get sessions to exclude""" # param param = "TIMEKPR_SESSION_TYPES_EXCL" # result return [rVal.strip() for rVal in self._timekprConfig[param].split(";") if rVal != ""] if param in self._timekprConfig else [] def getTimekprUsersExcl(self): """Get sessions to exclude""" # param param = "TIMEKPR_USERS_EXCL" # result return [rVal.strip() for rVal in self._timekprConfig[param].split(";") if rVal != ""] if param in self._timekprConfig else [] def getTimekprConfigDir(self): """Get config dir""" # param param = "TIMEKPR_CONFIG_DIR" # result return cons.TK_CONFIG_DIR_DEV if cons.TK_DEV_ACTIVE else self._timekprConfig[param] def getTimekprWorkDir(self): """Get working dir""" # param param = "TIMEKPR_WORK_DIR" # result return cons.TK_WORK_DIR_DEV if cons.TK_DEV_ACTIVE else self._timekprConfig[param] def getTimekprSharedDir(self): """Get shared dir""" # param param = "TIMEKPR_SHARED_DIR" # result return cons.TK_SHARED_DIR_DEV if cons.TK_DEV_ACTIVE else self._timekprConfig[param] def getTimekprLogfileDir(self): """Get log file dir""" # param param = "TIMEKPR_LOGFILE_DIR" # result return cons.TK_LOGFILE_DIR_DEV if cons.TK_DEV_ACTIVE else self._timekprConfig[param] def getTimekprPlayTimeEnabled(self): """Return whether we have PlayTime enabled""" # param param = "TIMEKPR_PLAYTIME_ENABLED" # result return self._timekprConfig[param] def getTimekprPlayTimeEnhancedActivityMonitorEnabled(self): """Return whether we have PlayTime enhanced activity monitor is enabled""" # param param = "TIMEKPR_PLAYTIME_ENHANCED_ACTIVITY_MONITOR_ENABLED" # result return self._timekprConfig[param] def getTimekprLastModified(self): """Get last file modification time""" # result return datetime.fromtimestamp(os.path.getmtime(self._configFile)) def setTimekprLogLevel(self, pLogLevel): """Set logging level""" # result self._timekprConfig["TIMEKPR_LOGLEVEL"] = pLogLevel def setTimekprPollTime(self, pPollingTimeSecs): """Set polling time""" # result self._timekprConfig["TIMEKPR_POLLTIME"] = pPollingTimeSecs def setTimekprSaveTime(self, pSaveTimeSecs): """Set save time""" # result self._timekprConfig["TIMEKPR_SAVE_TIME"] = pSaveTimeSecs def setTimekprTrackInactive(self, pTrackInactiveDefault): """Get tracking inactive""" # result self._timekprConfig["TIMEKPR_TRACK_INACTIVE"] = pTrackInactiveDefault def setTimekprTerminationTime(self, pTerminationTimeSecs): """Set termination time""" # result self._timekprConfig["TIMEKPR_TERMINATION_TIME"] = pTerminationTimeSecs def setTimekprFinalWarningTime(self, pFinalWarningTimeSecs): """Set final warning time""" # result self._timekprConfig["TIMEKPR_FINAL_WARNING_TIME"] = pFinalWarningTimeSecs def setTimekprFinalNotificationTime(self, pFinalNotificationTimeSecs): """Set final warning time""" # result self._timekprConfig["TIMEKPR_FINAL_NOTIFICATION_TIME"] = pFinalNotificationTimeSecs def setTimekprSessionsCtrl(self, pSessionsCtrl): """Set sessions to control""" self._timekprConfig["TIMEKPR_SESSION_TYPES_CTRL"] = ";".join(pSessionsCtrl) def setTimekprSessionsExcl(self, pSessionsExcl): """Set sessions to exclude""" self._timekprConfig["TIMEKPR_SESSION_TYPES_EXCL"] = ";".join(pSessionsExcl) def setTimekprUsersExcl(self, pUsersExcl): """Set sessions to exclude""" self._timekprConfig["TIMEKPR_USERS_EXCL"] = ";".join(pUsersExcl) def setTimekprPlayTimeEnabled(self, pPlayTimeEnabled): """Set PlayTime enable flag""" self._timekprConfig["TIMEKPR_PLAYTIME_ENABLED"] = bool(pPlayTimeEnabled) def setTimekprPlayTimeEnhancedActivityMonitorEnabled(self, pPlayTimeAdvancedSearchEnabled): """Set PlayTime enable flag""" self._timekprConfig["TIMEKPR_PLAYTIME_ENHANCED_ACTIVITY_MONITOR_ENABLED"] = bool(pPlayTimeAdvancedSearchEnabled) class timekprUserConfig(object): """Class will contain and provide config related functionality""" def __init__(self, pDirectory, pUserName): """Initialize config""" log.log(cons.TK_LOG_LEVEL_INFO, "init user (%s) configuration manager" % (pUserName)) # initialize class variables self._configFile = os.path.join(pDirectory, cons.TK_USER_CONFIG_FILE % (pUserName)) self._userName = pUserName self._timekprUserConfig = {} # parser self._timekprUserConfigParser = configparser.ConfigParser(allow_no_value=True) self._timekprUserConfigParser.optionxform = str log.log(cons.TK_LOG_LEVEL_INFO, "finish user configuration manager") def __del__(self): """De-initialize config""" log.log(cons.TK_LOG_LEVEL_INFO, "de-init user configuration manager") def loadConfiguration(self, pValidateOnly=False): """Read user timekpr config file""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start load user configuration") # user config section section = self._userName # try to load config file result = _loadAndPrepareConfigFile(self._timekprUserConfigParser, self._configFile) # value read result resultValue = True # if we still are fine (and not just checking) if not pValidateOnly or (pValidateOnly and result): # read config failed, we need to initialize if not result: # logging log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: could not parse the main configuration file (%s) properly, will use default values" % (self._configFile)) # init config self.initUserConfiguration() # re-read the file self._timekprUserConfigParser.read(self._configFile) # read param = "ALLOWED_HOURS" for i in range(1, 7+1): resultValue, self._timekprUserConfig["%s_%s" % (param, str(i))] = _readAndNormalizeValue(self._timekprUserConfigParser.get, section, ("%s_%s" % (param, str(i))), pDefaultValue=cons.TK_ALLOWED_HOURS, pCheckValue=None, pOverallSuccess=resultValue) # read param = "ALLOWED_WEEKDAYS" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.get, section, param, pDefaultValue=cons.TK_ALLOWED_WEEKDAYS, pCheckValue=None, pOverallSuccess=resultValue) self._timekprUserConfig[param] = _cleanupValue(self._timekprUserConfig[param]) # read param = "LIMITS_PER_WEEKDAYS" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.get, section, param, pDefaultValue=cons.TK_LIMITS_PER_WEEKDAYS, pCheckValue=None, pOverallSuccess=resultValue) self._timekprUserConfig[param] = _cleanupValue(self._timekprUserConfig[param]) # read param = "LIMIT_PER_WEEK" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.getint, section, param, pDefaultValue=cons.TK_LIMIT_PER_WEEK, pCheckValue=None, pOverallSuccess=resultValue) # read param = "LIMIT_PER_MONTH" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.getint, section, param, pDefaultValue=cons.TK_LIMIT_PER_MONTH, pCheckValue=None, pOverallSuccess=resultValue) # read param = "TRACK_INACTIVE" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.getboolean, section, param, pDefaultValue=cons.TK_TRACK_INACTIVE, pCheckValue=None, pOverallSuccess=resultValue) # read param = "HIDE_TRAY_ICON" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.getboolean, section, param, pDefaultValue=cons.TK_HIDE_TRAY_ICON, pCheckValue=None, pOverallSuccess=resultValue) # read param = "LOCKOUT_TYPE" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.get, section, param, pDefaultValue=cons.TK_CTRL_RES_T, pCheckValue=None, pOverallSuccess=resultValue) # read param = "WAKEUP_HOUR_INTERVAL" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.get, section, param, pDefaultValue="0;23", pCheckValue=None, pOverallSuccess=resultValue) self._timekprUserConfig[param] = _cleanupValue(self._timekprUserConfig[param]) # user PlayTime config section section = "%s.%s" % (self._userName, "PLAYTIME") # read param = "PLAYTIME_ENABLED" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.getboolean, section, param, pDefaultValue=cons.TK_PLAYTIME_ENABLED, pCheckValue=None, pOverallSuccess=resultValue) # read param = "PLAYTIME_LIMIT_OVERRIDE_ENABLED" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.getboolean, section, param, pDefaultValue=cons.TK_PLAYTIME_ENABLED, pCheckValue=None, pOverallSuccess=resultValue) # read param = "PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.getboolean, section, param, pDefaultValue=(not cons.TK_PLAYTIME_ENABLED), pCheckValue=None, pOverallSuccess=resultValue) # read param = "PLAYTIME_ALLOWED_WEEKDAYS" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.get, section, param, pDefaultValue=cons.TK_PLAYTIME_ALLOWED_WEEKDAYS, pCheckValue=None, pOverallSuccess=resultValue) self._timekprUserConfig[param] = _cleanupValue(self._timekprUserConfig[param]) # read param = "PLAYTIME_LIMITS_PER_WEEKDAYS" resultValue, self._timekprUserConfig[param] = _readAndNormalizeValue(self._timekprUserConfigParser.get, section, param, pDefaultValue=cons.TK_PLAYTIME_LIMITS_PER_WEEKDAYS, pCheckValue=None, pOverallSuccess=resultValue) self._timekprUserConfig[param] = _cleanupValue(self._timekprUserConfig[param]) # read activities self._timekprUserConfig["PLAYTIME_ACTIVITIES"] = [] appCfgKeys = [rParam[0] for rParam in self._timekprUserConfigParser.items(section) if "PLAYTIME_ACTIVITY_" in rParam[0]] if self._timekprUserConfigParser.has_section(section) else [] # read all apps (apps have to be properly configured) for rAppIdx in range(0, len(appCfgKeys)): # read value resultValue, process = _readAndNormalizeValue(self._timekprUserConfigParser.get, section, appCfgKeys[rAppIdx], pDefaultValue=None, pCheckValue=None, pOverallSuccess=resultValue) # read successful if process is not None: # add to the activities list proc, desc = splitConfigValueNameParam(process) # we have valid process if proc is not None: # save process self._timekprUserConfig["PLAYTIME_ACTIVITIES"].append([proc, desc]) # log log.log(cons.TK_LOG_LEVEL_DEBUG, "PT: found total %i activities, valid %i" % (len(appCfgKeys), len(self._timekprUserConfig["PLAYTIME_ACTIVITIES"]))) # if we could not read some values, save what we could + defaults if not resultValue: # logging log.log(cons.TK_LOG_LEVEL_INFO, "WARNING: some values in user config file (%s) could not be read or new configuration option was introduced, valid values and defaults are used / saved instead" % (self._configFile)) # init config with partial values read and save what we could self.initUserConfiguration(True) # clear parser self._timekprUserConfigParser.clear() # clear parser self._timekprUserConfigParser.clear() log.log(cons.TK_LOG_LEVEL_DEBUG, "finish load user configuration") # result return result def initUserConfiguration(self, pReuseValues=False): """Write new sections of the file""" log.log(cons.TK_LOG_LEVEL_INFO, "init default user (%s) configuration" % (self._userName)) # clear parser self._timekprUserConfigParser.clear() # save default config section = "DOCUMENTATION" self._timekprUserConfigParser.add_section(section) self._timekprUserConfigParser.set(section, "#### this is the user configuration file for timekpr-next") self._timekprUserConfigParser.set(section, "#### if this file cannot be read properly, it will be overwritten with defaults") self._timekprUserConfigParser.set(section, "#### all numeric time values are specified in seconds") self._timekprUserConfigParser.set(section, "#### days and hours should be configured as per ISO 8601 (i.e. Monday is the first day of week (1-7) and hours are in 24h format (0-23))") # add new user section section = self._userName self._timekprUserConfigParser.add_section(section) self._timekprUserConfigParser.set(section, "# this defines which hours are allowed (remove or add hours to limit access), configure limits for start/end minutes for hour in brackets,") self._timekprUserConfigParser.set(section, "# optionally enter ! in front of hour to mark it non-accountable, example: !22[00-15]") # set up param param = "ALLOWED_HOURS" # set hours for all days for i in range(1, 7+1): self._timekprUserConfigParser.set(section, "%s_%s" % (param, str(i)), self._timekprUserConfig["%s_%s" % (param, str(i))] if pReuseValues else cons.TK_ALLOWED_HOURS) # set up param param = "ALLOWED_WEEKDAYS" self._timekprUserConfigParser.set(section, "# this defines which days of the week a user can use computer (remove or add days to limit access)") self._timekprUserConfigParser.set(section, "%s" % (param), self._timekprUserConfig[param] if pReuseValues else cons.TK_ALLOWED_WEEKDAYS) # set up param param = "LIMITS_PER_WEEKDAYS" self._timekprUserConfigParser.set(section, "# this defines allowed time in seconds per week day a user can use the computer (number of values must match the number of values for option ALLOWED_WEEKDAYS)") self._timekprUserConfigParser.set(section, "%s" % (param), self._timekprUserConfig[param] if pReuseValues else cons.TK_LIMITS_PER_WEEKDAYS) # set up param param = "LIMIT_PER_WEEK" self._timekprUserConfigParser.set(section, "# this defines allowed time per week in seconds (in addition to other limits)") self._timekprUserConfigParser.set(section, "%s" % (param), str(self._timekprUserConfig[param]) if pReuseValues else str(cons.TK_LIMIT_PER_WEEK)) # set up param param = "LIMIT_PER_MONTH" self._timekprUserConfigParser.set(section, "# this defines allowed time per month in seconds (in addition to other limits)") self._timekprUserConfigParser.set(section, "%s" % (param), str(self._timekprUserConfig[param]) if pReuseValues else str(cons.TK_LIMIT_PER_MONTH)) # set up param param = "TRACK_INACTIVE" self._timekprUserConfigParser.set(section, "# this defines whether to account sessions which are inactive (locked screen, user switched away from desktop, etc.)") self._timekprUserConfigParser.set(section, "%s" % (param), str(self._timekprUserConfig[param]) if pReuseValues else str(cons.TK_TRACK_INACTIVE)) # set up param param = "HIDE_TRAY_ICON" self._timekprUserConfigParser.set(section, "# this defines whether to show icon and notifications for user") self._timekprUserConfigParser.set(section, "%s" % (param), str(self._timekprUserConfig[param]) if pReuseValues else str(cons.TK_HIDE_TRAY_ICON)) # set up param param = "LOCKOUT_TYPE" self._timekprUserConfigParser.set(section, "# this defines user restriction / lockout mode: lock - lock screen, suspend - put computer to sleep, suspendwake - put computer to sleep and wake it up,") self._timekprUserConfigParser.set(section, "# terminate - terminate sessions, shutdown - shutdown the computer") self._timekprUserConfigParser.set(section, "%s" % (param), self._timekprUserConfig[param] if pReuseValues else cons.TK_CTRL_RES_T) # set up param param = "WAKEUP_HOUR_INTERVAL" self._timekprUserConfigParser.set(section, "# this defines wakeup hour interval in format xn;yn where xn / yn are hours from 0 to 23, wakeup itself must be supported by BIOS / UEFI and enabled,") self._timekprUserConfigParser.set(section, "# this is effective only when lockout type is suspendwake") self._timekprUserConfigParser.set(section, "%s" % (param), self._timekprUserConfig[param] if pReuseValues else "0;23") # PlayTime section = "%s.%s" % (self._userName, "PLAYTIME") self._timekprUserConfigParser.add_section(section) # set up param param = "PLAYTIME_ENABLED" self._timekprUserConfigParser.set(section, "# whether PlayTime is enabled for this user") self._timekprUserConfigParser.set(section, "%s" % (param), str(self._timekprUserConfig[param]) if pReuseValues else str(cons.TK_PLAYTIME_ENABLED)) # set up param param = "PLAYTIME_LIMIT_OVERRIDE_ENABLED" self._timekprUserConfigParser.set(section, "# whether PlayTime is enabled to override existing time accounting, i.e. time ticks only when PlayTime processes / activities are running,") self._timekprUserConfigParser.set(section, "# in this case explicit PlayTime limits are ignored") self._timekprUserConfigParser.set(section, "%s" % (param), str(self._timekprUserConfig[param]) if pReuseValues else str(cons.TK_PLAYTIME_ENABLED)) # set up param param = "PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED" self._timekprUserConfigParser.set(section, "# whether PlayTime activities are allowed during unaccounted time intervals") self._timekprUserConfigParser.set(section, "%s" % (param), str(self._timekprUserConfig[param]) if pReuseValues else str(not cons.TK_PLAYTIME_ENABLED)) # set up param param = "PLAYTIME_ALLOWED_WEEKDAYS" self._timekprUserConfigParser.set(section, "# specify on which days PlayTime is enabled") self._timekprUserConfigParser.set(section, "%s" % (param), self._timekprUserConfig[param] if pReuseValues else cons.TK_PLAYTIME_ALLOWED_WEEKDAYS) # set up param param = "PLAYTIME_LIMITS_PER_WEEKDAYS" self._timekprUserConfigParser.set(section, "# how much PlayTime is allowed per allowed days (number of values must match the number of values for option PLAYTIME_ALLOWED_WEEKDAYS)") self._timekprUserConfigParser.set(section, "%s" % (param), self._timekprUserConfig[param] if pReuseValues else cons.TK_PLAYTIME_LIMITS_PER_WEEKDAYS) # set up param self._timekprUserConfigParser.set(section, "# this defines which activities / processes are monitored, pattern: PLAYTIME_ACTIVITY_NNN = PROCESS_MASK[DESCRIPTION],") self._timekprUserConfigParser.set(section, "# where NNN is number left padded with 0 (keys must be unique and ordered), optionally it's possible to add user") self._timekprUserConfigParser.set(section, "# friendly description in [] brackets. Process mask supports regexp, except symbols [], please be careful entering it!") self._timekprUserConfigParser.set(section, "##PLAYTIME_ACTIVITIES## Do NOT remove or alter this line!") # save all activity values (activities are varying list), do this only if values are reused for rPTAppIdx in range(0, len(self._timekprUserConfig["PLAYTIME_ACTIVITIES"]) if pReuseValues else 0): # write all to file param = "PLAYTIME_ACTIVITY_%s" % (str(rPTAppIdx+1).rjust(3, "0")) act = self._timekprUserConfig["PLAYTIME_ACTIVITIES"][rPTAppIdx][0] desc = self._timekprUserConfig["PLAYTIME_ACTIVITIES"][rPTAppIdx][1] self._timekprUserConfigParser.set(section, "%s" % (param), "%s[%s]" % (act, desc) if desc is not None else "%s" % (act)) # save the file with open(self._configFile, "w") as fp: self._timekprUserConfigParser.write(fp) # clear parser self._timekprUserConfigParser.clear() log.log(cons.TK_LOG_LEVEL_INFO, "finish init default user configuration") def saveUserConfiguration(self): """Write new sections of the file""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start saving new user (%s) configuration" % (self._userName)) # init dict values = {} # allowed weekdays param = "ALLOWED_WEEKDAYS" values[param] = self._timekprUserConfig[param] # allowed hours for every week day for rDay in range(1, 7+1): param = "ALLOWED_HOURS_%s" % (str(rDay)) values[param] = self._timekprUserConfig[param] # limits per weekdays param = "LIMITS_PER_WEEKDAYS" values[param] = self._timekprUserConfig[param] # limits per week param = "LIMIT_PER_WEEK" values[param] = str(self._timekprUserConfig[param]) # limits per month param = "LIMIT_PER_MONTH" values[param] = str(self._timekprUserConfig[param]) # track inactive param = "TRACK_INACTIVE" values[param] = str(self._timekprUserConfig[param]) # try icon param = "HIDE_TRAY_ICON" values[param] = str(self._timekprUserConfig[param]) # restriction / lockout type param = "LOCKOUT_TYPE" values[param] = self._timekprUserConfig[param] # wakeup hour interval param = "WAKEUP_HOUR_INTERVAL" values[param] = self._timekprUserConfig[param] # PlayTime config # PlayTime enabled param = "PLAYTIME_ENABLED" values[param] = str(self._timekprUserConfig[param]) # PlayTime override enabled param = "PLAYTIME_LIMIT_OVERRIDE_ENABLED" values[param] = str(self._timekprUserConfig[param]) # PlayTime allowed during unaccounted intervals param = "PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED" values[param] = str(self._timekprUserConfig[param]) # PlayTime allowed weekdays param = "PLAYTIME_ALLOWED_WEEKDAYS" values[param] = self._timekprUserConfig[param] # PlayTime limits per weekdays param = "PLAYTIME_LIMITS_PER_WEEKDAYS" values[param] = str(self._timekprUserConfig[param]) # PlayTime activities param = "PLAYTIME_ACTIVITIES" values[param] = [] # save all activity values for rPTAppIdx in range(0, len(self._timekprUserConfig[param])): # write all to file subparam = "PLAYTIME_ACTIVITY_%s" % (str(rPTAppIdx + 1).rjust(3, "0")) act = self._timekprUserConfig["PLAYTIME_ACTIVITIES"][rPTAppIdx][0] desc = self._timekprUserConfig["PLAYTIME_ACTIVITIES"][rPTAppIdx][1] values[param].append("%s = %s[%s]" % (subparam, act, desc) if desc is not None else "%s = %s" % (subparam, act)) # edit client config file (using alternate method because configparser looses comments in the process) _saveConfigFile(self._configFile, values) log.log(cons.TK_LOG_LEVEL_DEBUG, "finish saving new user configuration") def getUserAllowedHours(self, pDay): """Get allowed hours""" # this is the dict for hour config allowedHours = {} # get allowed hours for all of the week days param = "ALLOWED_HOURS_%s" % (pDay) # minutes can be specified in brackets after hour if self._timekprUserConfig[param] != "": for rHour in self._timekprUserConfig[param].split(";"): # determine hour and minutes hour, sMin, eMin, uacc = findHourStartEndMinutes(rHour) # hour is correct if hour is not None: # get our dict done allowedHours[str(hour)] = {cons.TK_CTRL_SMIN: sMin, cons.TK_CTRL_EMIN: eMin, cons.TK_CTRL_UACC: uacc} # result return allowedHours def getUserAllowedWeekdays(self): """Get allowed week days""" # param param = "ALLOWED_WEEKDAYS" # result return [rVal.strip() for rVal in self._timekprUserConfig[param].split(";") if rVal != ""] def getUserLimitsPerWeekdays(self): """Get allowed limits per week day""" # param param = "LIMITS_PER_WEEKDAYS" # result return [int(rVal.strip()) for rVal in self._timekprUserConfig[param].split(";") if rVal != ""] def getUserWeekLimit(self): """Get limit per week""" # result return self._timekprUserConfig["LIMIT_PER_WEEK"] def getUserMonthLimit(self): """Get limit per month""" # result return self._timekprUserConfig["LIMIT_PER_MONTH"] def getUserTrackInactive(self): """Get whether to track inactive sessions""" # result return self._timekprUserConfig["TRACK_INACTIVE"] def getUserHideTrayIcon(self): """Get whether to hide icon and notifications""" # result return self._timekprUserConfig["HIDE_TRAY_ICON"] def getUserLockoutType(self): """Get user restriction / lockout type""" # result return self._timekprUserConfig["LOCKOUT_TYPE"] def getUserWakeupHourInterval(self): """Get user wakeup hour intervals""" # param param = "WAKEUP_HOUR_INTERVAL" # result return [rVal.strip() for rVal in self._timekprUserConfig[param].split(";") if rVal != ""] def getUserPlayTimeEnabled(self): """Return whether we have PlayTime enabled""" # param param = "PLAYTIME_ENABLED" # check whether user has this enabled in config return self._timekprUserConfig[param] def getUserPlayTimeOverrideEnabled(self): """Return whether we have PlayTime overrides the normal time accounting""" # param param = "PLAYTIME_LIMIT_OVERRIDE_ENABLED" # result return self._timekprUserConfig[param] def getUserPlayTimeUnaccountedIntervalsEnabled(self): """Return whether PlayTime activities are allowed during unaccounted intervals""" # param param = "PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED" # result return self._timekprUserConfig[param] def getUserPlayTimeAllowedWeekdays(self): """Get allowed week days for PlayTime""" # param param = "PLAYTIME_ALLOWED_WEEKDAYS" # result return [rVal.strip() for rVal in self._timekprUserConfig[param].split(";") if rVal != ""] def getUserPlayTimeLimitsPerWeekdays(self): """Get allowed limits per week day for PlayTime""" # param param = "PLAYTIME_LIMITS_PER_WEEKDAYS" # result return [int(rVal.strip()) for rVal in self._timekprUserConfig[param].split(";") if rVal != ""] def getUserPlayTimeActivities(self): """Return PlayTime process / process list""" # param param = "PLAYTIME_ACTIVITIES" # result return self._timekprUserConfig[param] def getUserConfigLastModified(self): """Get last file modification time for user""" # result return datetime.fromtimestamp(os.path.getmtime(self._configFile)) def setUserAllowedHours(self, pAllowedHours): """Set allowed hours""" # go through all days given for modifications for rDay, rHours in pAllowedHours.items(): # inital hours hours = [] # go through all hours (in correct order) for rHour in range(0, 23+1): # convert once hour = str(rHour) # do we have config for this hour if hour in rHours: # is this hour unaccounted unaccounted = "!" if rHours[hour][cons.TK_CTRL_UACC] else "" # do we have proper minuten minutes = ("[%i-%i]" % (rHours[hour][cons.TK_CTRL_SMIN], rHours[hour][cons.TK_CTRL_EMIN])) if (rHours[hour][cons.TK_CTRL_SMIN] > 0 or rHours[hour][cons.TK_CTRL_EMIN] < 60) else "" # build up this hour hours.append("%s%s%s" % (unaccounted, hour, minutes)) # add this hour to allowable list self._timekprUserConfig["ALLOWED_HOURS_%s" % (str(rDay))] = ";".join(hours) def setUserAllowedWeekdays(self, pAllowedWeekdays): """Set allowed week days""" # set up weekdays self._timekprUserConfig["ALLOWED_WEEKDAYS"] = ";".join(map(str, pAllowedWeekdays)) def setUserLimitsPerWeekdays(self, pLimits): """Set allowed limits per week day""" # set up limits for weekdays self._timekprUserConfig["LIMITS_PER_WEEKDAYS"] = ";".join(map(str, pLimits)) def setUserWeekLimit(self, pWeekLimitSecs): """Set limit per week""" # result self._timekprUserConfig["LIMIT_PER_WEEK"] = int(pWeekLimitSecs) def setUserMonthLimit(self, pMonthLimitSecs): """Set limit per month""" # result self._timekprUserConfig["LIMIT_PER_MONTH"] = int(pMonthLimitSecs) def setUserTrackInactive(self, pTrackInactive): """Set whether to track inactive sessions""" # set track inactive self._timekprUserConfig["TRACK_INACTIVE"] = bool(pTrackInactive) def setUserHideTrayIcon(self, pHideTrayIcon): """Set whether to hide icon and notifications""" # result self._timekprUserConfig["HIDE_TRAY_ICON"] = bool(pHideTrayIcon) def setUserLockoutType(self, pLockoutType): """Set user restriction / lockout type""" # result self._timekprUserConfig["LOCKOUT_TYPE"] = pLockoutType def setUserWakeupHourInterval(self, pWakeupHourInterval): """Set user wake up hours from / to""" # result self._timekprUserConfig["WAKEUP_HOUR_INTERVAL"] = ";".join(pWakeupHourInterval) def setUserPlayTimeEnabled(self, pPlayTimeEnabled): """Set PlayTime enabled for user""" # result self._timekprUserConfig["PLAYTIME_ENABLED"] = pPlayTimeEnabled def setUserPlayTimeOverrideEnabled(self, pPlayTimeOverrideEnabled): """Set PlayTime override to the normal time accounting""" # result self._timekprUserConfig["PLAYTIME_LIMIT_OVERRIDE_ENABLED"] = pPlayTimeOverrideEnabled def setUserPlayTimeUnaccountedIntervalsEnabled(self, pPlayTimeUnaccountedIntervalsEnabled): """Set whether PlayTime activities are allowed during unaccounted intervals""" # result self._timekprUserConfig["PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED"] = pPlayTimeUnaccountedIntervalsEnabled def setUserPlayTimeAllowedWeekdays(self, pPlayTimeAllowedWeekdays): """Set allowed week days for PlayTime""" # set up weekdays self._timekprUserConfig["PLAYTIME_ALLOWED_WEEKDAYS"] = ";".join(map(str, pPlayTimeAllowedWeekdays)) def setUserPlayTimeLimitsPerWeekdays(self, pPlayTimeAllowedLimitsPerWeekdays): """Set allowed week day limits for PlayTime""" # set up weekdays self._timekprUserConfig["PLAYTIME_LIMITS_PER_WEEKDAYS"] = ";".join(map(str, pPlayTimeAllowedLimitsPerWeekdays)) def setUserPlayTimeAcitivityList(self, pPlayTimeActivityList): """Set PlayTime process / process list""" # def self._timekprUserConfig["PLAYTIME_ACTIVITIES"] = [] # loop through all for i in range(0, len(pPlayTimeActivityList)): # desc desc = None if pPlayTimeActivityList[i][1] == "" else pPlayTimeActivityList[i][1] # set this up self._timekprUserConfig["PLAYTIME_ACTIVITIES"].append([pPlayTimeActivityList[i][0], desc]) class timekprUserControl(object): """Class will provide time spent file management functionality""" def __init__(self, pDirectory, pUserName): """Initialize config""" log.log(cons.TK_LOG_LEVEL_INFO, "init user (%s) control" % (pUserName)) # initialize class variables self._configFile = os.path.join(pDirectory, "%s.time" % (pUserName)) self._userName = pUserName self._timekprUserControl = {} # parser self._timekprUserControlParser = configparser.ConfigParser(allow_no_value=True) self._timekprUserControlParser.optionxform = str log.log(cons.TK_LOG_LEVEL_INFO, "finish init user control") def __del__(self): """De-initialize config""" log.log(cons.TK_LOG_LEVEL_INFO, "de-init user control") def loadControl(self, pValidateOnly=False): """Read main timekpr config file""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start loading user control (%s)" % (self._userName)) # directory section section = self._userName # try to load config file result = _loadAndPrepareConfigFile(self._timekprUserControlParser, self._configFile) # value read result resultValue = True # if we still are fine (and not just checking) if not pValidateOnly or (pValidateOnly and result): # read config failed, we need to initialize if not result: # logging log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: could not parse the user control file (%s) properly, will recreate" % (self._configFile)) # init config self.initUserControl() # re-read the file self._timekprUserControlParser.read(self._configFile) # read param = "TIME_SPENT_BALANCE" resultValue, self._timekprUserControl[param] = _readAndNormalizeValue(self._timekprUserControlParser.getint, section, param, pDefaultValue=0, pCheckValue=cons.TK_LIMIT_PER_DAY, pOverallSuccess=resultValue) # read param = "TIME_SPENT_DAY" resultValue, self._timekprUserControl[param] = _readAndNormalizeValue(self._timekprUserControlParser.getint, section, param, pDefaultValue=0, pCheckValue=cons.TK_LIMIT_PER_DAY, pOverallSuccess=resultValue) # read param = "TIME_SPENT_WEEK" resultValue, self._timekprUserControl[param] = _readAndNormalizeValue(self._timekprUserControlParser.getint, section, param, pDefaultValue=0, pCheckValue=cons.TK_LIMIT_PER_WEEK, pOverallSuccess=resultValue) # read param = "TIME_SPENT_MONTH" resultValue, self._timekprUserControl[param] = _readAndNormalizeValue(self._timekprUserControlParser.getint, section, param, pDefaultValue=0, pCheckValue=cons.TK_LIMIT_PER_MONTH, pOverallSuccess=resultValue) # read param = "LAST_CHECKED" resultValue, self._timekprUserControl[param] = _readAndNormalizeValue(self._timekprUserControlParser.get, section, param, pDefaultValue=datetime.now().replace(microsecond=0), pCheckValue=None, pOverallSuccess=resultValue) # user PlayTime config section section = "%s.%s" % (self._userName, "PLAYTIME") # read param = "PLAYTIME_SPENT_BALANCE" resultValue, self._timekprUserControl[param] = _readAndNormalizeValue(self._timekprUserControlParser.getint, section, param, pDefaultValue=0, pCheckValue=cons.TK_LIMIT_PER_DAY, pOverallSuccess=resultValue) # read param = "PLAYTIME_SPENT_DAY" resultValue, self._timekprUserControl[param] = _readAndNormalizeValue(self._timekprUserControlParser.getint, section, param, pDefaultValue=0, pCheckValue=cons.TK_LIMIT_PER_DAY, pOverallSuccess=resultValue) # if we could not read some values, save what we could + defaults if not resultValue: # logging log.log(cons.TK_LOG_LEVEL_INFO, "WARNING: some values in user control file (%s) could not be read or new configuration option was introduced, valid values and defaults are used / saved instead" % (self._configFile)) # save what we could self.initUserControl(True) # clear parser self._timekprUserControlParser.clear() log.log(cons.TK_LOG_LEVEL_DEBUG, "finish loading user control") # result return result def initUserControl(self, pReuseValues=False): """Write new sections of the file""" log.log(cons.TK_LOG_LEVEL_INFO, "start init user (%s) control" % (self._userName)) # clear parser self._timekprUserControlParser.clear() # add new user section section = self._userName self._timekprUserControlParser.add_section(section) self._timekprUserControlParser.set(section, "#### NOTE: all number values are stored in seconds") # set up param param = "TIME_SPENT_BALANCE" self._timekprUserControlParser.set(section, "# total time balance spent for this day") self._timekprUserControlParser.set(section, "%s" % (param), str(self._timekprUserControl[param]) if pReuseValues else "0") # set up param param = "TIME_SPENT_DAY" self._timekprUserControlParser.set(section, "# total time spent for this day") self._timekprUserControlParser.set(section, "%s" % (param), str(self._timekprUserControl[param]) if pReuseValues else "0") # set up param param = "TIME_SPENT_WEEK" self._timekprUserControlParser.set(section, "# total spent for this week") self._timekprUserControlParser.set(section, "%s" % (param), str(self._timekprUserControl[param]) if pReuseValues else "0") # set up param param = "TIME_SPENT_MONTH" self._timekprUserControlParser.set(section, "# total spent for this month") self._timekprUserControlParser.set(section, "%s" % (param), str(self._timekprUserControl[param]) if pReuseValues else "0") # set up param param = "LAST_CHECKED" self._timekprUserControlParser.set(section, "# last update time of the file") self._timekprUserControlParser.set(section, "%s" % (param), self._timekprUserControl[param].strftime(cons.TK_DATETIME_FORMAT) if pReuseValues else datetime.now().replace(microsecond=0).strftime(cons.TK_DATETIME_FORMAT)) # user PlayTime config section section = "%s.%s" % (self._userName, "PLAYTIME") self._timekprUserControlParser.add_section(section) param = "PLAYTIME_SPENT_BALANCE" self._timekprUserControlParser.set(section, "# total PlayTime balance spent for this day") self._timekprUserControlParser.set(section, "%s" % (param), str(self._timekprUserControl[param]) if pReuseValues else "0") param = "PLAYTIME_SPENT_DAY" self._timekprUserControlParser.set(section, "# total PlayTime spent for this day") self._timekprUserControlParser.set(section, "%s" % (param), str(self._timekprUserControl[param]) if pReuseValues else "0") # save the file with open(self._configFile, "w") as fp: self._timekprUserControlParser.write(fp) # clear parser self._timekprUserControlParser.clear() log.log(cons.TK_LOG_LEVEL_INFO, "finish init user control") def saveControl(self): """Save configuration""" log.log(cons.TK_LOG_LEVEL_INFO, "start save user (%s) control" % (self._userName)) # init dict values = {} # spent day (including bonuses) param = "TIME_SPENT_BALANCE" values[param] = str(int(self._timekprUserControl[param])) # spent day param = "TIME_SPENT_DAY" values[param] = str(int(self._timekprUserControl[param])) # spent week param = "TIME_SPENT_WEEK" values[param] = str(int(self._timekprUserControl[param])) # spent month param = "TIME_SPENT_MONTH" values[param] = str(int(self._timekprUserControl[param])) # last checked param = "LAST_CHECKED" values[param] = self._timekprUserControl[param].strftime(cons.TK_DATETIME_FORMAT) # PlayTime balance param = "PLAYTIME_SPENT_BALANCE" values[param] = str(int(self._timekprUserControl[param])) # PlayTime spent day param = "PLAYTIME_SPENT_DAY" values[param] = str(int(self._timekprUserControl[param])) # edit control file (using alternate method because configparser looses comments in the process) _saveConfigFile(self._configFile, values) log.log(cons.TK_LOG_LEVEL_INFO, "finish save user control") def getUserDateComponentChanges(self, pCheckDate, pValidationDate=None): """Determine whether days / weeks / months changed since last change date in file or other date""" # date to validate against validationDate = pValidationDate.date() if pValidationDate is not None else self.getUserLastChecked().date() checkDate = pCheckDate.date() # ## validations ## # month changed monthChanged = (checkDate.year != validationDate.year or checkDate.month != validationDate.month) # week changed weekChanged = (monthChanged or checkDate.isocalendar()[1] != validationDate.isocalendar()[1]) # day changed dayChanged = (weekChanged or checkDate != validationDate) # result (day / week / month) return dayChanged, weekChanged, monthChanged def getUserTimeSpentBalance(self): """Get time spent for day (including bonues)""" # result return self._timekprUserControl["TIME_SPENT_BALANCE"] def getUserTimeSpentDay(self): """Get time spent for day""" # result return self._timekprUserControl["TIME_SPENT_DAY"] def getUserTimeSpentWeek(self): """Get time spent for week""" # result return self._timekprUserControl["TIME_SPENT_WEEK"] def getUserTimeSpentMonth(self): """Get time spent for month""" # result return self._timekprUserControl["TIME_SPENT_MONTH"] def getUserLastChecked(self): """Get last check time for user""" # result return self._timekprUserControl["LAST_CHECKED"] def getUserPlayTimeSpentBalance(self): """Get PlayTime balance for day (including bonues)""" # result return self._timekprUserControl["PLAYTIME_SPENT_BALANCE"] def getUserPlayTimeSpentDay(self): """Get PlayTime spent for day (including bonues)""" # result return self._timekprUserControl["PLAYTIME_SPENT_DAY"] def getUserControlLastModified(self): """Get last file modification time for user""" # result return datetime.fromtimestamp(os.path.getmtime(self._configFile)) def setUserTimeSpentBalance(self, pTimeSpent): """Set time spent for day (including bonuses)""" # result self._timekprUserControl["TIME_SPENT_BALANCE"] = pTimeSpent def setUserTimeSpentDay(self, pTimeSpentDay): """Set time spent for day""" # result self._timekprUserControl["TIME_SPENT_DAY"] = pTimeSpentDay def setUserTimeSpentWeek(self, pTimeSpentWeek): """Set time spent for week""" # result self._timekprUserControl["TIME_SPENT_WEEK"] = pTimeSpentWeek def setUserTimeSpentMonth(self, pTimeSpentMonth): """Set time spent for month""" # result self._timekprUserControl["TIME_SPENT_MONTH"] = pTimeSpentMonth def setUserLastChecked(self, pEffectiveDatetime): """Set last check time for user""" # result self._timekprUserControl["LAST_CHECKED"] = pEffectiveDatetime def setUserPlayTimeSpentBalance(self, pTimeSpent): """Set PlayTime balance for day (including bonues)""" # result self._timekprUserControl["PLAYTIME_SPENT_BALANCE"] = pTimeSpent def setUserPlayTimeSpentDay(self, pTimeSpent): """Set PlayTime spent for day (including bonues)""" # result self._timekprUserControl["PLAYTIME_SPENT_DAY"] = pTimeSpent class timekprClientConfig(object): """Class will hold and provide config management for user""" def __init__(self): """Initialize config""" # config self._timekprClientConfig = {} # get home self._userHome = os.path.expanduser("~") # set up log file name self._timekprClientConfig["TIMEKPR_LOGFILE_DIR"] = cons.TK_LOG_TEMP_DIR log.log(cons.TK_LOG_LEVEL_INFO, "start initializing client configuration manager") # in dev self._configDirPrefix = os.getcwd() if cons.TK_DEV_ACTIVE else "" # main config self._timekprClientConfig["TIMEKPR_MAIN_CONFIG_DIR"] = os.path.join(self._configDirPrefix, (cons.TK_MAIN_CONFIG_DIR_DEV if cons.TK_DEV_ACTIVE else cons.TK_MAIN_CONFIG_DIR)) self._configMainFile = os.path.join(self._timekprClientConfig["TIMEKPR_MAIN_CONFIG_DIR"], cons.TK_MAIN_CONFIG_FILE) # config self._configFile = os.path.join(self._userHome, ".config/timekpr", cons.TK_MAIN_CONFIG_FILE) # config parser self._timekprClientConfigParser = configparser.ConfigParser(allow_no_value=True) self._timekprClientConfigParser.optionxform = str log.log(cons.TK_LOG_LEVEL_INFO, "finish initializing client configuration manager") def __del__(self): """De-initialize config""" log.log(cons.TK_LOG_LEVEL_INFO, "de-initialize client configuration manager") def loadClientConfiguration(self): """Read main timekpr config file""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start loading client configuration") # get directories from main config if "TIMEKPR_SHARED_DIR" not in self._timekprClientConfig: # load main config to get directories self.loadMinimalClientMainConfig() # clear out cp, we don't need to store all condfigs in minimal case self._timekprClientConfigParser.clear() # try to load config file result = _loadAndPrepareConfigFile(self._timekprClientConfigParser, self._configFile) # value read result resultValue = True # read config failed, we need to initialize if not result: # logging log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: could not parse the configuration file (%s) properly, will use default values" % (self._configFile)) # write correct config file self.initClientConfig() # re-read the file self._timekprClientConfigParser.read(self._configFile) # config load time self._clientConfigModTime = self.getClientLastModified() # directory section section = "CONFIG" # read param = "LOG_LEVEL" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.getint, section, param, pDefaultValue=cons.TK_LOG_LEVEL_INFO, pCheckValue=None, pOverallSuccess=resultValue) # read param = "SHOW_LIMIT_NOTIFICATION" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.getboolean, section, param, pDefaultValue=True, pCheckValue=None, pOverallSuccess=resultValue) # read param = "SHOW_ALL_NOTIFICATIONS" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.getboolean, section, param, pDefaultValue=True, pCheckValue=None, pOverallSuccess=resultValue) # read param = "USE_SPEECH_NOTIFICATIONS" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.getboolean, section, param, pDefaultValue=False, pCheckValue=None, pOverallSuccess=resultValue) # read param = "SHOW_SECONDS" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.getboolean, section, param, pDefaultValue=False, pCheckValue=None, pOverallSuccess=resultValue) # read param = "NOTIFICATION_TIMEOUT" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.getint, section, param, pDefaultValue=cons.TK_CL_NOTIF_TMO, pCheckValue=None, pOverallSuccess=resultValue) # read param = "NOTIFICATION_TIMEOUT_CRITICAL" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.getint, section, param, pDefaultValue=cons.TK_CL_NOTIF_CRIT_TMO, pCheckValue=None, pOverallSuccess=resultValue) # read param = "USE_NOTIFICATION_SOUNDS" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.getboolean, section, param, pDefaultValue=False, pCheckValue=None, pOverallSuccess=resultValue) # read param = "NOTIFICATION_LEVELS" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.get, section, param, pDefaultValue=cons.TK_NOTIFICATION_LEVELS, pCheckValue=None, pOverallSuccess=resultValue) self._timekprClientConfig[param] = _cleanupValue(self._timekprClientConfig[param]) # read param = "PLAYTIME_NOTIFICATION_LEVELS" resultValue, self._timekprClientConfig[param] = _readAndNormalizeValue(self._timekprClientConfigParser.get, section, param, pDefaultValue=cons.TK_PT_NOTIFICATION_LEVELS, pCheckValue=None, pOverallSuccess=resultValue) self._timekprClientConfig[param] = _cleanupValue(self._timekprClientConfig[param]) # if we could not read some values, save what we could + defaults if not resultValue: # logging log.log(cons.TK_LOG_LEVEL_INFO, "WARNING: some values in client confguration file (%s) could not be read or new configuration option was introduced, valid values and defaults are used / saved instead" % (self._configFile)) # save what we could self.initClientConfig(True) # check whether sound is supported self._timekprClientConfig["USE_NOTIFICATION_SOUNDS_SUPPORTED"] = (os.path.isfile(cons.TK_CL_NOTIF_SND_FILE_WARN) and os.path.isfile(cons.TK_CL_NOTIF_SND_FILE_CRITICAL)) # check whether speech is supported try: # try importing speech from espeak import espeak # supported self._timekprClientConfig["USE_SPEECH_NOTIFICATIONS_SUPPORTED"] = True except: # NOT supported self._timekprClientConfig["USE_SPEECH_NOTIFICATIONS_SUPPORTED"] = False # clear parser self._timekprClientConfigParser.clear() log.log(cons.TK_LOG_LEVEL_DEBUG, "finish loading client configuration") # result return True def loadMinimalClientMainConfig(self): """Load main configuration file to get shared file locations""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start loading minimal main configuration") # defaults # directory section section = "DIRECTORIES" # read param = "TIMEKPR_SHARED_DIR" # try to load config file result = _loadAndPrepareConfigFile(self._timekprClientConfigParser, self._configMainFile, True) # if file cannot be read if not result: # default value value = cons.TK_SHARED_DIR else: # read file result, value = _readAndNormalizeValue(self._timekprClientConfigParser.get, section, param, pDefaultValue=cons.TK_SHARED_DIR, pCheckValue=None, pOverallSuccess=True) # problems loading default config if not result: # logging log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: could not parse the configuration file (%s) properly, will use default values" % (self._configMainFile)) # finalize directory self._timekprClientConfig[param] = os.path.join(self._configDirPrefix, (cons.TK_SHARED_DIR_DEV if cons.TK_DEV_ACTIVE else value)) log.log(cons.TK_LOG_LEVEL_DEBUG, "finish loading minimal main configuration") # result return True def initClientConfig(self, pReuseValues=False): """Write new config""" log.log(cons.TK_LOG_LEVEL_INFO, "start init client configuration") # directory name dirName = os.path.dirname(self._configFile) # check file if not os.path.isdir(dirName): # make it os.makedirs(dirName) # clear parser self._timekprClientConfigParser.clear() # add new user section section = "CONFIG" self._timekprClientConfigParser.add_section(section) self._timekprClientConfigParser.set(section, "# client application configuration file") self._timekprClientConfigParser.set(section, "# NOTE: this file is not intended to be edited manually, however, if it is, please restart application") self._timekprClientConfigParser.set(section, "") # set up param param = "LOG_LEVEL" self._timekprClientConfigParser.set(section, "# user logging level (1 - normal, 2 - debug, 3 - extra debug)") self._timekprClientConfigParser.set(section, "%s" % (param), str(self._timekprClientConfig[param]) if pReuseValues else str(cons.TK_LOG_LEVEL_INFO)) # set up param param = "SHOW_LIMIT_NOTIFICATION" self._timekprClientConfigParser.set(section, "# whether to show limit change notification") self._timekprClientConfigParser.set(section, "%s" % (param), str(self._timekprClientConfig[param]) if pReuseValues else "True") # set up param param = "SHOW_ALL_NOTIFICATIONS" self._timekprClientConfigParser.set(section, "# whether to show all notifications or important ones only") self._timekprClientConfigParser.set(section, "%s" % (param), str(self._timekprClientConfig[param]) if pReuseValues else "True") # set up param param = "SHOW_SECONDS" self._timekprClientConfigParser.set(section, "# whether to show seconds in label (if DE supports it)") self._timekprClientConfigParser.set(section, "%s" % (param), str(self._timekprClientConfig[param]) if pReuseValues else "True") # set up param param = "USE_SPEECH_NOTIFICATIONS" self._timekprClientConfigParser.set(section, "# whether to use speech notifications") self._timekprClientConfigParser.set(section, "%s" % (param), str(self._timekprClientConfig[param]) if pReuseValues else str(cons.TK_TRACK_INACTIVE)) # set up param param = "NOTIFICATION_TIMEOUT" self._timekprClientConfigParser.set(section, "# how long regular notifications should be displayed (in seconds)") self._timekprClientConfigParser.set(section, "%s" % (param), str(self._timekprClientConfig[param]) if pReuseValues else str(cons.TK_CL_NOTIF_TMO)) # set up param param = "NOTIFICATION_TIMEOUT_CRITICAL" self._timekprClientConfigParser.set(section, "# how long critical notifications should be displayed (in seconds)") self._timekprClientConfigParser.set(section, "%s" % (param), str(self._timekprClientConfig[param]) if pReuseValues else str(cons.TK_CL_NOTIF_CRIT_TMO)) # set up param param = "USE_NOTIFICATION_SOUNDS" self._timekprClientConfigParser.set(section, "# use notification sounds for notifications") self._timekprClientConfigParser.set(section, "%s" % (param), str(self._timekprClientConfig[param]) if pReuseValues else str(cons.TK_TRACK_INACTIVE)) # set up param param = "NOTIFICATION_LEVELS" self._timekprClientConfigParser.set(section, "# user configured notification levels in form of level[priority];...") self._timekprClientConfigParser.set(section, "%s" % (param), self._timekprClientConfig[param] if pReuseValues else cons.TK_NOTIFICATION_LEVELS) # set up param param = "PLAYTIME_NOTIFICATION_LEVELS" self._timekprClientConfigParser.set(section, "# user configured PlayTime notification levels in form of level[priority];...") self._timekprClientConfigParser.set(section, "%s" % (param), self._timekprClientConfig[param] if pReuseValues else cons.TK_PT_NOTIFICATION_LEVELS) # save the file with open(self._configFile, "w") as fp: self._timekprClientConfigParser.write(fp) # clear parser self._timekprClientConfigParser.clear() log.log(cons.TK_LOG_LEVEL_INFO, "finish init client configuration") def saveClientConfig(self): """Save configuration (called from GUI)""" log.log(cons.TK_LOG_LEVEL_INFO, "start save client config") # init dict values = {} # log level param = "LOG_LEVEL" values[param] = str(self._timekprClientConfig[param]) # first limit notification param = "SHOW_LIMIT_NOTIFICATION" values[param] = str(self._timekprClientConfig[param]) # all notifications param = "SHOW_ALL_NOTIFICATIONS" values[param] = str(self._timekprClientConfig[param]) # speech notifications param = "USE_SPEECH_NOTIFICATIONS" values[param] = str(self._timekprClientConfig[param]) # show seconds param = "SHOW_SECONDS" values[param] = str(self._timekprClientConfig[param]) # timeout for notifications param = "NOTIFICATION_TIMEOUT" values[param] = str(self._timekprClientConfig[param]) # timeout for critical notifications param = "NOTIFICATION_TIMEOUT_CRITICAL" values[param] = str(self._timekprClientConfig[param]) # notification sounds param = "USE_NOTIFICATION_SOUNDS" values[param] = str(self._timekprClientConfig[param]) # notification levels param = "NOTIFICATION_LEVELS" values[param] = self._timekprClientConfig[param] # PlayTime notification levels param = "PLAYTIME_NOTIFICATION_LEVELS" values[param] = self._timekprClientConfig[param] # edit control file (using alternate method because configparser looses comments in the process) _saveConfigFile(self._configFile, values) log.log(cons.TK_LOG_LEVEL_INFO, "finish save client config") def isClientConfigChanged(self): """Whether config has changed""" # defaults result = False clientLastModified = self.getClientLastModified() # yes, is it changed? if self._clientConfigModTime != clientLastModified: log.log(cons.TK_LOG_LEVEL_INFO, "client config changed, prev/now: %s / %s" % (self._clientConfigModTime.strftime(cons.TK_LOG_DATETIME_FORMAT), clientLastModified.strftime(cons.TK_LOG_DATETIME_FORMAT))) # changed self._clientConfigModTime = clientLastModified # load config self.loadClientConfiguration() # changed result = True # result return result def _parseNotificationLevels(self, pKey): """Parse notification levels, if can not be parsed, return None""" # def result = [] # work on levels for rLvl in self._timekprClientConfig[pKey].split(";"): # no need for non-empty values if rLvl != "": # try to find time left and level secs, prio = splitConfigValueNameParam(rLvl) # if identified correctly (e.g. we have secs and level too) if secs is not None and prio is not None: # this is just to verify that config is OK if prio in cons.TK_PRIO_LVL_MAP: # add to list result.append([int(secs), prio]) # result return result def _formatClientNotificationLevels(self, pNotificationLevels): """Get formatted notification levels""" # def result = "" # loop through settings for rPrio in pNotificationLevels: # levels should be sorted from higher limit to lower result = "%s%s%s" % (result, ("" if result == "" else ";"), "%s[%s]" % (str(rPrio[0]), str(rPrio[1]))) # result return result def getIsNotificationSoundSupported(self): """Whether notification sounds are supported""" # result return self._timekprClientConfig["USE_NOTIFICATION_SOUNDS_SUPPORTED"] def getIsNotificationSpeechSupported(self): """Whether speech notifications are supported""" # result return self._timekprClientConfig["USE_SPEECH_NOTIFICATIONS_SUPPORTED"] def getClientShowLimitNotifications(self): """Get whether to show frst notification""" # result return self._timekprClientConfig["SHOW_LIMIT_NOTIFICATION"] def getClientShowAllNotifications(self): """Get whether to show all notifications""" # result return self._timekprClientConfig["SHOW_ALL_NOTIFICATIONS"] def getClientUseSpeechNotifications(self): """Get whether to use speech""" # result return self._timekprClientConfig["USE_SPEECH_NOTIFICATIONS"] def getClientShowSeconds(self): """Get whether to show seconds""" # result return self._timekprClientConfig["SHOW_SECONDS"] def getClientNotificationTimeout(self): """Get timeout for regular notifications""" # result return self._timekprClientConfig["NOTIFICATION_TIMEOUT"] def getClientNotificationTimeoutCritical(self): """Get timeout for critical notifications""" # result return self._timekprClientConfig["NOTIFICATION_TIMEOUT_CRITICAL"] def getClientUseNotificationSound(self): """Get whether to show use sound notifications""" # result return self._timekprClientConfig["USE_NOTIFICATION_SOUNDS"] def getClientNotificationLevels(self): """Get notification levels""" # result return self._parseNotificationLevels("NOTIFICATION_LEVELS") def getClientPlayTimeNotificationLevels(self): """Get PlayTime notification levels""" # result return self._parseNotificationLevels("PLAYTIME_NOTIFICATION_LEVELS") def getClientLogLevel(self): """Get client log level""" # result return self._timekprClientConfig["LOG_LEVEL"] def getTimekprSharedDir(self): """Get shared dir""" # result return self._timekprClientConfig["TIMEKPR_SHARED_DIR"] def getClientLogfileDir(self): """Get shared dir""" # result return self._timekprClientConfig["TIMEKPR_LOGFILE_DIR"] def getClientLastModified(self): """Get last file modification time for user""" # result return datetime.fromtimestamp(os.path.getmtime(self._configFile)) def setClientLogLevel(self, pClientLogLevel): """Set client log level""" # set self._timekprClientConfig["LOG_LEVEL"] = pClientLogLevel def setIsNotificationSoundSupported(self, pIsSupported): """Whether notification sounds are supported""" # result self._timekprClientConfig["USE_NOTIFICATION_SOUNDS_SUPPORTED"] = pIsSupported def setClientShowLimitNotifications(self, pClientShowLimitNotification): """Set whether to show frst notification""" # set self._timekprClientConfig["SHOW_LIMIT_NOTIFICATION"] = pClientShowLimitNotification def setClientShowAllNotifications(self, pClientShowAllNotifications): """Set whether to show all notifications""" # set self._timekprClientConfig["SHOW_ALL_NOTIFICATIONS"] = pClientShowAllNotifications def setClientUseSpeechNotifications(self, pClientUseSpeechNotifications): """Set whether to use speech""" # set self._timekprClientConfig["USE_SPEECH_NOTIFICATIONS"] = pClientUseSpeechNotifications def setClientShowSeconds(self, pClientShowSeconds): """Set whether to show seconds""" # set self._timekprClientConfig["SHOW_SECONDS"] = pClientShowSeconds def setClientNotificationTimeout(self, pClientNotificationTimeout): """Set timeout for regular notifications""" # set self._timekprClientConfig["NOTIFICATION_TIMEOUT"] = pClientNotificationTimeout def setClientNotificationTimeoutCritical(self, pClientNotificationTimeoutCritical): """Set timeout for critical notifications""" # set self._timekprClientConfig["NOTIFICATION_TIMEOUT_CRITICAL"] = pClientNotificationTimeoutCritical def setClientUseNotificationSound(self, pClientUseNotificationSound): """Set whether to use sound notifications""" # set self._timekprClientConfig["USE_NOTIFICATION_SOUNDS"] = pClientUseNotificationSound def setClientNotificationLevels(self, pNotificationLevels): """Set whether to use sound notifications""" # set self._timekprClientConfig["NOTIFICATION_LEVELS"] = self._formatClientNotificationLevels(pNotificationLevels) def setClientPlayTimeNotificationLevels(self, pPlayTimeNotificationLevels): """Set whether to use sound notifications""" # set self._timekprClientConfig["PLAYTIME_NOTIFICATION_LEVELS"] = self._formatClientNotificationLevels(pPlayTimeNotificationLevels) timekpr-next/common/utils/__init__.py000664 001750 001750 00000000000 13476006650 021733 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/000775 001750 001750 00000000000 14064575714 016470 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/timekprc.py000664 001750 001750 00000001570 14064575714 020663 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # imports import os import getpass import sys import signal # set up our python path if "/usr/lib/python3/dist-packages" not in sys.path: sys.path.append("/usr/lib/python3/dist-packages") # timekpr imports from timekpr.client.interface.dbus.daemon import timekprClient from timekpr.common.utils import misc # main start if __name__ == "__main__": # simple self-running check if misc.checkAndSetRunning(os.path.splitext(os.path.basename(__file__))[0], getpass.getuser()): # get out sys.exit(0) # get our client _timekprClient = timekprClient() # this is needed for appindicator to react to ctrl+c signal.signal(signal.SIGINT, _timekprClient.finishTimekpr) signal.signal(signal.SIGTERM, _timekprClient.finishTimekpr) # start up timekpr client _timekprClient.startTimekprClient() timekpr-next/client/admin/000775 001750 001750 00000000000 14064575714 017560 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/admin/adminprocessor.py000664 001750 001750 00000072157 14064575714 023176 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # imports import os import getpass from os import geteuid # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.client.interface.dbus.administration import timekprAdminConnector from timekpr.common.utils.config import timekprConfig from timekpr.common.constants import messages as msg from timekpr.common.utils.misc import findHourStartEndMinutes as findHourStartEndMinutes from timekpr.common.utils.misc import splitConfigValueNameParam as splitConfigValueNameParam class timekprAdminClient(object): """Main class for holding all client logic (including dbus)""" # --------------- initialization / control methods --------------- # def __init__(self): """Initialize admin client""" # get our connector self._timekprAdminConnector = timekprAdminConnector() # main object for GUI self._adminGUI = None def startTimekprAdminClient(self, *args): """Start up timekpr admin (choose gui or cli and start this up)""" # check whether we need CLI or GUI lastParam = args[len(args)-1] timekprForceCLI = False # configuration init _timekprConfig = timekprConfig() # load config _timekprConfig.loadMainConfiguration() # init logging log.setLogging(_timekprConfig.getTimekprLogLevel(), cons.TK_LOG_TEMP_DIR, (cons.TK_LOG_OWNER_ADMIN_SU if geteuid() == 0 else cons.TK_LOG_OWNER_ADMIN), getpass.getuser()) # check for script if ("/timekpra" in lastParam or "timekpra.py" in lastParam): # whether we have X running or wayland? timekprX11Available = os.getenv("DISPLAY") is not None timekprWaylandAvailable = os.getenv("WAYLAND_DISPLAY") is not None timekprMirAvailable = os.getenv("MIR_SOCKET") is not None # if we are required to run graphical thing if (timekprX11Available or timekprWaylandAvailable or timekprMirAvailable): # resource dir _resourcePathGUI = os.path.join(_timekprConfig.getTimekprSharedDir(), "client/forms") # use GUI from timekpr.client.gui.admingui import timekprAdminGUI # load GUI and process from there self._adminGUI = timekprAdminGUI(cons.TK_VERSION, _resourcePathGUI, getpass.getuser()) # start GUI self._adminGUI.startAdminGUI() # nor X nor wayland are available else: # print to console log.consoleOut("%s\n" % (msg.getTranslation("TK_MSG_CONSOLE_GUI_NOT_AVAILABLE"))) # forced CLI" timekprForceCLI = True else: # CLI timekprForceCLI = True # for CLI connections if timekprForceCLI: # connect self._timekprAdminConnector.initTimekprConnection(True) # connected? if self._timekprAdminConnector.isConnected()[1]: # use CLI # validate possible parameters and their values, when fine - execute them as well self.checkAndExecuteAdminCommands(*args) log.flushLogFile() # --------------- initialization / helper methods --------------- # def finishTimekpr(self, signal=None, frame=None): """Exit timekpr admin GUI gracefully""" if self._adminGUI is not None: # finish main thread on GUI` self._adminGUI.finishTimekpr(signal, frame) # --------------- parameter validation methods --------------- # def checkAndExecuteAdminCommands(self, *args): """Init connection to timekpr dbus server""" # initial param len paramIdx = 0 paramLen = len(args) adminCmdIncorrect = False tmpIdx = 0 # determine parameter offset for rArg in args: # count offset tmpIdx += 1 # check for script if "/timekpra" in rArg or "timekpra.py" in rArg: paramIdx = tmpIdx # this gets the command itself (args[0] is the script name) adminCmd = args[paramIdx] if paramLen > paramIdx else "timekpra" # now based on params check them out # this gets saved user list from the server if adminCmd == "--help": # fine pass # this gets saved user list from the server elif adminCmd == "--userlist": # check param len if paramLen != paramIdx + 1: # fail adminCmdIncorrect = True else: # get list result, message, userList = self._timekprAdminConnector.getUserList() # process if result == 0: # process self.printUserList(userList) else: # log error log.consoleOut(message) # this gets user configuration from the server elif adminCmd == "--userinfo": # check param len if paramLen != paramIdx + 2: # fail adminCmdIncorrect = True else: # get user config result, message, userConfig = self._timekprAdminConnector.getUserConfigurationAndInformation(args[paramIdx+1], cons.TK_CL_INF_FULL) # process if result == 0: # process self.printUserConfig(args[paramIdx+1], userConfig) else: # log error log.consoleOut(message) # this sets allowed days for the user elif adminCmd == "--setalloweddays": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetAllowedDays(args[paramIdx+1], args[paramIdx+2]) # this sets allowed hours per specified day or ALL for every day elif adminCmd == "--setallowedhours": # check param len if paramLen != paramIdx + 4: # fail adminCmdIncorrect = True else: # set days self.processSetAllowedHours(args[paramIdx+1], args[paramIdx+2], args[paramIdx+3]) # this sets time limits per allowed days elif adminCmd == "--settimelimits": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetTimeLimits(args[paramIdx+1], args[paramIdx+2]) # this sets time limits per week elif adminCmd == "--settimelimitweek": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetTimeLimitWeek(args[paramIdx+1], args[paramIdx+2]) # this sets time limits per month elif adminCmd == "--settimelimitmonth": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetTimeLimitMonth(args[paramIdx+1], args[paramIdx+2]) # this sets whether to track inactive user sessions elif adminCmd == "--settrackinactive": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetTrackInactive(args[paramIdx+1], args[paramIdx+2]) # this sets whether to show tray icon elif adminCmd == "--sethidetrayicon": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetHideTrayIcon(args[paramIdx+1], args[paramIdx+2]) # this sets lockout type for the user elif adminCmd == "--setlockouttype": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetLockoutType(args[paramIdx+1], args[paramIdx+2]) # this sets whether PlayTime is enabled for user elif adminCmd == "--setplaytimeenabled": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetPlayTimeEnabled(args[paramIdx+1], args[paramIdx+2]) # this sets playtime override for user elif adminCmd == "--setplaytimelimitoverride": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetPlayTimeLimitOverride(args[paramIdx+1], args[paramIdx+2]) # this sets playtime allowed during unaccounted intervals for user elif adminCmd == "--setplaytimeunaccountedintervalsflag": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetPlayTimeUnaccountedIntervalsEnabled(args[paramIdx+1], args[paramIdx+2]) # this sets allowed days for PlayTime for the user elif adminCmd == "--setplaytimealloweddays": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetPlayTimeAllowedDays(args[paramIdx+1], args[paramIdx+2]) # this sets PlayTime limits for allowed days for the user elif adminCmd == "--setplaytimelimits": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetPlayTimeLimits(args[paramIdx+1], args[paramIdx+2]) # this sets PlayTime activities for the user elif adminCmd == "--setplaytimeactivities": # check param len if paramLen != paramIdx + 3: # fail adminCmdIncorrect = True else: # set days self.processSetPlayTimeActivities(args[paramIdx+1], args[paramIdx+2]) # this sets time left for the user at current moment elif adminCmd == "--settimeleft": # check param len if paramLen != paramIdx + 4: # fail adminCmdIncorrect = True else: # set days self.processSetTimeLeft(args[paramIdx+1], args[paramIdx+2], args[paramIdx+3]) # this sets time left for the user at current moment elif adminCmd == "--setplaytimeleft": # check param len if paramLen != paramIdx + 4: # fail adminCmdIncorrect = True else: # set days self.processSetPlayTimeLeft(args[paramIdx+1], args[paramIdx+2], args[paramIdx+3]) else: # out adminCmdIncorrect = True # check whether command is supported if (adminCmd not in cons.TK_USER_ADMIN_COMMANDS and adminCmd not in cons.TK_ADMIN_COMMANDS) or adminCmd == "--help" or adminCmdIncorrect: # fail if adminCmdIncorrect: log.consoleOut(msg.getTranslation("TK_MSG_CONSOLE_COMMAND_INCORRECT"), *args, "\n") # log notice log.consoleOut("%s\n*) %s\n*) %s\n*) %s\n" % ( msg.getTranslation("TK_MSG_CONSOLE_USAGE_NOTICE_HEAD"), msg.getTranslation("TK_MSG_CONSOLE_USAGE_NOTICE_TIME"), msg.getTranslation("TK_MSG_CONSOLE_USAGE_NOTICE_HOURS"), msg.getTranslation("TK_MSG_CONSOLE_USAGE_NOTICE_DAYS")) ) # log usage notes text log.consoleOut("%s\n" % (msg.getTranslation("TK_MSG_CONSOLE_USAGE_NOTES"))) # initial order cmds = ["--help", "--userlist", "--userinfo"] # print initial commands as first for rCmd in cmds: log.consoleOut(" ", rCmd, cons.TK_USER_ADMIN_COMMANDS[rCmd], "\n") # print help for rCmd, rCmdDesc in cons.TK_USER_ADMIN_COMMANDS.items(): # do not print already known commands if rCmd not in cmds: log.consoleOut(" ", rCmd, rCmdDesc, "\n") # --------------- parameter execution methods --------------- # def printUserList(self, pUserList): """Format and print userlist""" # print to console log.consoleOut(msg.getTranslation("TK_MSG_CONSOLE_USERS_TOTAL", len(pUserList))) # loop and print for rUser in pUserList: log.consoleOut(rUser[0]) def printUserConfig(self, pUserName, pPrintUserConfig): """Format and print user config""" # print to console log.consoleOut("# %s" % (msg.getTranslation("TK_MSG_CONSOLE_CONFIG_FOR") % (pUserName))) # loop and print the same format as ppl will use to set that for rUserKey, rUserConfig in pPrintUserConfig.items(): # join the lists if rUserKey in ("ALLOWED_WEEKDAYS", "LIMITS_PER_WEEKDAYS", "PLAYTIME_ALLOWED_WEEKDAYS", "PLAYTIME_LIMITS_PER_WEEKDAYS"): # print join log.consoleOut("%s: %s" % (rUserKey, ";".join(list(map(str, rUserConfig))))) # join the lists elif "ALLOWED_HOURS_" in rUserKey: # hrs hrs = "" # print join if len(rUserConfig) > 0: # process hours for rUserHour in sorted(list(map(int, rUserConfig))): # unaccounted hour uacc = "!" if rUserConfig[str(rUserHour)][cons.TK_CTRL_UACC] else "" # get config per hr hr = "%s" % (rUserHour) if rUserConfig[str(rUserHour)][cons.TK_CTRL_SMIN] <= 0 and rUserConfig[str(rUserHour)][cons.TK_CTRL_EMIN] >= 60 else "%s[%s-%s]" % (rUserHour, rUserConfig[str(rUserHour)][cons.TK_CTRL_SMIN], rUserConfig[str(rUserHour)][cons.TK_CTRL_EMIN]) # empty hrs = "%s%s" % (uacc, hr) if hrs == "" else "%s;%s%s" % (hrs, uacc, hr) log.consoleOut("%s: %s" % (rUserKey, hrs)) elif rUserKey in ("TRACK_INACTIVE", "HIDE_TRAY_ICON", "PLAYTIME_ENABLED", "PLAYTIME_LIMIT_OVERRIDE_ENABLED", "PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED"): log.consoleOut("%s: %s" % (rUserKey, bool(rUserConfig))) elif rUserKey in ("PLAYTIME_ACTIVITIES"): # result result = "" # loop thorhough activities for rActArr in rUserConfig: # activity act = "%s[%s]" % (rActArr[0], rActArr[1]) if rActArr[1] != "" else "%s" % (rActArr[0]) # gather activities result = "%s" % (act) if result == "" else "%s;%s" % (result, act) log.consoleOut("%s: %s" % (rUserKey, result)) else: log.consoleOut("%s: %s" % (rUserKey, str(rUserConfig))) def processSetAllowedDays(self, pUserName, pDayList): """Process allowed days""" # defaults dayMap = [] result = 0 # day map try: # try to parse parameters dayMap = pDayList.split(";") except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setAllowedDays(pUserName, dayMap) # process if result != 0: # log error log.consoleOut(message) def processSetAllowedHours(self, pUserName, pDayNumber, pHourList): """Process allowed hours""" # this is the dict for hour config allowedHours = {} result = 0 # allowed hours try: # check hours for rHour in str(pHourList).split(";"): # get hours and minutes hour, sMin, eMin, uacc = findHourStartEndMinutes(rHour) # raise any error in case we can not get parsing right if hour is None: # raise raise ValueError("this does not compute") # set hours allowedHours[str(hour)] = {cons.TK_CTRL_SMIN: sMin, cons.TK_CTRL_EMIN: eMin, cons.TK_CTRL_UACC: uacc} except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setAllowedHours(pUserName, pDayNumber, allowedHours) # process if result != 0: # log error log.consoleOut(message) def processSetTimeLimits(self, pUserName, pDayLimits): """Process time limits for days""" # defaults dayLimits = [] result = 0 # day limists try: # allow empty limits too if str(pDayLimits) != "": # try to parse parameters dayLimits = list(map(int, pDayLimits.split(";"))) except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setTimeLimitForDays(pUserName, dayLimits) # process if result != 0: # log error log.consoleOut(message) def processSetTimeLimitWeek(self, pUserName, pTimeLimitWeek): """Process time limits for week""" # defaults weekLimit = 0 result = 0 # week limit try: # try to parse parameters weekLimit = int(pTimeLimitWeek) except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setTimeLimitForWeek(pUserName, weekLimit) # process if result != 0: # log error log.consoleOut(message) def processSetTimeLimitMonth(self, pUserName, pTimeLimitMonth): """Process time limits for month""" # defaults monthLimit = 0 result = 0 # week limit try: # try to parse parameters monthLimit = int(pTimeLimitMonth) except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setTimeLimitForMonth(pUserName, monthLimit) # process if result != 0: # log error log.consoleOut(message) def processSetTrackInactive(self, pUserName, pTrackInactive): """Process track inactive""" # defaults trackInactive = None result = 0 # check if pTrackInactive not in ("true", "True", "TRUE", "false", "False", "FALSE"): # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % ("please specify true or false") else: trackInactive = True if pTrackInactive in ("true", "True", "TRUE") else False # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setTrackInactive(pUserName, trackInactive) # process if result != 0: # log error log.consoleOut(message) def processSetHideTrayIcon(self, pUserName, pHideTrayIcon): """Process hide tray icon""" # defaults hideTrayIcon = None result = 0 # check if pHideTrayIcon not in ("true", "True", "TRUE", "false", "False", "FALSE"): # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % ("please specify true or false") else: hideTrayIcon = True if pHideTrayIcon in ("true", "True", "TRUE") else False # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setHideTrayIcon(pUserName, hideTrayIcon) # process if result != 0: # log error log.consoleOut(message) def processSetLockoutType(self, pUserName, pLockoutType): """Process lockout type""" # defaults result = 0 # parse lockout lockout = pLockoutType.split(";") lockoutType = lockout[0] lockoutWakeFrom = lockout[1] if len(lockout) == 3 else '0' lockoutWakeTo = lockout[2] if len(lockout) == 3 else '23' # check if lockoutType not in (cons.TK_CTRL_RES_L, cons.TK_CTRL_RES_S, cons.TK_CTRL_RES_W, cons.TK_CTRL_RES_T, cons.TK_CTRL_RES_D): # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % ("please specify one of these: %s, %s, %s, %s, %s" % (cons.TK_CTRL_RES_L, cons.TK_CTRL_RES_S, cons.TK_CTRL_RES_W, cons.TK_CTRL_RES_T, cons.TK_CTRL_RES_D)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setLockoutType(pUserName, lockoutType, lockoutWakeFrom, lockoutWakeTo) # process if result != 0: # log error log.consoleOut(message) def processSetTimeLeft(self, pUserName, pOperation, pLimit): """Process time left""" # defaults limit = 0 result = 0 # limit try: # try to parse parameters limit = int(pLimit) except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setTimeLeft(pUserName, pOperation, limit) # process if result != 0: # log error log.consoleOut(message) # --------------- parameter execution methods for PlayTime --------------- # def processSetPlayTimeEnabled(self, pUserName, pPlayTimeEnabled): """Process PlayTime enabled flag""" # defaults isPlayTimeEnabled = None result = 0 # check if pPlayTimeEnabled not in ("true", "True", "TRUE", "false", "False", "FALSE"): # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % ("please specify true or false") else: isPlayTimeEnabled = True if pPlayTimeEnabled in ("true", "True", "TRUE") else False # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setPlayTimeEnabled(pUserName, isPlayTimeEnabled) # process if result != 0: # log error log.consoleOut(message) def processSetPlayTimeLimitOverride(self, pUserName, pPlayTimeLimitOverride): """Process PlayTime override flag""" # defaults isPlayTimeLimitOverride = None result = 0 # check if pPlayTimeLimitOverride not in ("true", "True", "TRUE", "false", "False", "FALSE"): # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % ("please specify true or false") else: isPlayTimeLimitOverride = True if pPlayTimeLimitOverride in ("true", "True", "TRUE") else False # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setPlayTimeLimitOverride(pUserName, isPlayTimeLimitOverride) # process if result != 0: # log error log.consoleOut(message) def processSetPlayTimeUnaccountedIntervalsEnabled(self, pUserName, pPlayTimeUnaccountedIntervalsEnabled): """Process PlayTime allowed during unaccounted intervals flag""" # defaults isPlayTimeUnaccountedIntervalsEnabled = None result = 0 # check if pPlayTimeUnaccountedIntervalsEnabled not in ("true", "True", "TRUE", "false", "False", "FALSE"): # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % ("please specify true or false") else: isPlayTimeUnaccountedIntervalsEnabled = True if pPlayTimeUnaccountedIntervalsEnabled in ("true", "True", "TRUE") else False # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setPlayTimeUnaccountedIntervalsEnabled(pUserName, isPlayTimeUnaccountedIntervalsEnabled) # process if result != 0: # log error log.consoleOut(message) def processSetPlayTimeAllowedDays(self, pUserName, pPlayTimeDayList): """Process allowed days for PlayTime""" # defaults dayMap = [] result = 0 # day map try: # try to parse parameters dayMap = pPlayTimeDayList.split(";") except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setPlayTimeAllowedDays(pUserName, dayMap) # process if result != 0: # log error log.consoleOut(message) def processSetPlayTimeLimits(self, pUserName, pPlayTimeDayLimits): """Process time limits for allowed days for PlayTime""" # defaults dayLimits = [] result = 0 # day limists try: # allow empty limits too if pPlayTimeDayLimits != "": # try to parse parameters dayLimits = list(map(int, pPlayTimeDayLimits.split(";"))) except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setPlayTimeLimitsForDays(pUserName, dayLimits) # process if result != 0: # log error log.consoleOut(message) def processSetPlayTimeActivities(self, pUserName, pPlayTimeActivities): """Process PlayTime activities""" # defaults playTimeActivities = [] result = 0 # day limists try: # ## try to parse parameters ## if pPlayTimeActivities != "": # split activities for rAct in pPlayTimeActivities.split(";"): # try parsing the names mask, description = splitConfigValueNameParam(rAct) # raise any error in case we can not get parsing right if mask is None: # raise raise ValueError("this does not compute") # set up activity list playTimeActivities.append([mask, description]) except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setPlayTimeActivities(pUserName, playTimeActivities) # process if result != 0: # log error log.consoleOut(message) def processSetPlayTimeLeft(self, pUserName, pOperation, pLimit): """Process time left""" # defaults limit = 0 result = 0 # limit try: # try to parse parameters limit = int(pLimit) except Exception as ex: # fail result = -1 message = msg.getTranslation("TK_MSG_PARSE_ERROR") % (str(ex)) # preprocess successful if result == 0: # invoke result, message = self._timekprAdminConnector.setPlayTimeLeft(pUserName, pOperation, limit) # process if result != 0: # log error log.consoleOut(message) timekpr-next/client/timekpra.py000664 001750 001750 00000001676 14064575714 020670 0ustar00bezvfedubezvfedu000000 000000 """ Created on Jan 4, 2019 @author: mjasnik """ # imports import os import getpass import sys import signal # set up our python path if "/usr/lib/python3/dist-packages" not in sys.path: sys.path.append("/usr/lib/python3/dist-packages") # timekpr imports from timekpr.client.admin.adminprocessor import timekprAdminClient from timekpr.common.utils import misc # main start if __name__ == "__main__": # simple self-running check if misc.checkAndSetRunning(os.path.splitext(os.path.basename(__file__))[0], getpass.getuser()): # get out sys.exit(0) # get our admin client _timekprAdminClient = timekprAdminClient() # this is needed for admin application to react to ctrl+c gracefully signal.signal(signal.SIGINT, _timekprAdminClient.finishTimekpr) signal.signal(signal.SIGTERM, _timekprAdminClient.finishTimekpr) # start up timekpr admin client _timekprAdminClient.startTimekprAdminClient(*sys.argv) timekpr-next/client/interface/000775 001750 001750 00000000000 13476006650 020422 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/interface/speech/000775 001750 001750 00000000000 13772711236 021673 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/interface/speech/__init__.py000664 001750 001750 00000000000 13476006650 023770 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/interface/speech/espeak.py000664 001750 001750 00000002730 13772711236 023517 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ import locale import time # init speech try: from espeak import espeak as espeak _USE_SPEECH = True except (ImportError, ValueError): _USE_SPEECH = False pass class timekprSpeech(object): """Class will provide speech synth functionality""" def __init__(self): """Initialize config""" def initSpeech(self): """Initialize speech""" # set up speech synth espeak.set_voice(self.getDefaultLanguage()) espeak.set_parameter(espeak.Parameter.Pitch, 1) espeak.set_parameter(espeak.Parameter.Rate, 145) espeak.set_parameter(espeak.Parameter.Range, 600) def getDefaultLanguage(self): """Get default language""" # no lang lang = "" try: lang = locale.getlocale()[0].split("_")[0] except Exception: pass # result return lang def saySmth(self, pMsg): """Say something""" # if supported if self.isSupported(): # synth the speech espeak.synth(pMsg) def isSupported(self): """Return whether speech can be used""" global _USE_SPEECH # result return _USE_SPEECH # main start if __name__ == "__main__": # if supported if _USE_SPEECH: sp = timekprSpeech() sp.initSpeech() sp.saySmth("You have no time left") time.sleep(10) else: print("Nospeech") timekpr-next/client/interface/ui/000775 001750 001750 00000000000 14064575714 021045 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/interface/ui/appindicator.py000664 001750 001750 00000011221 14064575714 024071 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # import import gi import os gi.require_version("Gtk", "3.0") from gi.repository import Gtk # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.client.interface.ui.notificationarea import timekprNotificationArea from timekpr.common.constants import messages as msg # indicator stuff try: # try to load ayatanaappindicator (fully compatible with appindicator, I hope it stays that way) gi.require_version("AyatanaAppIndicator3", "0.1") from gi.repository import AyatanaAppIndicator3 as AppIndicator # if successful, mark it so _USE_INDICATOR = True except (ImportError, ValueError): try: # try to load appindicator gi.require_version("AppIndicator3", "0.1") from gi.repository import AppIndicator3 as AppIndicator # if successful, mark it so _USE_INDICATOR = True except (ImportError, ValueError): # no indictor _USE_INDICATOR = False pass class timekprIndicator(timekprNotificationArea): """Support appindicator""" def __init__(self, pUserName, pUserNameFull, pTimekprClientConfig): """Init all required stuff for indicator""" log.log(cons.TK_LOG_LEVEL_INFO, "start initTimekprIndicator") # only if this is supported if self.isSupported(): # init parent as well super().__init__(pUserName, pUserNameFull, pTimekprClientConfig) # this is our icon self._indicator = None log.log(cons.TK_LOG_LEVEL_INFO, "finish initTimekprIndicator") def isSupported(self): """Get whether appindicator is supported""" global _USE_INDICATOR # returns whether we can use appindicator return _USE_INDICATOR def initTimekprIcon(self): """Initialize timekpr indicator""" log.log(cons.TK_LOG_LEVEL_INFO, "start initTimekprIndicatorIcon") # init indicator itself (icon will be set later) self._indicator = AppIndicator.Indicator.new("indicator-timekpr", os.path.join(self._timekprClientConfig.getTimekprSharedDir(), "icons", cons.TK_PRIO_CONF["client-logo"][cons.TK_ICON_STAT]), AppIndicator.IndicatorCategory.APPLICATION_STATUS) self._indicator.set_status(AppIndicator.IndicatorStatus.ACTIVE) # define empty menu self._timekprMenu = Gtk.Menu() # add menu items self._timekprMenuItemTimeLeft = Gtk.MenuItem(msg.getTranslation("TK_MSG_MENU_TIME_LEFT")) self._timekprMenu.append(self._timekprMenuItemTimeLeft) self._timekprMenu.append(Gtk.SeparatorMenuItem()) self._timekprMenuItemProperties = Gtk.MenuItem(msg.getTranslation("TK_MSG_MENU_CONFIGURATION")) self._timekprMenu.append(self._timekprMenuItemProperties) self._timekprMenu.append(Gtk.SeparatorMenuItem()) self._timekprMenuItemAbout = Gtk.MenuItem(msg.getTranslation("TK_MSG_MENU_ABOUT")) self._timekprMenu.append(self._timekprMenuItemAbout) # enable all self._timekprMenu.show_all() # connect signal to code self._timekprMenuItemTimeLeft.connect("activate", super().invokeTimekprTimeLeft) self._timekprMenuItemProperties.connect("activate", super().invokeTimekprUserProperties) self._timekprMenuItemAbout.connect("activate", super().invokeTimekprAbout) # set menu to indicator self._indicator.set_menu(self._timekprMenu) # initial config self.setTimeLeft("", None, 0) log.log(cons.TK_LOG_LEVEL_INFO, "finish initTimekprIndicatorIcon") def setTimeLeft(self, pPriority, pTimeLeft, pTimeNotLimited, pPlayTimeLeft=None): """Set time left in the indicator""" # make strings to set timeLeftStr, icon = super().formatTimeLeft(pPriority, pTimeLeft, pTimeNotLimited, pPlayTimeLeft) # if we have smth to set if timeLeftStr is not None: # set time left (this works with indicator in unity and gnome) self._indicator.set_label(timeLeftStr, "") # set time left (this works with indicator in kde5) self._indicator.set_title(timeLeftStr) # if we have smth to set if icon is not None: # set up the icon self._indicator.set_icon(icon) def getTrayIconEnabled(self): """Get whether tray icon is enabled""" return self._indicator.get_status() == AppIndicator.IndicatorStatus.ACTIVE def setTrayIconEnabled(self, pEnabled): """Set whether tray icon is enabled""" self._indicator.set_status(AppIndicator.IndicatorStatus.ACTIVE if pEnabled else AppIndicator.IndicatorStatus.PASSIVE) timekpr-next/client/interface/ui/notificationarea.py000664 001750 001750 00000027456 14064575714 024754 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # import from datetime import timedelta import os # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.client.interface.dbus.notifications import timekprNotifications from timekpr.client.gui.clientgui import timekprGUI class timekprNotificationArea(object): """Support appindicator or other means of showing icon on the screen (this class is a parent for classes like indicator or staticon)""" def __init__(self, pUserName, pUserNameFull, pTimekprClientConfig): """Init all required stuff for indicator""" log.log(cons.TK_LOG_LEVEL_INFO, "start init timekpr indicator") # configuration self._timekprClientConfig = pTimekprClientConfig # set version self._timekprVersion = "-.-.-" # set username self._userName = pUserName # initialize priority self._lastUsedPriority = self._lastUsedServerPriority = "" # priority level self._lastUsedPriorityLvl = -1 # PlayTime priority level self._lastUsedPTPriorityLvl = -1 # initialize time left self._timeLeftTotal = None # initialize PlayTime left self._playTimeLeftTotal = None # initialize time limit self._timeNotLimited = 0 # init notificaction stuff self._timekprNotifications = timekprNotifications(self._userName, self._timekprClientConfig) # dbus self._timekprBus = None self._notifyObject = None self._notifyInterface = None # gui forms self._timekprGUI = timekprGUI(cons.TK_VERSION, self._timekprClientConfig, self._userName, pUserNameFull) log.log(cons.TK_LOG_LEVEL_INFO, "finish init timekpr indicator") def initClientConnections(self): """Proxy method for initialization""" # initalize DBUS connections to every additional module self._timekprNotifications.initClientConnections() def isTimekprConnected(self): """Proxy method for initialization status""" # check if main connection to timekpr is up return self._timekprNotifications.isTimekprConnected() def verifySessionAttributes(self, pWhat, pKey): """Proxy method for receive the signal and process the data""" self._timekprNotifications.verifySessionAttributes(pWhat, pKey) def requestTimeLimits(self): """Proxy method for request time limits from server""" self._timekprNotifications.requestTimeLimits() def requestTimeLeft(self): """Proxy method for request time left from server""" self._timekprNotifications.requestTimeLeft() def _determinePriority(self, pType, pPriority, pTimeLeft): """Determine priority based on client config""" # def finalPrio = pPriority finalLimitSecs = -1 # keep in mind that this applies to timeLeft only and critical notifications can STILL be pushed from server if pTimeLeft is not None: # calculate for rPrio in self._timekprClientConfig.getClientNotificationLevels() if pType == "Time" else self._timekprClientConfig.getClientPlayTimeNotificationLevels(): # determine which is the earliest priority level we need to use # it is determined as time left is less then this interval if rPrio[0] >= pTimeLeft and (finalLimitSecs > rPrio[0] or finalLimitSecs < 0): # determine if this is the gratest level that is lower than limit finalLimitSecs = rPrio[0] finalPrio = cons.TK_PRIO_LVL_MAP[rPrio[1]] # final priority return finalPrio, finalLimitSecs def formatTimeLeft(self, pPriority, pTimeLeft, pTimeNotLimited, pPlayTimeLeft=None): """Set time left in the indicator""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start formatTimeLeft") # prio prio = pPriority timekprIcon = None timeLeftStr = None isTimeChanged = self._timeLeftTotal != pTimeLeft isPlayTimeChanged = self._playTimeLeftTotal != pPlayTimeLeft # determine hours and minutes for PlayTime (if there is such time) if (isTimeChanged or isPlayTimeChanged) and pPlayTimeLeft is not None and pTimeLeft is not None: # get the smallest one timeLeftPT = min(pPlayTimeLeft, pTimeLeft) # determine hours and minutes timeLeftStrPT = str((timeLeftPT - cons.TK_DATETIME_START).days * 24 + timeLeftPT.hour).rjust(2, "0") timeLeftStrPT += ":" + str(timeLeftPT.minute).rjust(2, "0") timeLeftStrPT += ((":" + str(timeLeftPT.second).rjust(2, "0")) if self._timekprClientConfig.getClientShowSeconds() else "") # execute time and icon changes + notifications only when there are changes if isTimeChanged or isPlayTimeChanged or pTimeLeft is None or self._lastUsedServerPriority != pPriority: # if there is no time left set yet, show -- if pTimeLeft is None: # determine hours and minutes timeLeftStr = "--:--" + (":--" if self._timekprClientConfig.getClientShowSeconds() else "") else: # update time self._timeLeftTotal = pTimeLeft self._playTimeLeftTotal = pPlayTimeLeft self._timeNotLimited = pTimeNotLimited # unlimited has special icon and text (if it's not anymore, these will change) if self._timeNotLimited > 0: # unlimited! timeLeftStr = "∞" prio = "unlimited" else: # determine hours and minutes timeLeftStr = str((self._timeLeftTotal - cons.TK_DATETIME_START).days * 24 + self._timeLeftTotal.hour).rjust(2, "0") timeLeftStr += ":" + str(self._timeLeftTotal.minute).rjust(2, "0") timeLeftStr += ((":" + str(self._timeLeftTotal.second).rjust(2, "0")) if self._timekprClientConfig.getClientShowSeconds() else "") # notifications and icons only when time has changed if isTimeChanged: # get user configured level and priority prio, finLvl = (pPriority, -1) if pPriority == cons.TK_PRIO_UACC else self._determinePriority("Time", pPriority, (pTimeLeft - cons.TK_DATETIME_START).total_seconds()) # if level actually changed if self._lastUsedPriorityLvl != finLvl: # do not notify if this is the first invocation, because initial limits are already asked from server # do not notify user in case icon is hidden and no notifications should be shown if self._lastUsedPriorityLvl > 0 and self.getTrayIconEnabled(): # emit notification self.notifyUser(cons.TK_MSG_CODE_TIMELEFT, None, prio, pTimeLeft, None) # level this up self._lastUsedPriorityLvl = finLvl # determine hours and minutes for PlayTime (if there is such time) if pPlayTimeLeft is not None: # format final time string timeLeftStr = "%s / %s" % (timeLeftStr, timeLeftStrPT) # now, if priority changes, set up icon as well if isTimeChanged and self._lastUsedPriority != prio: # log log.log(cons.TK_LOG_LEVEL_DEBUG, "changing icon for level, old: %s, new: %s" % (self._lastUsedPriority, prio)) # set up last used prio self._lastUsedPriority = prio # get status icon timekprIcon = os.path.join(self._timekprClientConfig.getTimekprSharedDir(), "icons", cons.TK_PRIO_CONF[cons.getNotificationPrioriy(self._lastUsedPriority)][cons.TK_ICON_STAT]) # adjust server priority: server sends all time left messages with low priority, except when there is no time left, then priority is critical self._lastUsedServerPriority = pPriority log.log(cons.TK_LOG_LEVEL_DEBUG, "finish formatTimeLeft") # return time left and icon (if changed), so implementations can use it return timeLeftStr, timekprIcon def processPlayTimeNotifications(self, pTimeLimits): """Process PlayTime notifications (if there is PT info in limits)""" isPTInfoEnabled = self._timekprGUI.isPlayTimeAccountingInfoEnabled() # determine whether we actually need to process PlayTime if cons.TK_CTRL_PTLSTC in pTimeLimits and cons.TK_CTRL_PTLPD in pTimeLimits and cons.TK_CTRL_PTTLO in pTimeLimits: # only of not enabled if not isPTInfoEnabled: self._timekprGUI.setPlayTimeAccountingInfoEnabled(True) # get user configured level and priority prio, finLvl = self._determinePriority("PlayTime", cons.TK_PRIO_LOW, pTimeLimits[cons.TK_CTRL_PTLPD]) # if any priority is effective, determine whether we need to inform user if finLvl > 0 and self._lastUsedPTPriorityLvl != finLvl: # adjust level too self._lastUsedPTPriorityLvl = finLvl # if icon is hidden, do not show any notifications if self.getTrayIconEnabled(): # notify user self._timekprNotifications.notifyUser(cons.TK_MSG_CODE_TIMELEFT, "PlayTime", prio, cons.TK_DATETIME_START + timedelta(seconds=min(pTimeLimits[cons.TK_CTRL_PTLPD], pTimeLimits[cons.TK_CTRL_LEFTD])), None) elif isPTInfoEnabled: # disbale info self._timekprGUI.setPlayTimeAccountingInfoEnabled(False) def notifyUser(self, pMsgCode, pMsgType, pPriority, pTimeLeft=None, pAdditionalMessage=None): """Notify user (a wrapper call)""" # prio prio = pPriority timeLeft = cons.TK_DATETIME_START if pTimeLeft is None else pTimeLeft # for time left, we need to determine final priority accoriding to user defined priority (if not defined, that will come from server) if pMsgCode == cons.TK_MSG_CODE_TIMELEFT: # get user configured level and priority prio, finLvl = self._determinePriority("Time", pPriority, (timeLeft - cons.TK_DATETIME_START).total_seconds()) # notify user self._timekprNotifications.notifyUser(pMsgCode, pMsgType, prio, timeLeft, pAdditionalMessage) def setStatus(self, pStatus): """Change status of timekpr""" return self._timekprGUI.setStatus(pStatus) # --------------- user clicked methods --------------- # def invokeTimekprTimeLeft(self, pEvent): """Inform user about (almost) exact time left""" # inform user about precise time self.notifyUser((cons.TK_MSG_CODE_TIMEUNLIMITED if self._timeNotLimited > 0 else cons.TK_MSG_CODE_TIMELEFT), None, self._lastUsedPriority, self._timeLeftTotal) def invokeTimekprUserProperties(self, pEvent): """Bring up a window for property editing""" # show limits and config self._timekprGUI.initConfigForm() def invokeTimekprAbout(self, pEvent): """Bring up a window for timekpr configration (this needs elevated privileges to do anything)""" # show about self._timekprGUI.initAboutForm() # --------------- configuration update methods --------------- # def renewUserLimits(self, pTimeInformation): """Call an update to renew time left""" # pass this to actual gui storage self._timekprGUI.renewLimits(pTimeInformation) def renewLimitConfiguration(self, pLimits): """Call an update on actual limits""" # pass this to actual gui storage self._timekprGUI.renewLimitConfiguration(pLimits) timekpr-next/client/interface/ui/statusicon.py000664 001750 001750 00000010133 14064575714 023611 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # import import os import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.client.interface.ui.notificationarea import timekprNotificationArea from timekpr.common.constants import messages as msg # status icon stuff _USE_STATUSICON = True class timekprIndicator(timekprNotificationArea): """Support appindicator""" def __init__(self, pUserName, pUserNameFull, pTimekprClientConfig): """Init all required stuff for indicator""" log.log(cons.TK_LOG_LEVEL_INFO, "start initTimekprSystrayIcon") # only if this is supported if self.isSupported(): # init parent as well super().__init__(pUserName, pUserNameFull, pTimekprClientConfig) # this is our icon self._tray = None log.log(cons.TK_LOG_LEVEL_INFO, "finish initTimekprSystrayIcon") def isSupported(self): """Get whether appindicator is supported""" global _USE_STATUSICON # returns whether we can use appindicator return _USE_STATUSICON def initTimekprIcon(self): """Initialize timekpr indicator""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start initTimekprStatusIcon") # define our popupmenu timekprMenu = """ """ # # # set up tray self._tray = Gtk.StatusIcon() self._tray.set_visible(True) # connect to methods self._tray.connect("activate", super().invokeTimekprTimeLeft) self._tray.connect("popup-menu", self.onTimekprMenu) # build up menu actiongroups timekprActionGroup = Gtk.ActionGroup("timekprActions") timekprActionGroup.add_actions([ ("TimeLeft", Gtk.STOCK_INFO, msg.getTranslation("TK_MSG_MENU_TIME_LEFT"), None, None, super().invokeTimekprTimeLeft), ("Limits & configuration", Gtk.STOCK_PROPERTIES, msg.getTranslation("TK_MSG_MENU_CONFIGURATION"), None, None, super().invokeTimekprUserProperties), ("About", Gtk.STOCK_ABOUT, msg.getTranslation("TK_MSG_MENU_ABOUT"), None, None, super().invokeTimekprAbout) ]) # build up menu timekprUIManager = Gtk.UIManager() timekprUIManager.add_ui_from_string(timekprMenu) timekprUIManager.insert_action_group(timekprActionGroup) self._popup = timekprUIManager.get_widget("/timekprPopupMenu") # initial config self._tray.set_from_file(os.path.join(self._timekprClientConfig.getTimekprSharedDir(), "icons", cons.TK_PRIO_CONF["client-logo"][cons.TK_ICON_STAT])) self.setTimeLeft("", None, 0) log.log(cons.TK_LOG_LEVEL_DEBUG, "finish initTimekprStatusIcon") def setTimeLeft(self, pPriority, pTimeLeft, pTimeNotLimited, pPlayTimeLeft=None): """Set time left in the indicator""" # make strings to set timeLeftStr, icon = super().formatTimeLeft(pPriority, pTimeLeft, pTimeNotLimited, pPlayTimeLeft) # if we have smth to set if timeLeftStr is not None: # set time left self._tray.set_tooltip_text(timeLeftStr) self._tray.set_title(timeLeftStr) # if we have smth to set if icon is not None: # set up the icon self._tray.set_from_file(icon) def onTimekprMenu(self, status, button, time): """Show popup menu for tray""" self._popup.popup(None, None, None, None, 0, time) def getTrayIconEnabled(self): """Get whether tray icon is enabled""" return self._tray.get_visible() def setTrayIconEnabled(self, pEnabled): """Set whether tray icon is enabled""" self._tray.set_visible(pEnabled) timekpr-next/client/interface/ui/__init__.py000664 001750 001750 00000000000 13476006650 023136 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/interface/dbus/000775 001750 001750 00000000000 14064575714 021365 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/interface/dbus/administration.py000664 001750 001750 00000104140 14017261747 024760 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # import import dbus from gi.repository import GLib from dbus.mainloop.glib import DBusGMainLoop # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.common.utils import misc from timekpr.common.constants import messages as msg # default loop DBusGMainLoop(set_as_default=True) class timekprAdminConnector(object): """Main class for supporting indicator notifications""" def __init__(self): """Initialize stuff for connecting to timekpr server""" # times self._retryTimeoutSecs = 3 self._retryCountLeft = 5 self._initFailed = False # dbus (timekpr) self._timekprBus = (dbus.SessionBus() if (cons.TK_DEV_ACTIVE and cons.TK_DEV_BUS == "ses") else dbus.SystemBus()) self._timekprObject = None self._timekprUserAdminDbusInterface = None self._timekprAdminDbusInterface = None def initTimekprConnection(self, pTryOnce, pRescheduleConnection=False): """Init dbus (connect to timekpr for info)""" # reschedule if pRescheduleConnection: # rescheduling means dropping existing state and try again self._timekprObject = None self._timekprUserAdminDbusInterface = None self._timekprAdminDbusInterface = None self._retryCountLeft = 5 self._initFailed = False # only if notifications are ok if self._timekprObject is None: try: # dbus performance measurement misc.measureTimeElapsed(pStart=True) # timekpr connection stuff self._timekprObject = self._timekprBus.get_object(cons.TK_DBUS_BUS_NAME, cons.TK_DBUS_SERVER_PATH) # measurement logging log.consoleOut("FYI: PERFORMANCE (DBUS), acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_BUS_NAME, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True except Exception: self._timekprObject = None # logging log.consoleOut("FAILED to obtain connection to timekpr.\nPlease check that timekpr daemon is working and you have sufficient permissions to access it (either superuser or timekpr group)") # only if notifications are ok if self._timekprObject is not None and self._timekprUserAdminDbusInterface is None: try: # getting interface self._timekprUserAdminDbusInterface = dbus.Interface(self._timekprObject, cons.TK_DBUS_USER_ADMIN_INTERFACE) # measurement logging log.consoleOut("FYI: PERFORMANCE (DBUS), acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_USER_ADMIN_INTERFACE, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True except Exception: self._timekprUserAdminDbusInterface = None # logging log.consoleOut("FAILED to connect to timekpr user admin interface.\nPlease check that timekpr daemon is working and you have sufficient permissions to access it (either superuser or timekpr group)") # only if notifications are ok if self._timekprObject is not None and self._timekprAdminDbusInterface is None: try: # getting interface self._timekprAdminDbusInterface = dbus.Interface(self._timekprObject, cons.TK_DBUS_ADMIN_INTERFACE) # measurement logging log.consoleOut("FYI: PERFORMANCE (DBUS), acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_ADMIN_INTERFACE, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True except Exception: self._timekprAdminDbusInterface = None # logging log.consoleOut("FAILED to connect to timekpr user admin interface.\nPlease check that timekpr daemon is working and you have sufficient permissions to access it (either superuser or timekpr group)") # if either of this fails, we keep trying to connect if self._timekprUserAdminDbusInterface is None or self._timekprAdminDbusInterface is None: if self._retryCountLeft > 0 and not pTryOnce: log.consoleOut("connection failed, %i attempts left, will retry in %i seconds" % (self._retryCountLeft, self._retryTimeoutSecs)) self._retryCountLeft -= 1 # if either of this fails, we keep trying to connect GLib.timeout_add_seconds(3, self.initTimekprConnection, pTryOnce) else: # failed self._initFailed = True # --------------- helper methods --------------- # def isConnected(self): """Return status of connection to DBUS""" # if either of this fails, we keep trying to connect return not (self._timekprUserAdminDbusInterface is None or self._timekprAdminDbusInterface is None), not self._initFailed def formatException(self, pExceptionStr): """Format exception and pass it back""" # check for permission error if "org.freedesktop.DBus.Error.AccessDenied" in pExceptionStr: result = -1 message = msg.getTranslation("TK_MSG_DBUS_COMMUNICATION_COMMAND_FAILED") else: result = -1 message = msg.getTranslation("TK_MSG_UNEXPECTED_ERROR") % (pExceptionStr) # result return result, message def initReturnCodes(self, pInit, pCall): """Initialize the return codes for calls""" return -2 if pInit else -1 if pCall else 0, msg.getTranslation("TK_MSG_STATUS_INTERFACE_NOTREADY") if pInit else msg.getTranslation("TK_MSG_DBUS_COMMUNICATION_COMMAND_NOT_ACCEPTED") if pCall else "" # --------------- user configuration info population methods --------------- # def getUserList(self): """Get user list from server""" # defaults result, message = self.initReturnCodes(pInit=True, pCall=False) userList = [] # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message, userList = self._timekprUserAdminDbusInterface.getUserList() except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message, userList def getUserConfigurationAndInformation(self, pUserName, pInfoLvl): """Get user configuration from server""" # defaults result, message = self.initReturnCodes(pInit=True, pCall=False) userConfig = {} # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message, userConfig = self._timekprUserAdminDbusInterface.getUserInformation(pUserName, pInfoLvl) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message, userConfig # --------------- user configuration set methods --------------- # def setAllowedDays(self, pUserName, pDayList): """Set user allowed days""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setAllowedDays(pUserName, pDayList) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setAllowedHours(self, pUserName, pDayNumber, pHourList): """Set user allowed days""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setAllowedHours(pUserName, pDayNumber, pHourList) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimeLimitForDays(self, pUserName, pDayLimits): """Set user allowed limit for days""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setTimeLimitForDays(pUserName, pDayLimits) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimeLimitForWeek(self, pUserName, pTimeLimitWeek): """Set user allowed limit for week""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setTimeLimitForWeek(pUserName, pTimeLimitWeek) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimeLimitForMonth(self, pUserName, pTimeLimitMonth): """Set user allowed limit for month""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setTimeLimitForMonth(pUserName, pTimeLimitMonth) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTrackInactive(self, pUserName, pTrackInactive): """Set user allowed days""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setTrackInactive(pUserName, pTrackInactive) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setHideTrayIcon(self, pUserName, pHideTrayIcon): """Set user allowed days""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setHideTrayIcon(pUserName, pHideTrayIcon) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setLockoutType(self, pUserName, pLockoutType, pWakeFrom, pWakeTo): """Set user restriction / lockout type""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setLockoutType(pUserName, pLockoutType, pWakeFrom, pWakeTo) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimeLeft(self, pUserName, pOperation, pTimeLeft): """Set user time left""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setTimeLeft(pUserName, pOperation, pTimeLeft) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message # --------------- PlayTime user configuration info set methods --------------- # def setPlayTimeEnabled(self, pUserName, pPlayTimeEnabled): """Set PlayTime enabled flag for user""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setPlayTimeEnabled(pUserName, pPlayTimeEnabled) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setPlayTimeLimitOverride(self, pUserName, pPlayTimeLimitOverride): """Set PlayTime override flag for user""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setPlayTimeLimitOverride(pUserName, pPlayTimeLimitOverride) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setPlayTimeUnaccountedIntervalsEnabled(self, pUserName, pPlayTimeUnaccountedIntervalsEnabled): """Set PlayTime allowed during unaccounted intervals flag for user""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setPlayTimeUnaccountedIntervalsEnabled(pUserName, pPlayTimeUnaccountedIntervalsEnabled) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setPlayTimeAllowedDays(self, pUserName, pPlayTimeAllowedDays): """Set allowed days for PlayTime for user""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setPlayTimeAllowedDays(pUserName, pPlayTimeAllowedDays) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setPlayTimeLimitsForDays(self, pUserName, pPlayTimeLimits): """Set PlayTime limits for the allowed days for the user""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setPlayTimeLimitsForDays(pUserName, pPlayTimeLimits) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setPlayTimeActivities(self, pUserName, pPlayTimeActivities): """Set PlayTime limits for the allowed days for the user""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setPlayTimeActivities(pUserName, pPlayTimeActivities) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setPlayTimeLeft(self, pUserName, pOperation, pTimeLeft): """Set user time left""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprUserAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprUserAdminDbusInterface.setPlayTimeLeft(pUserName, pOperation, pTimeLeft) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message # --------------- timekpr configuration info population / set methods --------------- # def getTimekprConfiguration(self): """Get configuration from server""" # defaults result, message = self.initReturnCodes(pInit=True, pCall=False) timekprConfig = {} # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message, timekprConfig = self._timekprAdminDbusInterface.getTimekprConfiguration() except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message, timekprConfig def setTimekprLogLevel(self, pLogLevel): """Set the logging level for server""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprLogLevel(pLogLevel) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprPollTime(self, pPollTimeSecs): """Set polltime for timekpr""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprPollTime(pPollTimeSecs) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprSaveTime(self, pSaveTimeSecs): """Set save time for timekpr""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprSaveTime(pSaveTimeSecs) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprTrackInactive(self, pTrackInactive): """Set default value for tracking inactive sessions""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprTrackInactive(pTrackInactive) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprTerminationTime(self, pTerminationTimeSecs): """Set up user termination time""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprTerminationTime(pTerminationTimeSecs) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprFinalWarningTime(self, pFinalWarningTimeSecs): """Set up final warning time for users""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprFinalWarningTime(pFinalWarningTimeSecs) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprFinalNotificationTime(self, pFinalNotificationTimeSecs): """Set up final notification time for users""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprFinalNotificationTime(pFinalNotificationTimeSecs) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprSessionsCtrl(self, pSessionsCtrl): """Set accountable session types for users""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprSessionsCtrl(pSessionsCtrl) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprSessionsExcl(self, pSessionsExcl): """Set NON-accountable session types for users""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprSessionsExcl(pSessionsExcl) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprUsersExcl(self, pUsersExcl): """Set excluded usernames for timekpr""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprUsersExcl(pUsersExcl) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprPlayTimeEnabled(self, pPlayTimeEnabled): """Set up global PlayTime enable switch""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprPlayTimeEnabled(pPlayTimeEnabled) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message def setTimekprPlayTimeEnhancedActivityMonitorEnabled(self, pPlayTimeEnabled): """Set up global PlayTime enhanced activity monitor enable switch""" # initial values result, message = self.initReturnCodes(pInit=True, pCall=False) # if we have end-point if self._timekprAdminDbusInterface is not None: # defaults result, message = self.initReturnCodes(pInit=False, pCall=True) # notify through dbus try: # call dbus method result, message = self._timekprAdminDbusInterface.setTimekprPlayTimeEnhancedActivityMonitorEnabled(pPlayTimeEnabled) except Exception as ex: # exception result, message = self.formatException(str(ex)) # we cannot send notif through dbus, we need to reschedule connecton self.initTimekprConnection(False, True) # result return result, message timekpr-next/client/interface/dbus/notifications.py000664 001750 001750 00000064313 14021162252 024575 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # import import dbus import os from gi.repository import GLib from dbus.mainloop.glib import DBusGMainLoop # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.common.utils import misc from timekpr.client.interface.speech.espeak import timekprSpeech from timekpr.common.constants import messages as msg # default loop DBusGMainLoop(set_as_default=True) class timekprNotifications(object): """Main class for supporting indicator notifications, connect to request methods for timekpr and connections to other DBUS modules""" def __init__(self, pUserName, pTimekprClientConfig): """Initialize notifications""" log.log(cons.TK_LOG_LEVEL_INFO, "start init timekpr notifications") # uname self._userName = pUserName self._timekprClientConfig = pTimekprClientConfig # critical notification (to replace itself) self._lastNotifId = 0 # session bus self._userSessionBus = dbus.SessionBus() # timekpr bus self._timekprBus = (dbus.SessionBus() if (cons.TK_DEV_ACTIVE and cons.TK_DEV_BUS == "ses") else dbus.SystemBus()) # DBUS client connections # connection types self.CL_CONN_TK = "timekpr" self.CL_CONN_NOTIF = "notifications" self.CL_CONN_SCR = "screensaver" # constants self.CL_IF = "primary interface" self.CL_IFA = "attributes interface" self.CL_SI = "signal" self.CL_CNT = "retry_count" self.CL_DEL = "delay_times" # object collection for DBUS connections self._dbusConnections = { self.CL_CONN_TK: {self.CL_IF: None, self.CL_IFA: None, self.CL_SI: None, self.CL_CNT: 999, self.CL_DEL: 0}, self.CL_CONN_NOTIF: {self.CL_IF: None, self.CL_IFA: None, self.CL_SI: None, self.CL_CNT: 99, self.CL_DEL: 0}, self.CL_CONN_SCR: {self.CL_IF: None, self.CL_IFA: None, self.CL_SI: None, self.CL_CNT: 5, self.CL_DEL: 1} } # WORKAROUNDS section start # adjust even bigger delay with unity + 18.04 + HDD if "UNITY" in os.getenv("XDG_CURRENT_DESKTOP", "SUPERDESKTOP").upper(): # more delay, race condition with screensaver? self._dbusConnections[self.CL_CONN_SCR][self.CL_DEL] += cons.TK_POLLTIME - 1 # WORKAROUNDS section end # speech init self._timekprSpeechManager = None log.log(cons.TK_LOG_LEVEL_INFO, "finish init timekpr notifications") def initClientConnections(self): """Init dbus (connect to session bus for notification)""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start initClientConnections") # speech if self._timekprSpeechManager is None: # initialize self._timekprSpeechManager = timekprSpeech() # check if supported, if it is, initialize if self._timekprSpeechManager.isSupported(): # initialize if supported self._timekprSpeechManager.initSpeech() # only if notifications are not ok if self._dbusConnections[self.CL_CONN_NOTIF][self.CL_IF] is None and self._dbusConnections[self.CL_CONN_NOTIF][self.CL_CNT] > 0 and not self._dbusConnections[self.CL_CONN_NOTIF][self.CL_DEL] > 0: # define inames (I hope "revolutionary company" won't sue me for using i in front of variable names) iNames = ["org.freedesktop.Notifications"] iPaths = ["/org/freedesktop/Notifications"] # go through inames for idx in range(0, len(iNames)): # go through all possible interfaces try: # dbus performance measurement misc.measureTimeElapsed(pStart=True) # getting interface self._dbusConnections[self.CL_CONN_NOTIF][self.CL_IF] = dbus.Interface(self._userSessionBus.get_object(iNames[idx], iPaths[idx]), iNames[idx]) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (iNames[idx], misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # first sucess is enough log.log(cons.TK_LOG_LEVEL_DEBUG, "CONNECTED to DBUS %s interface" % (self.CL_CONN_NOTIF)) # check capabilities if "sound" not in self._dbusConnections[self.CL_CONN_NOTIF][self.CL_IF].GetCapabilities(): # sound is not available self._timekprClientConfig.setIsNotificationSoundSupported(False) # finish break except Exception as dbusEx: self._dbusConnections[self.CL_CONN_NOTIF][self.CL_IF] = None # logging log.log(cons.TK_LOG_LEVEL_INFO, "--=== WARNING initiating dbus connection (%s, %s) ===---" % (self.CL_CONN_NOTIF, iNames[idx])) log.log(cons.TK_LOG_LEVEL_INFO, str(dbusEx)) log.log(cons.TK_LOG_LEVEL_INFO, "--=== WARNING ===---") # only if screensaver is not ok if self._dbusConnections[self.CL_CONN_SCR][self.CL_IF] is None and self._dbusConnections[self.CL_CONN_SCR][self.CL_CNT] > 0 and not self._dbusConnections[self.CL_CONN_SCR][self.CL_DEL] > 0: # define inames (I hope "revolutionary company" won't sue me for using i in front of variable names :) ) iNames = [] iPaths = [] chosenIdx = None # THIS WHOLE SECTION IS WORKAROUNDS FOR MULTIPLE VARIETIES OF SCREENSAVER IMPLEMENTATIONS - START # they must be compatible to freedekstop standard, e.g. have corect naming and at least GetActive method # get current DE currentDE = os.getenv("XDG_CURRENT_DESKTOP", "SUPERDESKTOP").upper() # workarounds per desktop for rIdx in range(0, len(cons.TK_SCR_XDGCD_OVERRIDE)): # check desktops if cons.TK_SCR_XDGCD_OVERRIDE[rIdx][0] in currentDE: log.log(cons.TK_LOG_LEVEL_INFO, "INFO: using %s screensaver dbus interface as a workaround" % (cons.TK_SCR_XDGCD_OVERRIDE[rIdx][1])) # use gnome stuff iNames.extend(["org.%s.ScreenSaver" % (cons.TK_SCR_XDGCD_OVERRIDE[rIdx][1])]) iPaths.extend(["/org/%s/ScreenSaver" % (cons.TK_SCR_XDGCD_OVERRIDE[rIdx][1])]) # first match is enough break # add default section with the actual standard iNames.extend(["org.freedesktop.ScreenSaver"]) iPaths.extend(["/org/freedesktop/ScreenSaver"]) # if only freedesktop is in the list, try one more fallback to gnome if len(iNames) < 2: # add default section iNames.extend(["org.gnome.ScreenSaver"]) iPaths.extend(["/org/gnome/ScreenSaver"]) # THIS WHOLE SECTION IS WORKAROUNDS FOR MULTIPLE VARIETIES OF SCREENSAVER IMPLEMENTATIONS - END # go through inames for idx in range(0, len(iNames)): # go through all possible interfaces try: # dbus performance measurement misc.measureTimeElapsed(pStart=True) # getting interface self._dbusConnections[self.CL_CONN_SCR][self.CL_IF] = dbus.Interface(self._userSessionBus.get_object(iNames[idx], iPaths[idx]), iNames[idx]) # verification (Gnome has not implemented freedesktop methods, we need to verify this actually works) self._dbusConnections[self.CL_CONN_SCR][self.CL_IF].GetActive() # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (iNames[idx], misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # first sucess is enough chosenIdx = idx # finish break except Exception as dbusEx: self._dbusConnections[self.CL_CONN_SCR][self.CL_IF] = None # logging log.log(cons.TK_LOG_LEVEL_INFO, "--=== WARNING initiating dbus connection (%s, %s) ===---" % (self.CL_CONN_SCR, iNames[idx])) log.log(cons.TK_LOG_LEVEL_INFO, str(dbusEx)) log.log(cons.TK_LOG_LEVEL_INFO, "--=== WARNING ===---") # connection successful if self._dbusConnections[self.CL_CONN_SCR][self.CL_IF] is not None: # log log.log(cons.TK_LOG_LEVEL_DEBUG, "CONNECTED to DBUS %s (%s) interface" % (self.CL_CONN_SCR, iNames[chosenIdx])) # add a connection to signal self._dbusConnections[self.CL_CONN_SCR][self.CL_SI] = self._userSessionBus.add_signal_receiver( path = iPaths[chosenIdx], handler_function = self.receiveScreenSaverActivityChange, dbus_interface = iNames[chosenIdx], signal_name = "ActiveChanged") # only if screensaver is not ok if self._dbusConnections[self.CL_CONN_TK][self.CL_IF] is None and self._dbusConnections[self.CL_CONN_TK][self.CL_CNT] > 0 and not self._dbusConnections[self.CL_CONN_TK][self.CL_DEL] > 0: try: # dbus performance measurement misc.measureTimeElapsed(pStart=True) # getting interface self._dbusConnections[self.CL_CONN_TK][self.CL_IF] = dbus.Interface(self._timekprBus.get_object(cons.TK_DBUS_BUS_NAME, cons.TK_DBUS_SERVER_PATH), cons.TK_DBUS_USER_LIMITS_INTERFACE) # log log.log(cons.TK_LOG_LEVEL_DEBUG, "CONNECTED to %s DBUS %s interface" % (self.CL_CONN_TK, self.CL_IF)) # getting interface self._dbusConnections[self.CL_CONN_TK][self.CL_IFA] = dbus.Interface(self._timekprBus.get_object(cons.TK_DBUS_BUS_NAME, cons.TK_DBUS_SERVER_PATH), cons.TK_DBUS_USER_SESSION_ATTRIBUTE_INTERFACE) # log log.log(cons.TK_LOG_LEVEL_DEBUG, "CONNECTED to %s DBUS %s interface" % (self.CL_CONN_TK, self.CL_IFA)) # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - acquiring \"%s\" took too long (%is)" % (cons.TK_DBUS_USER_LIMITS_INTERFACE, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True except Exception as dbusEx: # reset self._dbusConnections[self.CL_CONN_TK][self.CL_IF] = None self._dbusConnections[self.CL_CONN_TK][self.CL_IFA] = None # logging log.log(cons.TK_LOG_LEVEL_INFO, "--=== WARNING initiating dbus connection (%s, %s) ===---" % (self.CL_CONN_TK, cons.TK_DBUS_BUS_NAME)) log.log(cons.TK_LOG_LEVEL_INFO, str(dbusEx)) log.log(cons.TK_LOG_LEVEL_INFO, "--=== WARNING ===---") # retry? doRetry = False # all variants for rConn in (self.CL_CONN_TK, self.CL_CONN_NOTIF, self.CL_CONN_SCR): # if either of this fails, we keep trying to connect if self._dbusConnections[rConn][self.CL_IF] is None: # max retries if self._dbusConnections[rConn][self.CL_CNT] > 0: # only if delay is ended if not self._dbusConnections[rConn][self.CL_DEL] > 0: # decrease retries self._dbusConnections[rConn][self.CL_CNT] -= 1 # continue if more retries available if self._dbusConnections[rConn][self.CL_CNT] > 0: # retry doRetry = True # do not take into account delay if self._dbusConnections[rConn][self.CL_DEL] > 0: # connection delayed log.log(cons.TK_LOG_LEVEL_INFO, "INFO: dbus connection to %s delayed for %d more times" % (rConn, self._dbusConnections[rConn][self.CL_DEL])) # decrease delay self._dbusConnections[rConn][self.CL_DEL] -= 1 else: # logging log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: failed to connect to %s dbus, trying again..." % (rConn)) else: # connection aborted log.log(cons.TK_LOG_LEVEL_INFO, "WARNING: dbus connection to %s failed, some functionality will not be available" % (rConn)) # retry if doRetry: # if either of this fails, we keep trying to connect GLib.timeout_add_seconds(cons.TK_POLLTIME, self.initClientConnections) # prepare notifications in case smth is not ok else: # let's inform user in case screensaver is not connected if self._dbusConnections[self.CL_CONN_SCR][self.CL_IF] is None and self._timekprClientConfig.getClientShowAllNotifications(): # prepare notification self.notifyUser(cons.TK_MSG_CODE_FEATURE_SCR_NOT_AVAILABLE_ERROR, None, cons.TK_PRIO_WARNING, pAdditionalMessage=self.CL_CONN_SCR) log.log(cons.TK_LOG_LEVEL_DEBUG, "finish initClientConnections") # finish return False def isTimekprConnected(self): """Return status of timekpr connection (nothing else, just timekpr itself)""" return self._dbusConnections[self.CL_CONN_TK][self.CL_IF] is not None def _prepareNotification(self, pMsgCode, pMsgType, pPriority, pTimeLeft=None, pAdditionalMessage=None): """Prepare the message to be sent to dbus notifications""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start prepareNotification") # determine icon to use timekprIcon = cons.TK_PRIO_CONF[cons.getNotificationPrioriy(pPriority)][cons.TK_ICON_NOTIF] timekprPrio = cons.TK_PRIO_CONF[cons.getNotificationPrioriy(pPriority)][cons.TK_DBUS_PRIO] # calculate hours in advance if pTimeLeft is not None: timeLeftHours = (pTimeLeft - cons.TK_DATETIME_START).days * 24 + pTimeLeft.hour # determine the message to pass if pMsgCode == cons.TK_MSG_CODE_TIMEUNLIMITED: # no limit msgStr = msg.getTranslation("TK_MSG_NOTIFICATION_NOT_LIMITED") elif pMsgCode == cons.TK_MSG_CODE_TIMELEFT: # msg msgStr = " ".join((msg.getTranslation("TK_MSG_NOTIFICATION_TIME_LEFT_1", timeLeftHours), msg.getTranslation("TK_MSG_NOTIFICATION_TIME_LEFT_2", pTimeLeft.minute), msg.getTranslation("TK_MSG_NOTIFICATION_PLAYTIME_LEFT_3" if pMsgType == "PlayTime" else "TK_MSG_NOTIFICATION_TIME_LEFT_3", pTimeLeft.second))) elif pMsgCode == cons.TK_MSG_CODE_TIMECRITICAL: # depending on type if pMsgType == cons.TK_CTRL_RES_L: msgCode = "TK_MSG_NOTIFICATION_TIME_IS_UP_1L" elif pMsgType in (cons.TK_CTRL_RES_S, cons.TK_CTRL_RES_W): msgCode = "TK_MSG_NOTIFICATION_TIME_IS_UP_1S" elif pMsgType == cons.TK_CTRL_RES_D: msgCode = "TK_MSG_NOTIFICATION_TIME_IS_UP_1D" else: msgCode = "TK_MSG_NOTIFICATION_TIME_IS_UP_1T" # msg msgStr = " ".join((msg.getTranslation(msgCode), msg.getTranslation("TK_MSG_NOTIFICATION_TIME_IS_UP_2", pTimeLeft.second))) elif pMsgCode == cons.TK_MSG_CODE_TIMELEFTCHANGED: # msg msgStr = msg.getTranslation("TK_MSG_NOTIFICATION_ALLOWANCE_CHANGED") elif pMsgCode == cons.TK_MSG_CODE_TIMECONFIGCHANGED: # msg msgStr = msg.getTranslation("TK_MSG_NOTIFICATION_CONFIGURATION_CHANGED") elif pMsgCode == cons.TK_MSG_CODE_REMOTE_COMMUNICATION_ERROR: # msg msgStr = msg.getTranslation("TK_MSG_NOTIFICATION_CANNOT_CONNECT") % (pAdditionalMessage) elif pMsgCode == cons.TK_MSG_CODE_REMOTE_INVOCATION_ERROR: # msg msgStr = msg.getTranslation("TK_MSG_NOTIFICATION_CANNOT_COMMUNICATE") % (pAdditionalMessage) elif pMsgCode == cons.TK_MSG_CODE_ICON_INIT_ERROR: # msg msgStr = msg.getTranslation("TK_MSG_NOTIFICATION_CANNOT_INIT_ICON") % (pAdditionalMessage) elif pMsgCode == cons.TK_MSG_CODE_FEATURE_SCR_NOT_AVAILABLE_ERROR: # msg msgStr = msg.getTranslation("TK_MSG_NOTIFICATION_SCR_FEATURE_NOT_AVAILABLE") % (pAdditionalMessage) # save notification ID notifId = self._lastNotifId log.log(cons.TK_LOG_LEVEL_DEBUG, "finish prepareNotification") # pass this back return notifId, timekprIcon, msgStr, timekprPrio def notifyUser(self, pMsgCode, pMsgType, pPriority, pTimeLeft=None, pAdditionalMessage=None): """Notify the user.""" # if we have dbus connection, let"s do so if self._dbusConnections[self.CL_CONN_NOTIF][self.CL_IF] is None: # init self.initClientConnections() # can we notify user if self._dbusConnections[self.CL_CONN_NOTIF][self.CL_IF] is not None: # prepare notification notifId, timekprIcon, msgStr, timekprPrio = self._prepareNotification(pMsgCode, pMsgType, pPriority, pTimeLeft, pAdditionalMessage) # defaults hints = {"urgency": timekprPrio} # notification params based on criticality if pPriority in (cons.TK_PRIO_CRITICAL, cons.TK_PRIO_IMPORTANT): # timeout notificationTimeout = self._timekprClientConfig.getClientNotificationTimeoutCritical() # sound if self._timekprClientConfig.getIsNotificationSoundSupported() and self._timekprClientConfig.getClientUseNotificationSound(): # add sound hint hints["sound-file"] = cons.TK_CL_NOTIF_SND_FILE_CRITICAL else: # timeout notificationTimeout = self._timekprClientConfig.getClientNotificationTimeout() # sound if self._timekprClientConfig.getIsNotificationSoundSupported() and self._timekprClientConfig.getClientUseNotificationSound(): # add sound hint hints["sound-file"] = cons.TK_CL_NOTIF_SND_FILE_WARN # calculate notification values notificationTimeout = min(cons.TK_CL_NOTIF_MAX, max(0, notificationTimeout)) * 1000 # notification value of 0 means "forever" actions = ["Dismiss", "Dismiss"] if notificationTimeout == 0 else [] # notify through dbus try: # call dbus method notifId = self._dbusConnections[self.CL_CONN_NOTIF][self.CL_IF].Notify("Timekpr", notifId if pMsgType != "PlayTime" else 0, timekprIcon, msg.getTranslation("TK_MSG_NOTIFICATION_PLAYTIME_TITLE" if pMsgType == "PlayTime" else "TK_MSG_NOTIFICATION_TITLE"), msgStr, actions, hints, notificationTimeout) except Exception as dbusEx: # we cannot send notif through dbus self._dbusConnections[self.CL_CONN_NOTIF][self.CL_IF] = None # logging log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through dbus ===---") log.log(cons.TK_LOG_LEVEL_INFO, str(dbusEx)) log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through dbus ===---") # save notification ID (only if message is not about PlayTime, otherwise it may dismiss standard time or vice versa) if pMsgType != "PlayTime": self._lastNotifId = notifId # user wants to hear things if self._timekprClientConfig.getIsNotificationSpeechSupported() and self._timekprClientConfig.getClientUseSpeechNotifications(): # say that out loud self._timekprSpeechManager.saySmth(msgStr) # --------------- admininstration / verification methods --------------- # def verifySessionAttributes(self, pWhat, pKey): """Receive the signal and process the data""" log.log(cons.TK_LOG_LEVEL_DEBUG, "prepare verification of attributes for server: %s, %s" % (pWhat, "key")) # def value = None # for screensaver status if pWhat == cons.TK_CTRL_SCR_N: # value value = str(bool(self._dbusConnections[self.CL_CONN_SCR][self.CL_IF].GetActive())) # resend stuff to server self.processUserSessionAttributes(pWhat, pKey, value) # --------------- admininstration / verification signals --------------- # def receiveScreenSaverActivityChange(self, pIsActive): """Receive the signal and process the data""" log.log(cons.TK_LOG_LEVEL_DEBUG, "receive screensaver activity changes: %s" % (str(bool(pIsActive)))) # request to server for verification self.processUserSessionAttributes(cons.TK_CTRL_SCR_N) # --------------- request methods to timekpr --------------- # def requestTimeLeft(self): """Request time left from server""" # if we have dbus connection, let"s do so if self._dbusConnections[self.CL_CONN_TK][self.CL_IF] is None: # init self.initClientConnections() # if we have end-point if self._dbusConnections[self.CL_CONN_TK][self.CL_IF] is not None: log.log(cons.TK_LOG_LEVEL_INFO, "requesting timeleft") # notify through dbus try: # call dbus method result, message = self._dbusConnections[self.CL_CONN_TK][self.CL_IF].requestTimeLeft(self._userName) # check call result if result != 0: # show message to user as well self.notifyUser(cons.TK_MSG_CODE_REMOTE_INVOCATION_ERROR, None, cons.TK_PRIO_CRITICAL, pAdditionalMessage=message) except Exception as dbusEx: # we cannot send notif through dbus self._dbusConnections[self.CL_CONN_TK][self.CL_IF] = None # logging log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through timekpr dbus ===---") log.log(cons.TK_LOG_LEVEL_INFO, str(dbusEx)) log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through timekpr dbus ===---") # show message to user as well self.notifyUser(cons.TK_MSG_CODE_REMOTE_COMMUNICATION_ERROR, None, cons.TK_PRIO_CRITICAL, pAdditionalMessage=msg.getTranslation("TK_MSG_NOTIFICATION_CONNECTION_ERROR")) def requestTimeLimits(self): """Request time limits from server""" # if we have dbus connection, let"s do so if self._dbusConnections[self.CL_CONN_TK][self.CL_IF] is None: # init self.initClientConnections() # if we have end-point if self._dbusConnections[self.CL_CONN_TK][self.CL_IF] is not None: log.log(cons.TK_LOG_LEVEL_INFO, "requesting timelimits") # notify through dbus try: # call dbus method result, message = self._dbusConnections[self.CL_CONN_TK][self.CL_IF].requestTimeLimits(self._userName) # check call result if result != 0: # show message to user as well self.notifyUser(cons.TK_MSG_CODE_REMOTE_INVOCATION_ERROR, None, cons.TK_PRIO_CRITICAL, pAdditionalMessage=message) except Exception as dbusEx: # we cannot send notif through dbus self._dbusConnections[self.CL_CONN_TK][self.CL_IF] = None # logging log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through timekpr dbus ===---") log.log(cons.TK_LOG_LEVEL_INFO, str(dbusEx)) log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through timekpr dbus ===---") # show message to user as well self.notifyUser(cons.TK_MSG_CODE_REMOTE_COMMUNICATION_ERROR, None, cons.TK_PRIO_CRITICAL, pAdditionalMessage=msg.getTranslation("TK_MSG_NOTIFICATION_CONNECTION_ERROR")) def processUserSessionAttributes(self, pWhat, pKey=None, pValue=None): """Process user session attributes from server""" # if we have dbus connection, let"s do so if self._dbusConnections[self.CL_CONN_TK][self.CL_IFA] is None: # init self.initClientConnections() # if we have end-point if self._dbusConnections[self.CL_CONN_TK][self.CL_IFA] is not None: log.log(cons.TK_LOG_LEVEL_INFO, "%s session attributes" % ("requesting" if pKey is None else "verifying")) # notify through dbus try: # call dbus method result, message = self._dbusConnections[self.CL_CONN_TK][self.CL_IFA].processUserSessionAttributes( self._userName, dbus.String(pWhat if pWhat is not None else ""), dbus.String(pKey if pKey is not None else ""), dbus.String(pValue if pValue is not None else "")) # check call result if result != 0: # show message to user as well self.notifyUser(cons.TK_MSG_CODE_REMOTE_INVOCATION_ERROR, None, cons.TK_PRIO_CRITICAL, None, pAdditionalMessage=message) except Exception as dbusEx: # we cannot send notif through dbus self._dbusConnections[self.CL_CONN_TK][self.CL_IF] = None self._dbusConnections[self.CL_CONN_TK][self.CL_IFA] = None # logging log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through timekpr dbus ===---") log.log(cons.TK_LOG_LEVEL_INFO, str(dbusEx)) log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through timekpr dbus ===---") # show message to user as well self.notifyUser(cons.TK_MSG_CODE_REMOTE_COMMUNICATION_ERROR, None, cons.TK_PRIO_CRITICAL, pAdditionalMessage=msg.getTranslation("TK_MSG_NOTIFICATION_CONNECTION_ERROR")) timekpr-next/client/interface/dbus/daemon.py000664 001750 001750 00000035431 14064575714 023210 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ # imports from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) from datetime import timedelta import os import dbus from gi.repository import GLib # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.common.utils import misc from timekpr.common.utils.config import timekprClientConfig from timekpr.client.interface.ui.appindicator import timekprIndicator as appind_timekprIndicator from timekpr.client.interface.ui.statusicon import timekprIndicator as statico_timekprIndicator from timekpr.common.constants import messages as msg class timekprClient(object): """Main class for holding all client logic (including dbus)""" # --------------- initialization / control methods --------------- # def __init__(self): """Initialize client""" # set username , etc. self._userName, self._userNameFull = misc.getNormalizedUserNames(pUID=os.getuid()) self._userNameDBUS = self._userName.replace(".", "").replace("-", "") # get our bus self._timekprBus = (dbus.SessionBus() if (cons.TK_DEV_ACTIVE and cons.TK_DEV_BUS == "ses") else dbus.SystemBus()) # loop self._mainLoop = GLib.MainLoop() # init logging (load config which has all the necessarry bits) self._timekprClientConfig = timekprClientConfig() self._timekprClientConfig.loadClientConfiguration() # init logging log.setLogging(self._timekprClientConfig.getClientLogLevel(), cons.TK_LOG_TEMP_DIR, cons.TK_LOG_OWNER_CLIENT, self._userName) def startTimekprClient(self): """Start up timekpr (choose appropriate gui and start this up)""" log.log(cons.TK_LOG_LEVEL_INFO, "starting up timekpr client") # check if appind is supported self._timekprClientIndicator = appind_timekprIndicator(self._userName, self._userNameFull, self._timekprClientConfig) # if not supported fall back to statico if not self._timekprClientIndicator.isSupported(): # check if appind is supported self._timekprClientIndicator = statico_timekprIndicator(self._userName, self._userNameFull, self._timekprClientConfig) # this will check whether we have an icon, if not, the rest goes through timekprClient anyway if self._timekprClientIndicator.isSupported(): # init timekpr self._timekprClientIndicator.initTimekprIcon() else: # process time left notification (notifications should be available in any of the icons, even of not supported) self._timekprClientIndicator.notifyUser(cons.TK_MSG_CODE_ICON_INIT_ERROR, None, cons.TK_PRIO_CRITICAL, None, "cannot initialize the icon in any way") # connect to timekpr etc. self.connectTimekprSignalsDBUS() # init startup notification at default interval GLib.timeout_add_seconds(cons.TK_POLLTIME, self.requestInitialTimeValues) # periodic log flusher GLib.timeout_add_seconds(cons.TK_POLLTIME, self.autoFlushLogFile) # start main loop self._mainLoop.run() def autoFlushLogFile(self): """Periodically save file""" log.autoFlushLogFile() return True def finishTimekpr(self, signal=None, frame=None): """Exit timekpr gracefully""" log.log(cons.TK_LOG_LEVEL_INFO, "Finishing up") # exit main loop self._mainLoop.quit() log.log(cons.TK_LOG_LEVEL_INFO, "Finished") log.flushLogFile() def requestInitialTimeValues(self): """Request initial config from server""" # whether to process again result = False # check if connected if self._notificationFromDBUS is not None: # connect to DBUS for the rest of modules self._timekprClientIndicator.initClientConnections() # request values if connections are made successfully result = self._timekprClientIndicator.isTimekprConnected() # connected? if result: # get limits self._timekprClientIndicator.requestTimeLimits() # get left self._timekprClientIndicator.requestTimeLeft() # continue execution while not connected (this is called from glib exec) return not result # --------------- DBUS / communication methods --------------- # def connectTimekprSignalsDBUS(self): """Init connections to dbus provided by server""" log.log(cons.TK_LOG_LEVEL_DEBUG, "start connectTimekprSignalsDBUS") # trying to connect self._timekprClientIndicator.setStatus(msg.getTranslation("TK_MSG_STATUS_CONNECTING")) try: # dbus performance measurement misc.measureTimeElapsed(pStart=True) # get dbus object self._notificationFromDBUS = self._timekprBus.get_object(cons.TK_DBUS_BUS_NAME, cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS) # connect to signal self._sessionAttributeVerificationSignal = self._timekprBus.add_signal_receiver( path = cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS, handler_function = self.reveiveSessionAttributeVerificationRequest, dbus_interface = cons.TK_DBUS_USER_SESSION_ATTRIBUTE_INTERFACE, signal_name = "sessionAttributeVerification") # connect to signal self._timeLeftSignal = self._timekprBus.add_signal_receiver( path = cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS, handler_function = self.receiveTimeLeft, dbus_interface = cons.TK_DBUS_USER_LIMITS_INTERFACE, signal_name = "timeLeft") # connect to signal self._timeLimitsSignal = self._timekprBus.add_signal_receiver( path = cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS, handler_function = self.receiveTimeLimits, dbus_interface = cons.TK_DBUS_USER_LIMITS_INTERFACE, signal_name = "timeLimits") # connect to signal self._timeLeftNotificatonSignal = self._timekprBus.add_signal_receiver( path = cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS, handler_function = self.receiveTimeLeftNotification, dbus_interface = cons.TK_DBUS_USER_NOTIF_INTERFACE, signal_name = "timeLeftNotification") # connect to signal self._timeCriticalNotificatonSignal = self._timekprBus.add_signal_receiver( path = cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS, handler_function = self.receiveTimeCriticalNotification, dbus_interface = cons.TK_DBUS_USER_NOTIF_INTERFACE, signal_name = "timeCriticalNotification") # connect to signal self._timeNoLimitNotificationSignal = self._timekprBus.add_signal_receiver( path = cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS, handler_function = self.receiveTimeNoLimitNotification, dbus_interface = cons.TK_DBUS_USER_NOTIF_INTERFACE, signal_name = "timeNoLimitNotification") # connect to signal self._timeLeftChangedNotificationSignal = self._timekprBus.add_signal_receiver( path = cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS, handler_function = self.receiveTimeLeftChangedNotification, dbus_interface = cons.TK_DBUS_USER_NOTIF_INTERFACE, signal_name = "timeLeftChangedNotification") # connect to signal self._timeConfigurationChangedNotificationSignal = self._timekprBus.add_signal_receiver( path = cons.TK_DBUS_USER_NOTIF_PATH_PREFIX + self._userNameDBUS, handler_function = self.receiveTimeConfigurationChangedNotification, dbus_interface = cons.TK_DBUS_USER_NOTIF_INTERFACE, signal_name = "timeConfigurationChangedNotification") # measurement logging log.log(cons.TK_LOG_LEVEL_INFO, "PERFORMANCE (DBUS) - connecting signals \"%s\" took too long (%is)" % (cons.TK_DBUS_BUS_NAME, misc.measureTimeElapsed(pResult=True))) if misc.measureTimeElapsed(pStop=True) >= cons.TK_DBUS_ANSWER_TIME else True # set status self._timekprClientIndicator.setStatus(msg.getTranslation("TK_MSG_STATUS_CONNECTED")) log.log(cons.TK_LOG_LEVEL_DEBUG, "main DBUS signals connected") except Exception as dbusEx: # logging log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through dbus ===---") log.log(cons.TK_LOG_LEVEL_INFO, str(dbusEx)) log.log(cons.TK_LOG_LEVEL_INFO, "--=== ERROR sending message through dbus ===---") log.log(cons.TK_LOG_LEVEL_INFO, "ERROR: failed to connect to timekpr dbus, trying again...") # did not connect (set connection to None) and schedule for reconnect at default interval self._notificationFromDBUS = None # connect until successful GLib.timeout_add_seconds(cons.TK_POLLTIME, self.connectTimekprSignalsDBUS) log.log(cons.TK_LOG_LEVEL_DEBUG, "finish connectTimekprSignalsDBUS") # finish return False # --------------- admininstration / verification methods (from dbus) --------------- # def reveiveSessionAttributeVerificationRequest(self, pWhat, pKey): """Receive the signal and process the data""" log.log(cons.TK_LOG_LEVEL_DEBUG, "receive verification request: %s, %s" % (pWhat, "key")) # resend stuff to server self._timekprClientIndicator.verifySessionAttributes(pWhat, pKey) def processShowClientIcon(self, pTimeInformation): """Check wheter to show or hide tray icon""" # do we have information about show or hide icon if cons.TK_CTRL_HIDEI in pTimeInformation: # enable? iconStatus = (not bool(pTimeInformation[cons.TK_CTRL_HIDEI])) # check if those differ if self._timekprClientIndicator.getTrayIconEnabled() != iconStatus: # set it self._timekprClientIndicator.setTrayIconEnabled(iconStatus) # --------------- worker methods (from dbus) --------------- # def receiveTimeLeft(self, pPriority, pTimeInformation): """Receive the signal and process the data to user""" # check which options are available timeLeft = (pTimeInformation[cons.TK_CTRL_LEFT] if cons.TK_CTRL_LEFT in pTimeInformation else 0) playTimeLeft = (pTimeInformation[cons.TK_CTRL_PTLPD] if cons.TK_CTRL_PTLSTC in pTimeInformation and cons.TK_CTRL_PTLPD in pTimeInformation and cons.TK_CTRL_PTTLO in pTimeInformation else None) isTimeNotLimited = (pTimeInformation[cons.TK_CTRL_TNL] if cons.TK_CTRL_TNL in pTimeInformation else 0) log.log(cons.TK_LOG_LEVEL_DEBUG, "receive timeleft: %s, %i, %i" % (pPriority, timeLeft, isTimeNotLimited)) # process show / hide icon self.processShowClientIcon(pTimeInformation) # process PlayTime notifications as well self._timekprClientIndicator.processPlayTimeNotifications(pTimeInformation) # process time left self._timekprClientIndicator.setTimeLeft(pPriority, cons.TK_DATETIME_START + timedelta(seconds=timeLeft), isTimeNotLimited, cons.TK_DATETIME_START + timedelta(seconds=playTimeLeft) if playTimeLeft is not None else playTimeLeft) # renew limits in GUI self._timekprClientIndicator.renewUserLimits(pTimeInformation) def receiveTimeLimits(self, pPriority, pTimeLimits): """Receive the signal and process the data to user""" log.log(cons.TK_LOG_LEVEL_DEBUG, "receive timelimits: %s" % (pPriority)) # renew limits in GUI self._timekprClientIndicator.renewLimitConfiguration(pTimeLimits) # --------------- notification methods (from dbus) --------------- # def receiveTimeLeftNotification(self, pPriority, pTimeLeftTotal, pTimeLeftToday, pTimeLimitToday): """Receive time left and update GUI""" log.log(cons.TK_LOG_LEVEL_DEBUG, "receive tl notif: %s, %i" % (pPriority, pTimeLeftTotal)) # if notifications are turned on if (self._timekprClientConfig.getClientShowAllNotifications() and self._timekprClientIndicator.getTrayIconEnabled()) or pPriority == cons.TK_PRIO_CRITICAL: # process time left notification self._timekprClientIndicator.notifyUser(cons.TK_MSG_CODE_TIMELEFT, None, pPriority, cons.TK_DATETIME_START + timedelta(seconds=pTimeLeftTotal)) def receiveTimeCriticalNotification(self, pFinalNotificationType, pPriority, pSecondsLeft): """Receive critical time left and show that to user""" log.log(cons.TK_LOG_LEVEL_DEBUG, "receive crit notif: %s, %i" % (pFinalNotificationType, pSecondsLeft)) # process time left (this shows in any case) self._timekprClientIndicator.notifyUser(cons.TK_MSG_CODE_TIMECRITICAL, pFinalNotificationType, pPriority, cons.TK_DATETIME_START + timedelta(seconds=pSecondsLeft)) def receiveTimeNoLimitNotification(self, pPriority): """Receive no limit notificaton and show that to user""" log.log(cons.TK_LOG_LEVEL_DEBUG, "receive nl notif") # if notifications are turned on if self._timekprClientConfig.getClientShowAllNotifications() and self._timekprClientIndicator.getTrayIconEnabled(): # process time left self._timekprClientIndicator.notifyUser(cons.TK_MSG_CODE_TIMEUNLIMITED, None, pPriority) def receiveTimeLeftChangedNotification(self, pPriority): """Receive time left notification and show it to user""" log.log(cons.TK_LOG_LEVEL_DEBUG, "receive time left changed notif") # if notifications are turned on if self._timekprClientConfig.getClientShowLimitNotifications() and self._timekprClientIndicator.getTrayIconEnabled(): # limits have changed and applied self._timekprClientIndicator.notifyUser(cons.TK_MSG_CODE_TIMELEFTCHANGED, None, pPriority) def receiveTimeConfigurationChangedNotification(self, pPriority): """Receive notification about config change and show it to user""" log.log(cons.TK_LOG_LEVEL_DEBUG, "receive config changed notif") # if notifications are turned on if self._timekprClientConfig.getClientShowLimitNotifications() and self._timekprClientIndicator.getTrayIconEnabled(): # configuration has changed, new limits may have been applied self._timekprClientIndicator.notifyUser(cons.TK_MSG_CODE_TIMECONFIGCHANGED, None, pPriority) timekpr-next/client/interface/dbus/__init__.py000664 001750 001750 00000000000 13476006650 023456 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/interface/__init__.py000664 001750 001750 00000000000 13476006650 022521 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/__init__.py000664 001750 001750 00000000000 13476006650 020561 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/gui/000775 001750 001750 00000000000 14064575714 017254 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/client/gui/admingui.py000664 001750 001750 00000447335 14064575714 021443 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ import gi import os import webbrowser gi.require_version("Gtk", "3.0") from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib from datetime import timedelta, datetime import re # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.client.interface.dbus.administration import timekprAdminConnector from timekpr.common.constants import messages as msg # constant _NO_TIME_LABEL_SHORT = "--:--" _NO_TIME_LABEL = "--:--:--" _NO_TIME_LIMIT_LABEL = "--:--:--:--" _HOUR_REGEXP = re.compile("^([0-9]{1,2}).*$") _HOUR_MIN_REGEXP = re.compile("^([0-9]{1,2}):([0-9]{1,2}).*$") _DAY_HOUR_MIN_REGEXP = re.compile("^([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}).*$") _DAY_HOUR_MIN_SEC_REGEXP = re.compile("^([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}).*$") class timekprAdminGUI(object): """Main class for supporting timekpr forms""" def __init__(self, pTimekprVersion, pResourcePath, pUsername): """Initialize gui""" # set up base variables self._userName = pUsername self._timekprVersion = pTimekprVersion self._resourcePath = pResourcePath self._timekprAdminConnector = None self._isConnected = False self._ROWCOL_OK = "#FFFFFF" self._ROWSTYLE_OK = False self._ROWCOL_NOK = "Yellow" self._ROWSTYLE_NOK = True # ## forms builders ## # init config builder self._timekprAdminFormBuilder = Gtk.Builder() # get our dialog self._timekprAdminFormBuilder.add_from_file(os.path.join(self._resourcePath, "admin.glade")) # connect signals, so they get executed self._timekprAdminFormBuilder.connect_signals(self) # get window self._timekprAdminForm = self._timekprAdminFormBuilder.get_object("TimekprApplicationWindow") # set up GUI elements self.initGUIElements() # initialize internal stuff self.initInternalConfiguration() # disable all user config buttons firstly self.toggleUserConfigControls(False) # disable all timekpr config buttons firstly self.toggleTimekprConfigControls(False) # status self.setTimekprStatus(True, msg.getTranslation("TK_MSG_STATUS_STARTED")) # initialize internal stuff GLib.timeout_add_seconds(0.1, self.initTimekprAdmin) # periodic log flusher GLib.timeout_add_seconds(cons.TK_POLLTIME, self.autoFlushLogFile) # loop self._mainLoop = GLib.MainLoop() # --------------- initialization / helper methods --------------- # def startAdminGUI(self): """Start up main loop""" # show up all self._timekprAdminForm.show() # this seems to be needed self.dummyPageChanger() # start main loop self._mainLoop.run() def finishTimekpr(self, signal=None, frame=None): """Exit timekpr gracefully""" log.log(cons.TK_LOG_LEVEL_INFO, "Finishing up") # exit main loop self._mainLoop.quit() log.log(cons.TK_LOG_LEVEL_INFO, "Finished") log.flushLogFile() def autoFlushLogFile(self): """Periodically save file""" log.autoFlushLogFile() return True def dummyPageChanger(self): """Switch tabs back and forth""" # change pages (so objects get initialized, w/o this, spin butons don't get values when set :O) for rIdx in (1, 0): self._timekprAdminFormBuilder.get_object("TimekprMainTabBar").set_current_page(rIdx) for rIdx in (1, 2, 0): self._timekprAdminFormBuilder.get_object("TimekprConfigurationTabBar").set_current_page(rIdx) # init timekpr admin client def initTimekprAdmin(self): """Initialize admin client""" # get our connector self._timekprAdminConnector = timekprAdminConnector() # connect GLib.timeout_add_seconds(0, self._timekprAdminConnector.initTimekprConnection, False) # check connection GLib.timeout_add_seconds(0.1, self.checkConnection) # user calculated info retriever GLib.timeout_add_seconds(cons.TK_SAVE_INTERVAL, self.retrieveUserInfoAndConfig, None, cons.TK_CL_INF_SAVED) # user "realtime" info retriever GLib.timeout_add_seconds(cons.TK_POLLTIME, self.retrieveUserInfoAndConfig, None, cons.TK_CL_INF_RT) def checkConnection(self): """Check connection on the fly""" # connection statuses interfacesOk, connecting = self._timekprAdminConnector.isConnected() # if not connected, give up and get out if interfacesOk and connecting: # status self.setTimekprStatus(True, msg.getTranslation("TK_MSG_STATUS_CONNECTED")) # in case we are connected, do not retrieve config again if not self._isConnected: # connected self._isConnected = True # get users GLib.timeout_add_seconds(0, self.getAdminUserList) GLib.timeout_add_seconds(0.1, self.retrieveTimekprConfig) elif not interfacesOk and connecting: # status self.setTimekprStatus(True, msg.getTranslation("TK_MSG_STATUS_CONNECTING")) # invoke again GLib.timeout_add_seconds(1, self.checkConnection) # not connected self._isConnected = False else: # status self.setTimekprStatus(True, msg.getTranslation("TK_MSG_STATUS_CONNECTION_FAILED")) self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_CONNECTION_ACCESS_DENIED")) # not connected self._isConnected = False def initGUIElements(self): """Initialize all GUI elements for stores""" # ## tracked session types ## rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_TRACKED_SESSIONS_PHLD_LABEL")) rend.connect("edited", self.timekprTrackedSessionsEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_TRACKED_SESSIONS_LABEL"), rend, text=0) col.set_min_width(125) self._timekprAdminFormBuilder.get_object("TimekprTrackingSessionsTreeView").append_column(col) # clear self._timekprAdminFormBuilder.get_object("TimekprTrackingSessionsLS").clear() # ## excluded session types ## rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_UNTRACKED_SESSIONS_PHLD_LABEL")) rend.connect("edited", self.timekprExcludedSessionsEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_UNTRACKED_SESSIONS_LABEL"), rend, text=0) col.set_min_width(125) self._timekprAdminFormBuilder.get_object("TimekprExcludedSessionsTreeView").append_column(col) # clear self._timekprAdminFormBuilder.get_object("TimekprExcludedSessionsLS").clear() # ## excluded users ## rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_EXCLUDED_USERS_PHLD_LABEL")) rend.connect("edited", self.timekprExcludedUsersEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_EXCLUDED_USERS_LABEL"), rend, text=0) col.set_min_width(125) self._timekprAdminFormBuilder.get_object("TimekprExcludedUsersTreeView").append_column(col) # clear self._timekprAdminFormBuilder.get_object("TimekprExcludedUsersLS").clear() # ## days ## # day name col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_DAY_LIST_DAY_LABEL"), Gtk.CellRendererText(), text=1) col.set_min_width(115) self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").append_column(col) # day enabled rend = Gtk.CellRendererToggle() rend.connect("toggled", self.dayAvailabilityChanged) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_DAY_LIST_ENABLED_LABEL"), rend, active=2) col.set_min_width(35) self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").append_column(col) # limit rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.connect("edited", self.userLimitsDailyLimitsEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_DAY_LIST_LIMIT_LABEL"), rend, text=4) col.set_min_width(60) self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").append_column(col) # final col col = Gtk.TreeViewColumn("", Gtk.CellRendererText()) col.set_min_width(20) self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").append_column(col) # ## intervals ## # from hour rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_DAY_INTERVALS_FROM_PHLD_LABEL")) rend.connect("edited", self.userLimitsHourFromEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_DAY_INTERVALS_FROM_LABEL"), rend, text=1, background=6, underline=7) col.set_min_width(62) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").append_column(col) # to hour rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_DAY_INTERVALS_TO_PHLD_LABEL")) rend.connect("edited", self.userLimitsHourToEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_DAY_INTERVALS_TO_LABEL"), rend, text=2, background=6, underline=7) col.set_min_width(62) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").append_column(col) # unaccountable interval column rend = Gtk.CellRendererToggle() rend.connect("toggled", self.userLimitsHourUnaccountableToggled) col = Gtk.TreeViewColumn("∞", rend, active=8) col.set_property("alignment", 0.5) col.set_min_width(20) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").append_column(col) # final col col = Gtk.TreeViewColumn("", Gtk.CellRendererText()) col.set_min_width(20) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").append_column(col) # clear out existing intervals self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS").clear() # lets prepare week days for rDay in range(1, 7+1): # fill in the intervals self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS").append([str(rDay), (cons.TK_DATETIME_START + timedelta(days=rDay-1)).strftime("%A"), False, 0, _NO_TIME_LABEL]) # ## weekly / monthly limits ## # type col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_WK_MON_LABEL"), Gtk.CellRendererText(), text=1) col.set_min_width(90) self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsTreeView").append_column(col) # weekly/monthly limit rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.connect("edited", self.userLimitsWeeklyLimitsEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_WK_MON_LIMIT_LABEL"), rend, text=3) col.set_min_width(95) self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsTreeView").append_column(col) # final col col = Gtk.TreeViewColumn("", Gtk.CellRendererText()) col.set_min_width(20) self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsTreeView").append_column(col) # clear out existing intervals self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsLS").clear() # lets prepare week days for rType in (("WK", msg.getTranslation("TK_MSG_WEEKLY_LABEL")), ("MON", msg.getTranslation("TK_MSG_MONTHLY_LABEL"))): # fill in the intervals self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsLS").append([rType[0], rType[1], 0, _NO_TIME_LIMIT_LABEL]) # ## PlayTime elements ## # day name col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_DAY_LIST_DAY_LABEL"), Gtk.CellRendererText(), text=1) col.set_min_width(115) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsTreeView").append_column(col) # day enabled rend = Gtk.CellRendererToggle() rend.connect("toggled", self.dayPlayTimeAvailabilityChanged) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_DAY_LIST_ENABLED_LABEL"), rend, active=2) col.set_min_width(35) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsTreeView").append_column(col) # limit rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.connect("edited", self.userLimitsDailyPlayTimeLimitsEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_DAY_LIST_LIMIT_LABEL"), rend, text=4) col.set_min_width(60) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsTreeView").append_column(col) # final col col = Gtk.TreeViewColumn("", Gtk.CellRendererText()) col.set_min_width(20) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsTreeView").append_column(col) # PT activity mask rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_PLAYTIME_ACTIVITY_MASK_PHLD_LABEL")) rend.connect("edited", self.playTimeActivityMaskEntryEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_PLAYTIME_ACTIVITY_MASK_LABEL"), rend, text=1) col.set_min_width(90) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesTreeView").append_column(col) # PT activity name rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_PLAYTIME_ACTIVITY_DESCRIPTION_PHLD_LABEL")) rend.connect("edited", self.playTimeActivityDescriptionEntryEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_PLAYTIME_ACTIVITY_DESCRIPTION_LABEL"), rend, text=2) col.set_min_width(120) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesTreeView").append_column(col) # lets prepare week days for PlayTime for rDay in range(1, 7+1): # fill in the intervals self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS").append([str(rDay), (cons.TK_DATETIME_START + timedelta(days=rDay-1)).strftime("%A"), False, 0, _NO_TIME_LABEL]) # --------------- GUI control methods --------------- # def initInternalConfiguration(self): """Initialize the internal configuration for admin form""" self._timekprUserConfigControlElements = [ # combo "TimekprUserSelectionCB", # combom refresh "TimekprUserSelectionRefreshBT", # control buttons "TimekprUserConfDaySettingsApplyBT", "TimekprUserConfTodaySettingsSetAddBT", "TimekprUserConfTodaySettingsSetSubractBT", "TimekprUserConfTodaySettingsSetSetBT", "TimekprUserPlayTimeProcessesAdjustmentAddBT", "TimekprUserPlayTimeProcessesAdjustmentRemoveBT", "TimekprUserPlayTimeProcessesApplyBT", "TimekprUserConfDaySettingsSetDaysIntervalsVerifyBT", "TimekprUserConfAddOptsApplyBT", # check box "TimekprUserConfTodaySettingsTrackInactiveCB", "TimekprUserConfTodaySettingsHideTrayIconCB", "TimekprUserPlayTimeEnableCB", "TimekprUserPlayTimeOverrideEnableCB", "TimekprUserPlayTimeUnaccountedIntervalsEnabledCB", # spin buttons for adjustments "TimekprUserConfTodaySettingsSetMinSB", "TimekprUserConfTodaySettingsSetHrSB", "TimekprUserConfAddOptsLockoutTypeSuspendWakeFromSB", "TimekprUserConfAddOptsLockoutTypeSuspendWakeToSB", # lists "TimekprWeekDaysTreeView", "TimekprHourIntervalsTreeView", "TimekprUserConfWkMonLimitsTreeView", "TimekprUserPlayTimeLimitsTreeView", "TimekprUserPlayTimeProcessesTreeView", # radio / control groups "TimekprUserConfDaySettingsSetDaysHeaderControlBX", "TimekprUserConfDaySettingsSetDaysIntervalsControlBX", "TimekprUserConfWkMonLimitsAdjustmentsBX", "TimekprUserConfWkMonLimitsAdjustmentControlButtonsBX", "TimekprUserPlayTimeLimitsHeaderControlBX", "TimekprUserConfAddOptsLockoutTypeChoiceBoxBX", "TimekprUserConfTodaySettingsChoiceBX" ] self._timekprConfigControlElements = [ # control buttons "TimekprConfigurationApplyBT", # check boxes "TimekprPlayTimeEnableGlobalCB", "TimekprPlayTimeEnhancedActivityMonitorCB", # spin buttons for adjustments "TimekprConfigurationLoglevelSB", "TimekprConfigurationWarningTimeSB", "TimekprConfigurationPollIntervalSB", "TimekprConfigurationSaveTimeSB", "TimekprConfigurationTerminationTimeSB", "TimekprConfigurationFinalNotificationSB", # lists "TimekprTrackingSessionsTreeView", "TimekprExcludedSessionsTreeView", "TimekprExcludedUsersTreeView", # radio / control groups "TimekprTrackingSessionsButtonControlBX", "TimekprExcludedSessionsButtonControlBX", "TimekprExcludedUsersButtonControlBX" ] # sets up limit variables for user configuration (internal config to compare to) self._tkSavedCfg = {} self._tkSavedCfg["timeTrackInactive"] = False self._tkSavedCfg["timeHideTrayIcon"] = False self._tkSavedCfg["timeLockoutType"] = cons.TK_CTRL_RES_T self._tkSavedCfg["timeWakeInterval"] = "0;23" self._tkSavedCfg["timeLimitWeek"] = 0 self._tkSavedCfg["timeLimitMonth"] = 0 self._tkSavedCfg["timeLimitDays"] = [] self._tkSavedCfg["timeLimitDaysLimits"] = [] self._tkSavedCfg["timeLimitDaysHoursActual"] = {} self._tkSavedCfg["timeLimitDaysHoursSaved"] = {} # initial config for rDay in range(1, 7+1): self._tkSavedCfg["timeLimitDaysHoursActual"][str(rDay)] = {} for rHour in range(0, 23+1): self._tkSavedCfg["timeLimitDaysHoursActual"][str(rDay)][str(rHour)] = {cons.TK_CTRL_SMIN: 0, cons.TK_CTRL_EMIN: cons.TK_LIMIT_PER_MINUTE, cons.TK_CTRL_UACC: True} # saved means from server, actual means modified in form self._tkSavedCfg["timeLimitDaysHoursSaved"] = self._tkSavedCfg["timeLimitDaysHoursActual"].copy() # ## set up PlayTime variables ## self._tkSavedCfg["playTimeEnabled"] = False self._tkSavedCfg["playTimeOverrideEnabled"] = False self._tkSavedCfg["playTimeUnaccountedIntervalsEnabled"] = False self._tkSavedCfg["playTimeLimitDays"] = [] self._tkSavedCfg["playTimeLimitDaysLimits"] = [] self._tkSavedCfg["playTimeActivities"] = [] # sets up limit variables for timekpr configuration self._tkSavedCfg["timekprWarningTime"] = 0 self._tkSavedCfg["timekprNotificationTime"] = 0 self._tkSavedCfg["timekprPollingInterval"] = 0 self._tkSavedCfg["timekprSaveTime"] = 0 self._tkSavedCfg["timekprTerminationTime"] = 0 self._tkSavedCfg["timekprLogLevel"] = 0 self._tkSavedCfg["timekprTrackingSessions"] = [] self._tkSavedCfg["timekprExcludedSessions"] = [] self._tkSavedCfg["timekprExcludedUsers"] = [] self._tkSavedCfg["timekprPlayTimeEnabled"] = False self._tkSavedCfg["timekprPlayTimeEnhancedActivityMonitorEnabled"] = False def clearAdminForm(self): """Clear and default everything to default values""" # ## clear form ## # time limits for rCtrl in ("TimekprUserConfTodayInfoSpentTodayLB", "TimekprUserConfTodayInfoSpentWeekLB", "TimekprUserConfTodayInfoSpentMonthLB", "TimekprUserConfTodayInfoLeftTodayLB", "TimekprUserConfTodayInfoLeftContLB", "TimekprUserConfTodayInfoInactiveLB" ): self._timekprAdminFormBuilder.get_object(rCtrl).set_text(_NO_TIME_LIMIT_LABEL) # check / radio boxes for rCtrl in ("TimekprUserConfTodaySettingsTrackInactiveCB", "TimekprUserConfTodaySettingsHideTrayIconCB"): self._timekprAdminFormBuilder.get_object(rCtrl).set_active(False) # days / labels for rDay in self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS"): # clear list store rDay[2] = False rDay[3] = 0 rDay[4] = _NO_TIME_LABEL # clear day config for rHour in range(0, 23+1): self._tkSavedCfg["timeLimitDaysHoursActual"][rDay[0]][str(rHour)] = {cons.TK_CTRL_SMIN: 0, cons.TK_CTRL_EMIN: cons.TK_LIMIT_PER_MINUTE, cons.TK_CTRL_UACC: False} # clear up the intervals self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").clear() # week / month limits for rWkMon in self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsLS"): # clear list store rWkMon[2] = 0 rWkMon[3] = _NO_TIME_LIMIT_LABEL # clear day config self._tkSavedCfg["timeLimitWeek"] = 0 self._tkSavedCfg["timeLimitMonth"] = 0 # hide lockout intervals self.controlSelectedLockoutTypeHourIntervals(None) # reset lockout too self._tkSavedCfg["timeLockoutType"] = cons.TK_CTRL_RES_T self._tkSavedCfg["timeWakeInterval"] = "0;23" self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeFromSB").set_value(0) self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeToSB").set_value(23) # set default lockout type self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeTerminate").set_active(True) # ## PlayTIme reset ## # reset times left for rCtrl in ("TimekprUserPlayTimeLeftActualLB", "TimekprUserPlayTimeLeftSavedLB", "TimekprUserPlayTimeSpentLB"): self._timekprAdminFormBuilder.get_object(rCtrl).set_text(_NO_TIME_LABEL) # reset activity count self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeTodaySettingsActivityCntLB").set_text("---") # reset day limits for rDay in range(1, 7+1): # clear list store self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS")[rDay-1][2] = False self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS")[rDay-1][3] = 0 self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS")[rDay-1][4] = _NO_TIME_LABEL_SHORT # clear activities and add one placeholder self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS").clear() # CB not checked for rCtrl in ("TimekprUserPlayTimeEnableCB", "TimekprUserPlayTimeOverrideEnableCB", "TimekprUserPlayTimeUnaccountedIntervalsEnabledCB"): self._timekprAdminFormBuilder.get_object(rCtrl).set_active(False) # --------------- DEV test methods --------------- # def initDEVDefaultConfig(self): """Initialize GUI elements for DEV mode""" # DEV if cons.TK_DEV_ACTIVE and 1 == 2: # if there is date, no need to add one if len(self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS")) == 0: # standard time intervals self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").append([0, "08:00", "13:00", "1", 0, 0, self._ROWCOL_NOK, self._ROWSTYLE_NOK]) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").append([0, "15:00", "18:00", "1", 0, 0, self._ROWCOL_OK, self._ROWSTYLE_OK]) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").append([0, "18:30", "22:00", "1", 0, 0, self._ROWCOL_OK, self._ROWSTYLE_OK]) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").append([0, "22:30", "23:00", "1", 0, 0, self._ROWCOL_NOK, self._ROWSTYLE_NOK]) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").set_sensitive(True) # if there is date, no need to add one if len(self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS")) == 0: # PlayTime activities self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS").append(["1", "mask", "Doom Eternal"]) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS").append(["2", "mask.*", "The Talos Principle"]) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS").append(["3", "mask.*", "Mafia remastered"]) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS").append(["4", "csgo_linux", "CS: GO"]) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS").append(["5", "kca.*c", "Stupid calculator"]) # enable certain functionality if 1 == 1: # enable certain objects (fot testing) for rO in ("TimekprUserPlayTimeProcessesAdjustmentAddBT", "TimekprUserPlayTimeProcessesAdjustmentRemoveBT", "TimekprUserPlayTimeLimitsTreeView", "TimekprUserPlayTimeProcessesTreeView" ): self._timekprAdminFormBuilder.get_object(rO).set_sensitive(True) # false return False # --------------- control / helper methods --------------- # def getSelectedUserName(self): """Get selected username""" # result userName = None # is admin app connected to server if self._isConnected: # get object userCombobox = self._timekprAdminFormBuilder.get_object("TimekprUserSelectionCB") # get chosen index, model and actual id of the item userIdx = userCombobox.get_active() userModel = userCombobox.get_model() # only if we have selection if userIdx is not None and userModel is not None: # only if selected if userIdx >= 0: # get username userName = userModel[userIdx][0] # result return userName def toggleUserConfigControls(self, pEnable=True, pLeaveUserList=False): """Enable or disable all user controls for the form""" # if disable if not pEnable: self.clearAdminForm() # apply settings to all buttons`in user configuration for rObj in self._timekprUserConfigControlElements: # if we need to leave user selection intact if not (pLeaveUserList and rObj == "TimekprUserSelectionCB"): # get the button and set availability self._timekprAdminFormBuilder.get_object(rObj).set_sensitive(pEnable) # DEV / samples too self.initDEVDefaultConfig() def toggleTimekprConfigControls(self, pEnable=True): """Enable or disable all timekpr controls for the form""" # enable for timekpr main config can be done only in admin mode enable = pEnable and (os.geteuid() == 0 or cons.TK_DEV_ACTIVE) # apply settings to all buttons`in user configuration for rButton in self._timekprConfigControlElements: # get the button and set availability self._timekprAdminFormBuilder.get_object(rButton).set_sensitive(enable) def setTimekprStatus(self, pConnectionStatus, pStatus): """Change status of timekpr admin client""" if pStatus is not None: # connection if pConnectionStatus: # get main status statusBar = self._timekprAdminFormBuilder.get_object("TimekprConnectionStatusbar") else: # get message status statusBar = self._timekprAdminFormBuilder.get_object("TimekprMessagesStatusbar") # get context contextId = statusBar.get_context_id("status") # pop existing message and add new one statusBar.remove_all(contextId) statusBar.push(contextId, pStatus[:80]) def normalizeAllowedDaysAndLimits(self): """Method will normalize aloowed days and limits, in case user sets them differently""" # get the least of size limitLen = min(len(self._tkSavedCfg["timeLimitDays"]), len(self._tkSavedCfg["timeLimitDaysLimits"])) # remove excess elements for rElem in ("timeLimitDays", "timeLimitDaysLimits"): for i in range(limitLen, len(self._tkSavedCfg[rElem])): self._tkSavedCfg[rElem].pop() # get the least of size limitLen = min(len(self._tkSavedCfg["playTimeLimitDays"]), len(self._tkSavedCfg["playTimeLimitDaysLimits"])) # remove excess elements for rElem in ("playTimeLimitDays", "playTimeLimitDaysLimits"): for i in range(limitLen, len(self._tkSavedCfg[rElem])): self._tkSavedCfg[rElem].pop() # --------------- format helper methods --------------- # def formatTimeStr(self, pTotalSeconds, pFormatSecs=False, pFormatDays=False): """Format the time intervals as string label""" # get time out of seconds time = cons.TK_DATETIME_START + timedelta(seconds=pTotalSeconds) # day format isDayFmt = (pTotalSeconds >= cons.TK_LIMIT_PER_DAY and not pFormatDays) # limit limitDay = "%s:" % (str((time - cons.TK_DATETIME_START).days).rjust(2, "0")) if pFormatDays else "" limitHr = "%s" % (str(24 if isDayFmt else time.hour).rjust(2, "0")) limitMin = ":%s" % (str(0 if isDayFmt else time.minute).rjust(2, "0")) limitSec = ":%s" % (str(0 if isDayFmt else time.second).rjust(2, "0")) if pFormatSecs else "" limit = "%s%s%s%s" % (limitDay, limitHr, limitMin, limitSec) # value return limit def getIntervalList(self, pDay): """Get intervals for use in GUI""" # init hours for intervals timeLimits = [] startTimeStr = None endTimeStr = None startSeconds = None endSeconds = None uaccValue = None uaccChanged = False # loop through all days for rHour in range(0, 23+1): # hour in str hourStr = str(rHour) # we process only hours that are available if hourStr in self._tkSavedCfg["timeLimitDaysHoursActual"][pDay]: # no value (interval was changed) uaccValue = self._tkSavedCfg["timeLimitDaysHoursActual"][pDay][hourStr][cons.TK_CTRL_UACC] if uaccValue is None else uaccValue # calc uacc changes uaccChanged = self._tkSavedCfg["timeLimitDaysHoursActual"][pDay][hourStr][cons.TK_CTRL_UACC] != uaccValue # if interval is complete and next hour is not available or there is not a continous interval (start != 0 or unaccounted changed, so it's different) if startTimeStr is not None and endTimeStr is not None: if (hourStr not in self._tkSavedCfg["timeLimitDaysHoursActual"][pDay] or (hourStr in self._tkSavedCfg["timeLimitDaysHoursActual"][pDay] and (self._tkSavedCfg["timeLimitDaysHoursActual"][pDay][hourStr][cons.TK_CTRL_SMIN] != 0 or uaccChanged is True)) ): # add new limit interval timeLimits.append([startTimeStr, endTimeStr, startSeconds, endSeconds, uaccValue]) # erase values startTimeStr = None endTimeStr = None uaccValue = None uaccChanged = False # we process only hours that are available if hourStr in self._tkSavedCfg["timeLimitDaysHoursActual"][pDay]: # uacc value uaccValue = self._tkSavedCfg["timeLimitDaysHoursActual"][pDay][hourStr][cons.TK_CTRL_UACC] # if start hour is not yet defined if startTimeStr is None: # first avaiable hour startSeconds = rHour * cons.TK_LIMIT_PER_HOUR + self._tkSavedCfg["timeLimitDaysHoursActual"][pDay][hourStr][cons.TK_CTRL_SMIN] * cons.TK_LIMIT_PER_MINUTE startTimeStr = self.formatTimeStr(startSeconds) # define end hour endDate = cons.TK_DATETIME_START + timedelta(hours=rHour, minutes=self._tkSavedCfg["timeLimitDaysHoursActual"][str(pDay)][hourStr][cons.TK_CTRL_EMIN]) endSeconds = (endDate - cons.TK_DATETIME_START).total_seconds() endTimeStr = self.formatTimeStr(endSeconds) # if current interval changes (process end of interval) or this is it, no more hours if self._tkSavedCfg["timeLimitDaysHoursActual"][pDay][hourStr][cons.TK_CTRL_EMIN] != cons.TK_LIMIT_PER_MINUTE or rHour == 23: # add new limit interval timeLimits.append([startTimeStr, endTimeStr, startSeconds, endSeconds, uaccValue]) # erase values startTimeStr = None endTimeStr = None uaccValue = None uaccChanged = False # return intervals return timeLimits # --------------- field value helper methods --------------- # def getSelectedDays(self): """Get selected day from day list""" # get selected rows for i in range(0, 2): # get selected rows (tm, paths) = self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").get_selection().get_selected_rows() # if nothing is selected, set first selected row (if there is nothing, no row is active) sel = paths is not None sel = len(paths) > 0 if sel else sel # nothing selected if not sel: # set self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").set_cursor(0) else: break # dict of id and nr of day days = [] # only if there is smth selected if paths is not None: # idx for path in paths: # get iter and values ti = tm.get_iter(path) days.append({"idx": tm.get_path(ti)[0], "nr": str(tm.get_value(ti, 0))}) # return return days def getSelectedHourInterval(self): """Get selected hour interval from hour interval list""" # refresh the child for i in range(0, 2): # get selection (tm, ti) = self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").get_selection().get_selected() # if nothing is selected, get first selected row (if there is nothing, no row is active) if ti is None: # set self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").set_cursor(0) else: break # only if there is smth selected if ti is not None: # idx intervalIdx = tm.get_path(ti)[0] intervalDayNr = str(tm.get_value(ti, 3)) else: # nothing intervalIdx = None intervalDayNr = None # return return intervalIdx, intervalDayNr def getSelectedConfigElement(self, pElementName): """Get selected config element""" # refresh the child (tm, ti) = self._timekprAdminFormBuilder.get_object(pElementName).get_selection().get_selected() # return return tm.get_path(ti)[0] if ti is not None else None def sortHourIntervals(self): """Sort hour intervals for ease of use""" # sort vairables hours = {} rIdx = 0 # prepare sort for rIt in self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS"): hours[rIt[4]] = rIdx # count further rIdx += 1 # set sort order sortedHours = [] # set up proper order for rKey in sorted(hours): # append to order sortedHours.append(hours[rKey]) # reorder rows in liststore self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").reorder(sortedHours) # --------------- additional configuration methods --------------- # def getSelectedLockoutType(self): """Get selected restriction / lockout type""" # get lockout type lockoutType = None lockoutType = cons.TK_CTRL_RES_T if lockoutType is None and self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeTerminate").get_active() else lockoutType lockoutType = cons.TK_CTRL_RES_D if lockoutType is None and self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeShutdown").get_active() else lockoutType lockoutType = cons.TK_CTRL_RES_S if lockoutType is None and self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspend").get_active() else lockoutType lockoutType = cons.TK_CTRL_RES_W if lockoutType is None and self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWake").get_active() else lockoutType lockoutType = cons.TK_CTRL_RES_L if lockoutType is None and self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeLock").get_active() else lockoutType # result return lockoutType def setSelectedLockoutType(self, pLockoutType): """Get selected restriction / lockout type""" # set lockout type if pLockoutType == cons.TK_CTRL_RES_T: self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeTerminate").set_active(True) elif pLockoutType == cons.TK_CTRL_RES_D: self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeShutdown").set_active(True) elif pLockoutType == cons.TK_CTRL_RES_S: self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspend").set_active(True) elif pLockoutType == cons.TK_CTRL_RES_W: self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWake").set_active(True) elif pLockoutType == cons.TK_CTRL_RES_L: self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeLock").set_active(True) def controlSelectedLockoutTypeHourIntervals(self, pInterval): """Set selected hour intervals""" # if no interval, just hide them if pInterval is not None: # get split interval hrInterval = pInterval.split(";") # set values self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeFromSB").set_value(int(hrInterval[0])) self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeToSB").set_value(int(hrInterval[1])) # set hours visible only when suspendwake self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeWakeupIntervalsLabel").set_visible(pInterval is not None) self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeFromSB").set_visible(pInterval is not None) self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeToSB").set_visible(pInterval is not None) self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeFromSB").set_sensitive(pInterval is not None) self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeToSB").set_sensitive(pInterval is not None) def enableTimeControlToday(self, pEnable=True): """Enable buttons to add time and PlayTime today""" for rCtrl in ("TimekprUserConfTodaySettingsSetHrSB", "TimekprUserConfTodaySettingsSetMinSB", "TimekprUserConfTodaySettingsChoiceBX" ): self._timekprAdminFormBuilder.get_object(rCtrl).set_sensitive(pEnable) # --------------- info retrieval methods --------------- # def getAdminUserList(self): """Get user list via dbus""" # store userStore = self._timekprAdminFormBuilder.get_object("TimekprUserSelectionLS") # clear up userStore.clear() userStore.append(["", ""]) # def len widthInChars = 15 # get list result, message, userList = self._timekprAdminConnector.getUserList() # all ok if result == 0: # loop and print for rUser in userList: # name userName = "%s (%s)" % (rUser[0], rUser[1]) if (rUser[1] is not None and rUser[1] != "") else rUser[0] # determine maxlen widthInChars = max(widthInChars, len(userName) - 3) # add user userStore.append([rUser[0], userName]) # status self.setTimekprStatus(False, "User list retrieved") # enable self._timekprAdminFormBuilder.get_object("TimekprUserSelectionCB").set_sensitive(True) self._timekprAdminFormBuilder.get_object("TimekprUserSelectionRefreshBT").set_sensitive(self._timekprAdminFormBuilder.get_object("TimekprUserSelectionCB").get_sensitive()) # adjust widht self._timekprAdminFormBuilder.get_object("TimekprUserSelectionCBEntry").set_width_chars(widthInChars) # init first selection self._timekprAdminFormBuilder.get_object("TimekprUserSelectionCB").set_active(0) else: # status self.setTimekprStatus(False, message) # check the connection self.checkConnection() def retrieveTimekprConfig(self): """Retrieve timekpr configuration""" # init timekprConfig = {} result = 0 message = "" # get list result, message, timekprConfig = self._timekprAdminConnector.getTimekprConfiguration() # all ok if result == 0: # loop and print for rKey, rValue in timekprConfig.items(): # check all by keys if rKey == "TIMEKPR_LOGLEVEL": # log level self._tkSavedCfg["timekprLogLevel"] = int(rValue) elif rKey == "TIMEKPR_POLLTIME": # poll time self._tkSavedCfg["timekprPollingInterval"] = int(rValue) elif rKey == "TIMEKPR_SAVE_TIME": # save time self._tkSavedCfg["timekprSaveTime"] = int(rValue) elif rKey == "TIMEKPR_TERMINATION_TIME": # termination time self._tkSavedCfg["timekprTerminationTime"] = int(rValue) elif rKey == "TIMEKPR_FINAL_WARNING_TIME": # final warning time self._tkSavedCfg["timekprWarningTime"] = int(rValue) elif rKey == "TIMEKPR_FINAL_NOTIFICATION_TIME": # final notification time self._tkSavedCfg["timekprNotificationTime"] = int(rValue) elif rKey == "TIMEKPR_SESSION_TYPES_CTRL": # init self._tkSavedCfg["timekprTrackingSessions"] = [] # loop through available session types for rSessionType in rValue: # add config self._tkSavedCfg["timekprTrackingSessions"].append(str(rSessionType)) elif rKey == "TIMEKPR_SESSION_TYPES_EXCL": # init self._tkSavedCfg["timekprExcludedSessions"] = [] # loop through available session types for rSessionType in rValue: # add config self._tkSavedCfg["timekprExcludedSessions"].append(str(rSessionType)) elif rKey == "TIMEKPR_USERS_EXCL": # init self._tkSavedCfg["timekprExcludedUsers"] = [] # loop through available users for rUser in rValue: # add config self._tkSavedCfg["timekprExcludedUsers"].append(str(rUser)) elif rKey == "TIMEKPR_PLAYTIME_ENABLED": # PlayTime enabled self._tkSavedCfg["timekprPlayTimeEnabled"] = bool(rValue) elif rKey == "TIMEKPR_PLAYTIME_ENHANCED_ACTIVITY_MONITOR_ENABLED": # PlayTime enhanced activity monitor enabled self._tkSavedCfg["timekprPlayTimeEnhancedActivityMonitorEnabled"] = bool(rValue) # apply config self.applyTimekprConfig() # determine control state self.calculateTimekprConfigControlAvailability() # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_CONFIG_RETRIEVED")) else: # disable all but choser self.toggleUserConfigControls(False, True) # status self.setTimekprStatus(False, message) # check the connection self.checkConnection() def retrieveUserInfoAndConfig(self, pUserName, pInfoLvl): """Retrieve user configuration""" # clear before user if pInfoLvl == cons.TK_CL_INF_FULL: # reset form self.clearAdminForm() # no username passed, we try to find one userName = self.getSelectedUserName() if pUserName is None else pUserName # if nothing is passed, nothing is done if userName is not None and userName != "": # init userConfig = {} # get list result, message, userConfig = self._timekprAdminConnector.getUserConfigurationAndInformation(userName, pInfoLvl) # all ok if result == 0: # reset if full info or realtime requested if pInfoLvl in (cons.TK_CL_INF_FULL, cons.TK_CL_INF_RT): # reset optional information labels for rCtrl in ("TimekprUserConfTodayInfoLeftContLB", "TimekprUserConfTodayInfoInactiveLB"): self._timekprAdminFormBuilder.get_object(rCtrl).set_text(_NO_TIME_LIMIT_LABEL) # reset optional information labels for PlayTime self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLeftActualLB").set_text(_NO_TIME_LABEL) # reset activity count self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeTodaySettingsActivityCntLB").set_text("---") # loop and print for rKey, rValue in userConfig.items(): # these ar saved values, refresh of saved or full is asked if pInfoLvl in (cons.TK_CL_INF_FULL, cons.TK_CL_INF_SAVED): # this info is refreshed regularly (based on config keys) if rKey == "TIME_SPENT_DAY": # spent timeSpent = cons.TK_DATETIME_START + timedelta(seconds=abs(rValue)) timeSpentStr = "%s:%s:%s:%s" % (str((timeSpent - cons.TK_DATETIME_START).days).rjust(2, "0"), str(timeSpent.hour).rjust(2, "0") , str(timeSpent.minute).rjust(2, "0"), str(timeSpent.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserConfTodayInfoSpentTodayLB").set_text(timeSpentStr) elif rKey == "TIME_SPENT_WEEK": # spent week timeSpentWeek = cons.TK_DATETIME_START + timedelta(seconds=rValue) timeSpentWeekStr = "%s:%s:%s:%s" % (str((timeSpentWeek - cons.TK_DATETIME_START).days).rjust(2, "0"), str(timeSpentWeek.hour).rjust(2, "0"), str(timeSpentWeek.minute).rjust(2, "0"), str(timeSpentWeek.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserConfTodayInfoSpentWeekLB").set_text(timeSpentWeekStr) elif rKey == "TIME_SPENT_MONTH": # spent month timeSpentMonth = cons.TK_DATETIME_START + timedelta(seconds=rValue) timeSpentMonthStr = "%s:%s:%s:%s" % (str((timeSpentMonth - cons.TK_DATETIME_START).days).rjust(2, "0"), str(timeSpentMonth.hour).rjust(2, "0"), str(timeSpentMonth.minute).rjust(2, "0"), str(timeSpentMonth.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserConfTodayInfoSpentMonthLB").set_text(timeSpentMonthStr) # show balance elif rKey == "TIME_LEFT_DAY": # balance timeLeft = cons.TK_DATETIME_START + timedelta(seconds=rValue) timeLeftStr = "%s:%s:%s:%s" % (str((timeLeft - cons.TK_DATETIME_START).days).rjust(2, "0"), str(timeLeft.hour).rjust(2, "0"), str(timeLeft.minute).rjust(2, "0"), str(timeLeft.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserConfTodayInfoLeftTodayLB").set_text(timeLeftStr) # show saved PlayTime left elif rKey == "PLAYTIME_LEFT_DAY": # PlayTime left timeLeft = cons.TK_DATETIME_START + timedelta(seconds=rValue) timeLeftStr = "%s:%s:%s" % (str(timeLeft.hour).rjust(2, "0") , str(timeLeft.minute).rjust(2, "0"), str(timeLeft.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLeftSavedLB").set_text(timeLeftStr) # show actual PlayTime left elif rKey == "PLAYTIME_SPENT_DAY": # PlayTime left timeLeft = cons.TK_DATETIME_START + timedelta(seconds=rValue) timeLeftStr = "%s:%s:%s" % (str(timeLeft.hour).rjust(2, "0") , str(timeLeft.minute).rjust(2, "0"), str(timeLeft.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeSpentLB").set_text(timeLeftStr) # refresh only if full or realtime asked if pInfoLvl in (cons.TK_CL_INF_FULL, cons.TK_CL_INF_RT): # show actual time left for continous use if rKey == "ACTUAL_TIME_LEFT_CONTINUOUS": # total left timeLeft = cons.TK_DATETIME_START + timedelta(seconds=rValue) timeLeftStr = "%s:%s:%s:%s" % (str((timeLeft - cons.TK_DATETIME_START).days).rjust(2, "0"), str(timeLeft.hour).rjust(2, "0"), str(timeLeft.minute).rjust(2, "0"), str(timeLeft.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserConfTodayInfoLeftContLB").set_text(timeLeftStr) # show actual time inactive elif rKey == "ACTUAL_TIME_INACTIVE_SESSION": # total left timeLeft = cons.TK_DATETIME_START + timedelta(seconds=rValue) timeLeftStr = "%s:%s:%s:%s" % (str((timeLeft - cons.TK_DATETIME_START).days).rjust(2, "0"), str(timeLeft.hour).rjust(2, "0"), str(timeLeft.minute).rjust(2, "0"), str(timeLeft.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserConfTodayInfoInactiveLB").set_text(timeLeftStr) # show actual PlayTime left elif rKey == "ACTUAL_PLAYTIME_LEFT_DAY": # PlayTime left timeLeft = cons.TK_DATETIME_START + timedelta(seconds=rValue) timeLeftStr = "%s:%s:%s" % (str(timeLeft.hour).rjust(2, "0") , str(timeLeft.minute).rjust(2, "0"), str(timeLeft.second).rjust(2, "0")) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLeftActualLB").set_text(timeLeftStr) # show actual PlayTime count elif rKey == "ACTUAL_ACTIVE_PLAYTIME_ACTIVITY_COUNT": # PlayTime count self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeTodaySettingsActivityCntLB").set_text(str(rValue)) # info is needed when full refresh requested if pInfoLvl == cons.TK_CL_INF_FULL: if rKey == "TRACK_INACTIVE": # track inactive self._tkSavedCfg["timeTrackInactive"] = bool(rValue) elif rKey == "HIDE_TRAY_ICON": # hide icon and notif self._tkSavedCfg["timeHideTrayIcon"] = bool(rValue) elif rKey == "LOCKOUT_TYPE": # set lockout type self._tkSavedCfg["timeLockoutType"] = rValue elif rKey == "WAKEUP_HOUR_INTERVAL": # set interval values self._tkSavedCfg["timeWakeInterval"] = rValue elif rKey == "ALLOWED_WEEKDAYS": # empty the values self._tkSavedCfg["timeLimitDays"] = [] # allowed weekdays for rDay in rValue: # set values self._tkSavedCfg["timeLimitDays"].append(str(rDay)) elif rKey == "LIMITS_PER_WEEKDAYS": # limits per allowed weekdays self._tkSavedCfg["timeLimitDaysLimits"] = [] # allowed weekdays for rDay in range(0, len(rValue)): # add the value self._tkSavedCfg["timeLimitDaysLimits"].append(int(rValue[rDay])) elif rKey == "LIMIT_PER_WEEK": # value self._tkSavedCfg["timeLimitWeek"] = int(rValue) elif rKey == "LIMIT_PER_MONTH": # value self._tkSavedCfg["timeLimitMonth"] = int(rValue) elif "ALLOWED_HOURS_" in rKey: # determine the day day = rKey[-1:] self._tkSavedCfg["timeLimitDaysHoursActual"][day] = {} # loop through available hours for rHour, rHourMinutes in rValue.items(): # add config self._tkSavedCfg["timeLimitDaysHoursActual"][day][str(rHour)] = {cons.TK_CTRL_SMIN: int(rHourMinutes[cons.TK_CTRL_SMIN]), cons.TK_CTRL_EMIN: int(rHourMinutes[cons.TK_CTRL_EMIN]), cons.TK_CTRL_UACC: bool(rHourMinutes[cons.TK_CTRL_UACC])} # set up saved config as well self._tkSavedCfg["timeLimitDaysHoursSaved"][day] = self._tkSavedCfg["timeLimitDaysHoursActual"][day].copy() # ## PlayTime config ## elif rKey == "PLAYTIME_ENABLED": # PlayTime enabled self._tkSavedCfg["playTimeEnabled"] = bool(rValue) elif rKey == "PLAYTIME_LIMIT_OVERRIDE_ENABLED": # PlayTime override enabled self._tkSavedCfg["playTimeOverrideEnabled"] = bool(rValue) elif rKey == "PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED": # PlayTime allowed during unaccounted intervals self._tkSavedCfg["playTimeUnaccountedIntervalsEnabled"] = bool(rValue) elif rKey == "PLAYTIME_ALLOWED_WEEKDAYS": # empty the values self._tkSavedCfg["playTimeLimitDays"] = [] # allowed weekdays for rDay in rValue: # set values self._tkSavedCfg["playTimeLimitDays"].append(str(rDay)) elif rKey == "PLAYTIME_LIMITS_PER_WEEKDAYS": # limits per allowed weekdays self._tkSavedCfg["playTimeLimitDaysLimits"] = [] # allowed weekdays for rDay in range(0, len(rValue)): # add the value self._tkSavedCfg["playTimeLimitDaysLimits"].append(int(rValue[rDay])) elif rKey == "PLAYTIME_ACTIVITIES": # PlayTime activity list self._tkSavedCfg["playTimeActivities"] = [] # allowed weekdays for rDay in range(0, len(rValue)): # add the value self._tkSavedCfg["playTimeActivities"].append([rValue[rDay][0], rValue[rDay][1]]) # clean up limits if full refresh requested if pInfoLvl == cons.TK_CL_INF_FULL: self.normalizeAllowedDaysAndLimits() # if PT override is enabled, we do not show time information for PT if self._tkSavedCfg["playTimeOverrideEnabled"]: # disable time show self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLeftSavedLB").set_text(_NO_TIME_LABEL) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLeftActualLB").set_text(_NO_TIME_LABEL) # config was updated only when full if pInfoLvl == cons.TK_CL_INF_FULL: # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_USER_CONFIG_RETRIEVED")) # apply config self.applyUserConfig() # determine control state self.calculateUserConfigControlAvailability() self.calculateUserPlayTimeConfigControlAvailability() self.calculateUserAdditionalConfigControlAvailability() # enable adding hours as well self.enableTimeControlToday() else: # disable all but choser self.toggleUserConfigControls(False, True) # status self.setTimekprStatus(False, message) # check the connection self.checkConnection() # return return True # --------------- retrieved configuration apply methods --------------- # def applyTimekprConfig(self): """Apply user configuration after getting it from server""" # ## log level ## self._timekprAdminFormBuilder.get_object("TimekprConfigurationLoglevelSB").set_value(self._tkSavedCfg["timekprLogLevel"]) self._timekprAdminFormBuilder.get_object("TimekprConfigurationLoglevelSB").set_sensitive(True) # ## poll time ## self._timekprAdminFormBuilder.get_object("TimekprConfigurationPollIntervalSB").set_value(self._tkSavedCfg["timekprPollingInterval"]) self._timekprAdminFormBuilder.get_object("TimekprConfigurationPollIntervalSB").set_sensitive(True) # ## save time ## self._timekprAdminFormBuilder.get_object("TimekprConfigurationSaveTimeSB").set_value(self._tkSavedCfg["timekprSaveTime"]) self._timekprAdminFormBuilder.get_object("TimekprConfigurationSaveTimeSB").set_sensitive(True) # ## termination time ## self._timekprAdminFormBuilder.get_object("TimekprConfigurationTerminationTimeSB").set_value(self._tkSavedCfg["timekprTerminationTime"]) self._timekprAdminFormBuilder.get_object("TimekprConfigurationTerminationTimeSB").set_sensitive(True) # ## final warning time ## self._timekprAdminFormBuilder.get_object("TimekprConfigurationWarningTimeSB").set_value(self._tkSavedCfg["timekprWarningTime"]) self._timekprAdminFormBuilder.get_object("TimekprConfigurationWarningTimeSB").set_sensitive(True) # ## final notification time ## self._timekprAdminFormBuilder.get_object("TimekprConfigurationFinalNotificationSB").set_value(self._tkSavedCfg["timekprNotificationTime"]) self._timekprAdminFormBuilder.get_object("TimekprConfigurationFinalNotificationSB").set_sensitive(True) # ## tracking session types ### for rSessionType in self._tkSavedCfg["timekprTrackingSessions"]: # add config self._timekprAdminFormBuilder.get_object("TimekprTrackingSessionsLS").append([str(rSessionType)]) # enable editing for rObj in ("TimekprTrackingSessionsTreeView", "TimekprTrackingSessionsButtonControlBX"): self._timekprAdminFormBuilder.get_object(rObj).set_sensitive(True) # select first row if len(self._tkSavedCfg["timekprTrackingSessions"]) > 0: self._timekprAdminFormBuilder.get_object("TimekprTrackingSessionsTreeView").set_cursor(0) self._timekprAdminFormBuilder.get_object("TimekprTrackingSessionsTreeView").scroll_to_cell(0) # ## exclusion session types ## for rSessionType in self._tkSavedCfg["timekprExcludedSessions"]: # add config self._timekprAdminFormBuilder.get_object("TimekprExcludedSessionsLS").append([str(rSessionType)]) # enable editing for rObj in ("TimekprExcludedSessionsTreeView", "TimekprExcludedSessionsButtonControlBX"): self._timekprAdminFormBuilder.get_object(rObj).set_sensitive(True) # select first row if len(self._tkSavedCfg["timekprExcludedSessions"]) > 0: self._timekprAdminFormBuilder.get_object("TimekprExcludedSessionsTreeView").set_cursor(0) self._timekprAdminFormBuilder.get_object("TimekprExcludedSessionsTreeView").scroll_to_cell(0) # ## excluded users ## for rUser in self._tkSavedCfg["timekprExcludedUsers"]: # add config self._timekprAdminFormBuilder.get_object("TimekprExcludedUsersLS").append([str(rUser)]) # enable editing for rObj in ("TimekprExcludedUsersTreeView", "TimekprExcludedUsersButtonControlBX"): self._timekprAdminFormBuilder.get_object(rObj).set_sensitive(True) # select first row if len(self._tkSavedCfg["timekprExcludedUsers"]) > 0: self._timekprAdminFormBuilder.get_object("TimekprExcludedUsersTreeView").set_cursor(0) self._timekprAdminFormBuilder.get_object("TimekprExcludedUsersTreeView").scroll_to_cell(0) # ## PlayTime ## # global enabled switch self._timekprAdminFormBuilder.get_object("TimekprPlayTimeEnableGlobalCB").set_active(self._tkSavedCfg["timekprPlayTimeEnabled"]) self._timekprAdminFormBuilder.get_object("TimekprPlayTimeEnableGlobalCB").set_sensitive(True) # global enhanced activity monitor self._timekprAdminFormBuilder.get_object("TimekprPlayTimeEnhancedActivityMonitorCB").set_active(self._tkSavedCfg["timekprPlayTimeEnhancedActivityMonitorEnabled"]) self._timekprAdminFormBuilder.get_object("TimekprPlayTimeEnhancedActivityMonitorCB").set_sensitive(True) # enable / disable controls self.toggleTimekprConfigControls(True) def applyUserConfig(self): """Apply user configuration after getting it from server""" # enable refresh self._timekprAdminFormBuilder.get_object("TimekprUserSelectionRefreshBT").set_sensitive(True) # ## allowed days ### for rDay in range(1, 7+1): # enable certain days self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS")[rDay-1][2] = (str(rDay) in self._tkSavedCfg["timeLimitDays"]) # enable editing for rCtrl in ("TimekprWeekDaysTreeView", "TimekprHourIntervalsTreeView", "TimekprUserConfDaySettingsSetDaysHeaderControlBX" ): self._timekprAdminFormBuilder.get_object(rCtrl).set_sensitive(True) # ## limits per allowed days ### dayLimitIdx = -1 # loop through all days for rDay in cons.TK_ALLOWED_WEEKDAYS.split(";"): # day index dayIdx = int(rDay) - 1 # check whether this day is enabled if rDay in self._tkSavedCfg["timeLimitDays"]: # advance index dayLimitIdx += 1 else: continue # calculate time limit = self.formatTimeStr(self._tkSavedCfg["timeLimitDaysLimits"][dayLimitIdx], True) # enable certain days self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS")[dayIdx][3] = self._tkSavedCfg["timeLimitDaysLimits"][dayLimitIdx] # set appropriate label as well self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS")[dayIdx][4] = limit if rDay in self._tkSavedCfg["timeLimitDays"] else _NO_TIME_LABEL # ## hour intervals ## # intervals themselves will be adjusted depending on selected day, we just enable them here for rCtrl in ("TimekprHourIntervalsTreeView", "TimekprUserConfDaySettingsSetDaysIntervalsControlBX" ): self._timekprAdminFormBuilder.get_object(rCtrl).set_sensitive(True) # select first row (if there are intervals) if dayLimitIdx > -1: self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsTreeView").set_cursor(0) self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsTreeView").scroll_to_cell(0) # ## limit per week / month ## for rWkDay in self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsLS"): # week if rWkDay[0] == "WK": limit = self._tkSavedCfg["timeLimitWeek"] elif rWkDay[0] == "MON": limit = self._tkSavedCfg["timeLimitMonth"] rWkDay[2] = limit rWkDay[3] = self.formatTimeStr(limit, True, True) # enable editing for rCtrl in ("TimekprUserConfWkMonLimitsTreeView", "TimekprUserConfWkMonLimitsAdjustmentsBX", "TimekprUserConfWkMonLimitsAdjustmentControlButtonsBX" ): self._timekprAdminFormBuilder.get_object(rCtrl).set_sensitive(True) # current day currDay = datetime.now().isoweekday()-1 # determine curent day and point to it self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").set_cursor(currDay) self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").scroll_to_cell(currDay) self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").get_selection().emit("changed") # ## PlayTime config ## # PlayTime and PlayTime options enablement for rCtrl in (("TimekprUserPlayTimeEnableCB", "playTimeEnabled"), ("TimekprUserPlayTimeOverrideEnableCB", "playTimeOverrideEnabled"), ("TimekprUserPlayTimeUnaccountedIntervalsEnabledCB", "playTimeUnaccountedIntervalsEnabled") ): # set value self._timekprAdminFormBuilder.get_object(rCtrl[0]).set_active(self._tkSavedCfg[rCtrl[1]]) # enable field & set button self._timekprAdminFormBuilder.get_object(rCtrl[0]).set_sensitive(True) # ## PlayTime limits per allowed days ### # loop through all days for rDay in cons.TK_ALLOWED_WEEKDAYS.split(";"): # day index dayIdx = int(rDay) - 1 # check whether this day is enabled if rDay in self._tkSavedCfg["playTimeLimitDays"]: # advance index dayLimitIdx = self._tkSavedCfg["playTimeLimitDays"].index(rDay) else: # day not enabled dayLimitIdx = None # calculate time limit = self.formatTimeStr(self._tkSavedCfg["playTimeLimitDaysLimits"][dayLimitIdx], True) if dayLimitIdx is not None else _NO_TIME_LABEL # enable certain days self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS")[dayIdx][2] = dayLimitIdx is not None # enable time limit self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS")[dayIdx][3] = self._tkSavedCfg["playTimeLimitDaysLimits"][dayLimitIdx] if dayLimitIdx is not None else 0 # set appropriate label as well self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS")[dayIdx][4] = limit # determine curent day and point to it self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsTreeView").set_cursor(currDay) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsTreeView").scroll_to_cell(currDay) # enable PlayTime editing for rCtrl in ("TimekprUserPlayTimeLimitsTreeView", "TimekprUserPlayTimeLimitsHeaderControlBX" ): self._timekprAdminFormBuilder.get_object(rCtrl).set_sensitive(True) # ## PlayTime activities ### activityIdx = -1 self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS").clear() # check whether this day is enabled for rAct in self._tkSavedCfg["playTimeActivities"]: # advance index activityIdx += 1 # enable certain days self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS").append([str(activityIdx), rAct[0], rAct[1]]) # enable PlayTime editing self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesTreeView").set_sensitive(True) # if there are activities if activityIdx > -1: # select first row self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesTreeView").set_cursor(0) self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesTreeView").scroll_to_cell(0) # set enablement for PlayTime controls for rCtrl in ("TimekprUserPlayTimeProcessesAdjustmentAddBT", "TimekprUserPlayTimeProcessesAdjustmentRemoveBT", "TimekprUserPlayTimeLimitsHeaderControlBX" ): # enable field & set button self._timekprAdminFormBuilder.get_object(rCtrl).set_sensitive(True) # ## additional config ## # set values for track inactive and disable notifications for rCtrl in ("TimekprUserConfTodaySettingsTrackInactiveCB", "TimekprUserConfTodaySettingsHideTrayIconCB"): # set value self._timekprAdminFormBuilder.get_object(rCtrl).set_active(self._tkSavedCfg["timeTrackInactive"] if rCtrl == "TimekprUserConfTodaySettingsTrackInactiveCB" else self._tkSavedCfg["timeHideTrayIcon"]) # enable field & set button self._timekprAdminFormBuilder.get_object(rCtrl).set_sensitive(True) # lockout type and intervals # set option self.setSelectedLockoutType(self._tkSavedCfg["timeLockoutType"]) # set option self.controlSelectedLockoutTypeHourIntervals(self._tkSavedCfg["timeWakeInterval"]) # enable editing self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeChoiceBoxBX").set_sensitive(True) # --------------- change detection and GUI action control methods --------------- # def calculateTimekprConfigControlAvailability(self, pApplyControls=True): """Calculate main control availability""" # this duplicates diff control as well changeControl = {} # ## log level ## control = "TimekprConfigurationLoglevelSB" value = self._timekprAdminFormBuilder.get_object(control).get_value_as_int() changeControl[control] = {"st": value != self._tkSavedCfg["timekprLogLevel"], "val": value} # ## poll time ## control = "TimekprConfigurationPollIntervalSB" value = self._timekprAdminFormBuilder.get_object(control).get_value_as_int() changeControl[control] = {"st": value != self._tkSavedCfg["timekprPollingInterval"], "val": value} # ## save time ## control = "TimekprConfigurationSaveTimeSB" value = self._timekprAdminFormBuilder.get_object(control).get_value_as_int() changeControl[control] = {"st": value != self._tkSavedCfg["timekprSaveTime"], "val": value} # ## termination time ## control = "TimekprConfigurationTerminationTimeSB" value = self._timekprAdminFormBuilder.get_object(control).get_value_as_int() changeControl[control] = {"st": value != self._tkSavedCfg["timekprTerminationTime"], "val": value} # ## final warning time ## control = "TimekprConfigurationWarningTimeSB" value = self._timekprAdminFormBuilder.get_object(control).get_value_as_int() changeControl[control] = {"st": value != self._tkSavedCfg["timekprWarningTime"], "val": value} # ## final notification ## control = "TimekprConfigurationFinalNotificationSB" value = self._timekprAdminFormBuilder.get_object(control).get_value_as_int() changeControl[control] = {"st": value != self._tkSavedCfg["timekprNotificationTime"], "val": value} # ## tracking session types ### tmpArray = [str(rIt[0]) for rIt in self._timekprAdminFormBuilder.get_object("TimekprTrackingSessionsLS") if rIt[0]] control = "TimekprTrackingSessionsLS" changeControl[control] = {"st": tmpArray != self._tkSavedCfg["timekprTrackingSessions"], "val": tmpArray} # ## exclusion session types ## tmpArray = [str(rIt[0]) for rIt in self._timekprAdminFormBuilder.get_object("TimekprExcludedSessionsLS") if rIt[0]] control = "TimekprExcludedSessionsLS" changeControl[control] = {"st": tmpArray != self._tkSavedCfg["timekprExcludedSessions"], "val": tmpArray} # ## excluded users ## tmpArray = [str(rIt[0]) for rIt in self._timekprAdminFormBuilder.get_object("TimekprExcludedUsersLS") if rIt[0]] control = "TimekprExcludedUsersLS" changeControl[control] = {"st": tmpArray != self._tkSavedCfg["timekprExcludedUsers"], "val": tmpArray} # ## global PlayTime switch ## control = "TimekprPlayTimeEnableGlobalCB" value = self._timekprAdminFormBuilder.get_object(control).get_active() changeControl[control] = {"st": value != self._tkSavedCfg["timekprPlayTimeEnabled"], "val": value} # ## global PlayTime switch ## control = "TimekprPlayTimeEnhancedActivityMonitorCB" value = self._timekprAdminFormBuilder.get_object(control).get_active() changeControl[control] = {"st": value != self._tkSavedCfg["timekprPlayTimeEnhancedActivityMonitorEnabled"], "val": value} # if at least one is changed enable = False if pApplyControls: for rKey, rVal in changeControl.items(): # one thing changed if rVal["st"]: # enable enable = rVal["st"] # no need to search further break # enabled or not self._timekprAdminFormBuilder.get_object("TimekprConfigurationApplyBT").set_sensitive(enable) # return return changeControl def calculateUserTodayControlAvailability(self): """Calculate user today config control availability""" # ## add time today ## enabled = (self._timekprAdminFormBuilder.get_object("TimekprUserConfTodaySettingsSetHrSB").get_value_as_int() != 0 or self._timekprAdminFormBuilder.get_object("TimekprUserConfTodaySettingsSetMinSB").get_value_as_int() != 0) for rCtrl in ("TimekprUserConfTodaySettingsSetAddBT", "TimekprUserConfTodaySettingsSetSubractBT", "TimekprUserConfTodaySettingsSetSetBT"): self._timekprAdminFormBuilder.get_object(rCtrl).set_sensitive(enabled) def calculateUserConfigControlAvailability(self, pApplyControls=True): """Calculate user config control availability""" # this duplicates diff control as well changeControl = {} # get stores (for use later) limitSt = self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS") wkMonSt = self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsLS") # ## time day config ## tmpArray = [str(rIt[0]) for rIt in limitSt if rIt[2]] control = "TimekprUserWeekDaysLSD" changeControl[control] = {"st": tmpArray != self._tkSavedCfg["timeLimitDays"], "val": tmpArray} # ## time limits per allowed days ### tmpArray = [rIt[3] for rIt in limitSt if rIt[2]] control = "TimekprUserWeekDaysLSL" changeControl[control] = {"st": tmpArray != self._tkSavedCfg["timeLimitDaysLimits"], "val": tmpArray} # ## intervals ### areIntervalsVerified = self.areHoursVerified() control = "TimekprHourIntervalsLS" changeControl[control] = {"st": self._tkSavedCfg["timeLimitDaysHoursActual"] != self._tkSavedCfg["timeLimitDaysHoursSaved"], "val": self._tkSavedCfg["timeLimitDaysHoursActual"]} # ## week / month limits ### for rIt in wkMonSt: # week or month? if rIt[0] == "WK": control = "TimekprUserConfWkMonLimitsLSWK" changeControl[control] = {"st": rIt[2] != self._tkSavedCfg["timeLimitWeek"], "val": rIt[2]} elif rIt[0] == "MON": control = "TimekprUserConfWkMonLimitsLSMON" changeControl[control] = {"st": rIt[2] != self._tkSavedCfg["timeLimitMonth"], "val": rIt[2]} # if at least one is changed enable = False if pApplyControls: if areIntervalsVerified: for rKey, rVal in changeControl.items(): # one thing changed if rVal["st"]: # enable enable = rVal["st"] # no need to search further break # enabled or not self._timekprAdminFormBuilder.get_object("TimekprUserConfDaySettingsApplyBT").set_sensitive(enable) # enable / disable verify self._timekprAdminFormBuilder.get_object("TimekprUserConfDaySettingsSetDaysIntervalsVerifyBT").set_sensitive(not areIntervalsVerified) # return return changeControl def calculateUserPlayTimeConfigControlAvailability(self, pApplyControls=True): """Calculate user PlayTime config control availability""" # this duplicates diff control as well changeControl = {} # ## PlayTime enabled ## control = "TimekprUserPlayTimeEnableCB" value = self._timekprAdminFormBuilder.get_object(control).get_active() changeControl[control] = {"st": value != self._tkSavedCfg["playTimeEnabled"], "val": value} # ## PlayTime override enabled ## control = "TimekprUserPlayTimeOverrideEnableCB" value = self._timekprAdminFormBuilder.get_object(control).get_active() changeControl[control] = {"st": value != self._tkSavedCfg["playTimeOverrideEnabled"], "val": value} # ## PlayTime allowed during unaccounted intervals ## control = "TimekprUserPlayTimeUnaccountedIntervalsEnabledCB" value = self._timekprAdminFormBuilder.get_object(control).get_active() changeControl[control] = {"st": value != self._tkSavedCfg["playTimeUnaccountedIntervalsEnabled"], "val": value} # get stores (for use later) limitSt = self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS") actSt = self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS") actStLen = len(actSt) # ## PlayTime day config ## tmpArray = [str(rIt[0]) for rIt in limitSt if rIt[2]] control = "TimekprUserPlayTimeLimitsLSD" changeControl[control] = {"st": tmpArray != self._tkSavedCfg["playTimeLimitDays"], "val": tmpArray} # ## PlayTime limits per allowed days ### tmpArray = [rIt[3] for rIt in limitSt if rIt[2]] control = "TimekprUserPlayTimeLimitsLSL" changeControl[control] = {"st": tmpArray != self._tkSavedCfg["playTimeLimitDaysLimits"], "val": tmpArray} # ## PlayTime activities ### tmpArray = [] idx = 0 for rIt in actSt: # increase idx idx += 1 # do not add, if last line is not filed in properly if not (idx == actStLen and rIt[1] == ""): # add mask and description tmpArray.append([rIt[1], rIt[2]]) control = "TimekprUserPlayTimeProcessesLS" changeControl[control] = {"st": tmpArray != self._tkSavedCfg["playTimeActivities"], "val": tmpArray} # if at least one is changed enable = False if pApplyControls: for rKey, rVal in changeControl.items(): # one thing changed if rVal["st"]: # enable enable = rVal["st"] # no need to search further break # enabled or not self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesApplyBT").set_sensitive(enable) # return return changeControl def calculateUserAdditionalConfigControlAvailability(self, pApplyControls=True): """Calculate user config control availability""" # this duplicates diff control as well changeControl = {} # ## Track inactive enabled ## control = "TimekprUserConfTodaySettingsTrackInactiveCB" value = self._timekprAdminFormBuilder.get_object(control).get_active() changeControl[control] = {"st": value != self._tkSavedCfg["timeTrackInactive"], "val": value} # ## Hide try icon enabled ## control = "TimekprUserConfTodaySettingsHideTrayIconCB" value = self._timekprAdminFormBuilder.get_object(control).get_active() changeControl[control] = {"st": value != self._tkSavedCfg["timeHideTrayIcon"], "val": value} # ## Lockout type / interval ## control = "TimekprUserConfAddOptsLockoutType" # get lockout type lockoutType = self.getSelectedLockoutType() # intervals hrFrom = str(self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeFromSB").get_value_as_int()) if lockoutType == cons.TK_CTRL_RES_W else "0" hrTo = str(self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsLockoutTypeSuspendWakeToSB").get_value_as_int()) if lockoutType == cons.TK_CTRL_RES_W else "23" interval = "%s;%s" % (hrFrom, hrTo) value = (lockoutType, hrFrom, hrTo) changeControl[control] = {"st": lockoutType != self._tkSavedCfg["timeLockoutType"] or interval != self._tkSavedCfg["timeWakeInterval"], "val": value} # interval control self.controlSelectedLockoutTypeHourIntervals(interval if self.getSelectedLockoutType() == cons.TK_CTRL_RES_W else None) # if at least one is changed enable = False if pApplyControls: for rKey, rVal in changeControl.items(): # one thing changed if rVal["st"]: # enable enable = rVal["st"] # no need to search further break # enabled or not self._timekprAdminFormBuilder.get_object("TimekprUserConfAddOptsApplyBT").set_sensitive(enable) # return return changeControl # --------------- changed information publish methods --------------- # def applyTimekprConfigurationChanges(self): """Apply configuration changes to server""" # get what's changed changeControl = self.calculateTimekprConfigControlAvailability(False) # initial values result = 0 message = "" # loop through all changes for rKey, rVal in changeControl.items(): # changed if rVal["st"]: # check what element we have, depending on that call different interface # ## poll time ## if rKey == "TimekprConfigurationLoglevelSB": # call server result, message = self._timekprAdminConnector.setTimekprLogLevel(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprLogLevel"] = rVal["val"] # ## poll time ## elif rKey == "TimekprConfigurationPollIntervalSB": # call server result, message = self._timekprAdminConnector.setTimekprPollTime(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprPollingInterval"] = rVal["val"] # ## save time ## elif rKey == "TimekprConfigurationSaveTimeSB": # call server result, message = self._timekprAdminConnector.setTimekprSaveTime(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprSaveTime"] = rVal["val"] # ## termination time ## elif rKey == "TimekprConfigurationTerminationTimeSB": # call server result, message = self._timekprAdminConnector.setTimekprTerminationTime(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprTerminationTime"] = rVal["val"] # ## final warning time ## elif rKey == "TimekprConfigurationWarningTimeSB": # call server result, message = self._timekprAdminConnector.setTimekprFinalWarningTime(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprWarningTime"] = rVal["val"] # ## final notification ## elif rKey == "TimekprConfigurationFinalNotificationSB": # call server result, message = self._timekprAdminConnector.setTimekprFinalNotificationTime(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprNotificationTime"] = rVal["val"] # ## tracking session types ### elif rKey == "TimekprTrackingSessionsLS": # call server result, message = self._timekprAdminConnector.setTimekprSessionsCtrl(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprTrackingSessions"] = rVal["val"].copy() # ## exclusion session types ## elif rKey == "TimekprExcludedSessionsLS": # call server result, message = self._timekprAdminConnector.setTimekprSessionsExcl(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprExcludedSessions"] = rVal["val"].copy() # ## excluded users ## elif rKey == "TimekprExcludedUsersLS": # call server result, message = self._timekprAdminConnector.setTimekprUsersExcl(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprExcludedUsers"] = rVal["val"].copy() # ## PlayTime enabled ## elif rKey == "TimekprPlayTimeEnableGlobalCB": # call server result, message = self._timekprAdminConnector.setTimekprPlayTimeEnabled(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprPlayTimeEnabled"] = rVal["val"] # ## PlayTime enhanced activity monitor ## elif rKey == "TimekprPlayTimeEnhancedActivityMonitorCB": # call server result, message = self._timekprAdminConnector.setTimekprPlayTimeEnhancedActivityMonitorEnabled(rVal["val"]) # successful call if result == 0: # set internal state self._tkSavedCfg["timekprPlayTimeEnhancedActivityMonitorEnabled"] = rVal["val"] # if all ok if result != 0: # status self.setTimekprStatus(False, message) # that's it break # fine if result != 0: # check the connection self.checkConnection() else: # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_CONFIGURATION_SAVED")) # recalc the control state self.calculateTimekprConfigControlAvailability() def applyUserTodayConfigurationChanges(self, pType, pOperation): """Process actual call to set time for user""" # get username userName = self.getSelectedUserName() # if we have username if userName is not None: # initial values result = 0 message = "" # regular time or PlayTime hrSb = "TimekprUserConfTodaySettingsSetHrSB" minSb = "TimekprUserConfTodaySettingsSetMinSB" # get time to add timeToAdjust = self._timekprAdminFormBuilder.get_object(hrSb).get_value_as_int() * cons.TK_LIMIT_PER_HOUR timeToAdjust += self._timekprAdminFormBuilder.get_object(minSb).get_value_as_int() * cons.TK_LIMIT_PER_MINUTE if pType == "Time": # call server result, message = self._timekprAdminConnector.setTimeLeft(userName, pOperation, timeToAdjust) elif pType == "PlayTime": # call server result, message = self._timekprAdminConnector.setPlayTimeLeft(userName, pOperation, timeToAdjust) # successful call if result == 0: if pType == "Time": # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_ADJUSTTIME_PROCESSED")) elif pType == "PlayTime": # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_PT_ADJUSTTIME_PROCESSED")) # reset values to form for rCtrl in (hrSb, minSb): # no value to add self._timekprAdminFormBuilder.get_object(rCtrl).set_value(0) else: # status self.setTimekprStatus(False, message) # check the connection self.checkConnection() # recalc the control state self.calculateUserTodayControlAvailability() def applyUserLimitConfigurationChanges(self): """Apply configuration changes to server""" # get what's changed changeControl = self.calculateUserConfigControlAvailability(False) # get username userName = self.getSelectedUserName() # initial values result = 0 message = "" changeCnt = 0 # loop through all changes for rKey, rVal in changeControl.items(): # changed if rVal["st"]: # check what element we have, depending on that call different interface # ## week limit ## if rKey == "TimekprUserConfWkMonLimitsLSWK": # call server result, message = self._timekprAdminConnector.setTimeLimitForWeek(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["timeLimitWeek"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_WKMONADJUSTTIME_PROCESSED")) # ## month limit ## elif rKey == "TimekprUserConfWkMonLimitsLSMON": # call server result, message = self._timekprAdminConnector.setTimeLimitForMonth(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["timeLimitMonth"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_WKMONADJUSTTIME_PROCESSED")) # ## day config ## elif rKey == "TimekprUserWeekDaysLSD": # call server result, message = self._timekprAdminConnector.setAllowedDays(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["timeLimitDays"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_ALLOWEDDAYS_PROCESSED")) # ## limits per allowed days ### elif rKey == "TimekprUserWeekDaysLSL": # call server result, message = self._timekprAdminConnector.setTimeLimitForDays(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["timeLimitDaysLimits"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_TIMELIMITS_PROCESSED")) # ## hour allowance activities ### elif rKey == "TimekprHourIntervalsLS": # loop through changed day hours for rDay in rVal["val"]: # day changed hrs = None if self._tkSavedCfg["timeLimitDaysHoursActual"][rDay] == self._tkSavedCfg["timeLimitDaysHoursSaved"][rDay] else self._tkSavedCfg["timeLimitDaysHoursActual"][rDay] # hours changed if hrs is not None: # call server result, message = self._timekprAdminConnector.setAllowedHours(userName, rDay, hrs) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["timeLimitDaysHoursSaved"][rDay] = self._tkSavedCfg["timeLimitDaysHoursActual"][rDay].copy() # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_ALLOWEDHOURS_PROCESSED")) else: # finish break # if all ok if result != 0: # status self.setTimekprStatus(False, message) # that's it break # fine if result != 0: # check the connection self.checkConnection() # override messages in case more then one option was processed elif changeCnt > 1: # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_USER_LIMIT_CONFIGURATION_SAVED")) # recalc the control state self.calculateUserConfigControlAvailability() def applyUserPlayTimeConfigurationChanges(self): """Apply configuration changes to server""" # get what's changed changeControl = self.calculateUserPlayTimeConfigControlAvailability(False) # get username userName = self.getSelectedUserName() # initial values result = 0 message = "" changeCnt = 0 # loop through all changes for rKey, rVal in changeControl.items(): # changed if rVal["st"]: # check what element we have, depending on that call different interface # ## PlayTime enabled ## if rKey == "TimekprUserPlayTimeEnableCB": # call server result, message = self._timekprAdminConnector.setPlayTimeEnabled(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["playTimeEnabled"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_PT_ENABLEMENT_PROCESSED")) # ## PlayTime override enabled ## elif rKey == "TimekprUserPlayTimeOverrideEnableCB": # call server result, message = self._timekprAdminConnector.setPlayTimeLimitOverride(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["playTimeOverrideEnabled"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_PT_OVERRIDE_PROCESSED")) # ## PlayTime allowed during unaccounted intervals ## elif rKey == "TimekprUserPlayTimeUnaccountedIntervalsEnabledCB": # call server result, message = self._timekprAdminConnector.setPlayTimeUnaccountedIntervalsEnabled(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["playTimeUnaccountedIntervalsEnabled"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_PT_ALLOWED_UNLIMITED_INTERVALS_PROCESSED")) # ## PlayTime day config ## elif rKey == "TimekprUserPlayTimeLimitsLSD": # call server result, message = self._timekprAdminConnector.setPlayTimeAllowedDays(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["playTimeLimitDays"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_PT_ALLOWEDDAYS_PROCESSED")) # ## PlayTime limits per allowed days ### elif rKey == "TimekprUserPlayTimeLimitsLSL": # call server result, message = self._timekprAdminConnector.setPlayTimeLimitsForDays(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["playTimeLimitDaysLimits"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_PT_TIMELIMITS_PROCESSED")) # ## PlayTime activities ### elif rKey == "TimekprUserPlayTimeProcessesLS": # call server result, message = self._timekprAdminConnector.setPlayTimeActivities(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["playTimeActivities"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_PT_ACTIVITIES_PROCESSED")) # if all ok if result != 0: # status self.setTimekprStatus(False, message) # that's it break # fine if result != 0: # check the connection self.checkConnection() # override messages in case more then one option was processed elif changeCnt > 1: # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_USER_PT_LIMIT_CONFIGURATION_SAVED")) # recalc the control state self.calculateUserPlayTimeConfigControlAvailability() def applyUserAdditionalConfigurationChanges(self): """Apply configuration changes to server""" # get what's changed changeControl = self.calculateUserAdditionalConfigControlAvailability(False) # get username userName = self.getSelectedUserName() # initial values result = 0 message = "" changeCnt = 0 # loop through all changes for rKey, rVal in changeControl.items(): # changed if rVal["st"]: # check what element we have, depending on that call different interface # ## Track inactive enabled ## if rKey == "TimekprUserConfTodaySettingsTrackInactiveCB": # call server result, message = self._timekprAdminConnector.setTrackInactive(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["timeTrackInactive"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_TRACKINACTIVE_PROCESSED")) # ## Hide try icon enabled ## elif rKey == "TimekprUserConfTodaySettingsHideTrayIconCB": # call server result, message = self._timekprAdminConnector.setHideTrayIcon(userName, rVal["val"]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["timeHideTrayIcon"] = rVal["val"] # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_HIDETRAYICON_PROCESSED")) # ## Lockout type / interval ## elif rKey == "TimekprUserConfAddOptsLockoutType": # call server result, message = self._timekprAdminConnector.setLockoutType(userName, rVal["val"][0], rVal["val"][1], rVal["val"][2]) # successful call if result == 0: # cnt changeCnt += 1 # set internal state self._tkSavedCfg["timeLockoutType"] = rVal["val"][0] self._tkSavedCfg["timeWakeInterval"] = "%s;%s" % ( rVal["val"][1], rVal["val"][2]) # print success message self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_LOCKOUTTYPE_PROCESSED")) # if all ok if result != 0: # status self.setTimekprStatus(False, message) # that's it break # fine if result != 0: # check the connection self.checkConnection() # override messages in case more then one option was processed elif changeCnt > 1: # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_USER_ADDOPTS_CONFIGURATION_SAVED")) # recalc the control state self.calculateUserAdditionalConfigControlAvailability() # --------------- GTK signal methods --------------- # # --------------- timekpr configuration GTK signal helper methods --------------- # def addElementToList(self, pName): """Add tracked session""" lstSt = self._timekprAdminFormBuilder.get_object("%sLS" % (pName)) lstTw = self._timekprAdminFormBuilder.get_object("%sTreeView" % (pName)) lstLen = len(lstSt) # check if the last one is not empty (no need to add more empty rows) if lstLen > 0 and lstSt[lstLen-1][0] != "": # add empty item lstSt.append([""]) # scroll to end lstTw.set_cursor(lstLen) lstTw.scroll_to_cell(lstLen) # verify control availability self.calculateTimekprConfigControlAvailability() def removeElementFromList(self, pName): """Remove tracked session""" # defaults elemIdx = self.getSelectedConfigElement("%sTreeView" % (pName)) rIdx = 0 # remove selected item for rIt in self._timekprAdminFormBuilder.get_object("%sLS" % (pName)): # check what to remove if elemIdx == rIdx: # remove self._timekprAdminFormBuilder.get_object("%sLS" % (pName)).remove(rIt.iter) # this is it break # count further rIdx += 1 # verify control availability self.calculateTimekprConfigControlAvailability() def setTimekprExcludedTrackedValue(self, pPath, pText, pWhat): """Set internal representation of in-place edited value""" # def lStN = None if pWhat == "TrackedSessions": # store lStN = "TimekprTrackingSessionsLS" elif pWhat == "ExcludedSessions": # store lStN = "TimekprExcludedSessionsLS" elif pWhat == "ExcludedUsers": # store lStN = "TimekprExcludedUsersLS" # handled type if lStN is not None: # get store object self._timekprAdminFormBuilder.get_object(lStN)[pPath][0] = pText # calculate control availability self.calculateTimekprConfigControlAvailability() # --------------- timekpr configuration GTK signal methods --------------- # def configControlSwitchesChanged(self, evt): """Change any control item (warning, poll, etc.)""" # verify control availability self.calculateTimekprConfigControlAvailability() def trackedSessionsAddClicked(self, evt): """Add tracked session""" self.addElementToList("TimekprTrackingSessions") def trackedSessionsRemoveClicked(self, evt): """Remove tracked session""" self.removeElementFromList("TimekprTrackingSessions") def excludedSessionsAddClicked(self, evt): """Add excluded session""" self.addElementToList("TimekprExcludedSessions") def excludedSessionsRemoveClicked(self, evt): """Remove excluded session""" self.removeElementFromList("TimekprExcludedSessions") def excludedUsersAddClicked(self, evt): """Add excluded session""" self.addElementToList("TimekprExcludedUsers") def excludedUsersRemoveClicked(self, evt): """Remove excluded user""" self.removeElementFromList("TimekprExcludedUsers") def timekprTrackedSessionsEdited(self, widget, path, text): """Tracked session values edited""" self.setTimekprExcludedTrackedValue(path, text, "TrackedSessions") def timekprExcludedSessionsEdited(self, widget, path, text): """Excluded session values edited""" self.setTimekprExcludedTrackedValue(path, text, "ExcludedSessions") def timekprExcludedUsersEdited(self, widget, path, text): """Excluded user values edited""" self.setTimekprExcludedTrackedValue(path, text, "ExcludedUsers") def applyTimekprConfigurationChangesClicked(self, evt): """Apply configuration changes""" # disable button so it cannot be triggered again self._timekprAdminFormBuilder.get_object("TimekprConfigurationApplyBT").set_sensitive(False) # process setting self.applyTimekprConfigurationChanges() # --------------- user selection GTK signal methods --------------- # def userSelectionChanged(self, evt, pInfoLvl=None): """User selected""" # get username userName = self.getSelectedUserName() # only if connected if userName is not None and userName != "": # get user config self.retrieveUserInfoAndConfig(userName, cons.TK_CL_INF_FULL if pInfoLvl is None else pInfoLvl) else: # disable all self.toggleUserConfigControls(False, True) def userConfigurationRefreshClicked(self, evt): """User requested config restore from server""" self._timekprAdminFormBuilder.get_object("TimekprUserSelectionCB").emit("changed") # --------------- today page GTK signal methods --------------- # def todayAddTimeChanged(self, evt): """Call control calculations when time has been added""" # recalc control availability self.calculateUserTodayControlAvailability() def todayAddPlayTimeChanged(self, evt): """Call control calculations when time has been added""" # recalc control availability self.calculateUserTodayControlAvailability() def todayAddTimeClicked(self, evt): """Add time to user""" # disable button so it cannot be triggered again self._timekprAdminFormBuilder.get_object("TimekprUserConfTodaySettingsSetAddBT").set_sensitive(False) # get choice type = "Time" if self._timekprAdminFormBuilder.get_object("TimekprUserConfTodaySettingsChoiceTimeRB").get_active() else "PlayTime" # process setting self.applyUserTodayConfigurationChanges(type, "+") def todaySubtractTimeClicked(self, evt): """Subtract time from user""" # disable button so it cannot be triggered again self._timekprAdminFormBuilder.get_object("TimekprUserConfTodaySettingsSetSubractBT").set_sensitive(False) # get choice type = "Time" if self._timekprAdminFormBuilder.get_object("TimekprUserConfTodaySettingsChoiceTimeRB").get_active() else "PlayTime" # process setting self.applyUserTodayConfigurationChanges(type, "-") def todaySetTimeClicked(self, evt): """Set exact time for user""" # disable button so it cannot be triggered again self._timekprAdminFormBuilder.get_object("TimekprUserConfTodaySettingsSetSetBT").set_sensitive(False) # get choice type = "Time" if self._timekprAdminFormBuilder.get_object("TimekprUserConfTodaySettingsChoiceTimeRB").get_active() else "PlayTime" # process setting self.applyUserTodayConfigurationChanges(type, "=") # --------------- limit configuration GTK signal helper methods --------------- # def verifyAndSetHourInterval(self, path, text, pIsFrom): """Verify and set hour values""" # store intervalSt = self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS") # value before secsBefore = intervalSt[path][4 if pIsFrom else 5] # def secs = self.verifyAndCalcLimit(text, "h") # if we could calculate seconds (i.e. entered text is correct) if secs is not None: # if values before and after does not change (or initial 0), we do nothing if secsBefore != secs or secsBefore == secs == 0: # format secs text = self.formatTimeStr(secs) # set values intervalSt[path][1 if pIsFrom else 2] = text intervalSt[path][4 if pIsFrom else 5] = secs # reset id intervalSt[path][0] = -1 # calculate control availability self.calculateUserConfigControlAvailability() def verifyAndSetWeeklyLimits(self, path, text): """Verify and set weekly values""" pass # store limitsSt = self._timekprAdminFormBuilder.get_object("TimekprUserConfWkMonLimitsLS") # value before secsBefore = limitsSt[path][2] # def secs = self.verifyAndCalcLimit(text, "w" if limitsSt[path][0] == "WK" else "m") # if we could calculate seconds (i.e. entered text is correct) if secs is not None: # if values before and after does not change, we do nothing if secsBefore != secs: # format secs text = self.formatTimeStr(secs, pFormatSecs=True, pFormatDays=True) # set values limitsSt[path][3] = text limitsSt[path][2] = secs # calculate control availability self.calculateUserConfigControlAvailability() def verifyAndSetDayLimits(self, path, text, pIsPlayTime=False): """Verify and set daily values""" pass # store limitsSt = self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS" if pIsPlayTime else "TimekprWeekDaysLS") controlFnc = self.calculateUserPlayTimeConfigControlAvailability if pIsPlayTime else self.calculateUserConfigControlAvailability # value before secsBefore = limitsSt[path][3] # def secs = self.verifyAndCalcLimit(text, "d") # if we could calculate seconds (i.e. entered text is correct) if secs is not None: # if values before and after does not change, we do nothing if secsBefore != secs: # format secs text = self.formatTimeStr(secs, pFormatSecs=True) # set values limitsSt[path][4] = text limitsSt[path][3] = secs # calculate control availability controlFnc() def areHoursVerified(self): """Return whether all hours have been verified""" # def result = True # store intervalSt = self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS") # loop through all for rInt in intervalSt: # check whether it has been verified (id = -1 means not verified) if rInt[0] < 0 and not (rInt[4] == 0 == rInt[5]): # not verified result = False break # result return result def verifyAndCalcLimit(self, pLimitStr, pLimitType): """Parse user entered limit""" # add limits def _addLimit(pSecs, pAddSecs): # add limits return pAddSecs if pSecs is None else pSecs + pAddSecs # def secs = None # determine interval type and calculate seconds according to it try: # days to weeks/month if pLimitType in ("w", "m") and _DAY_HOUR_MIN_SEC_REGEXP.match(pLimitStr): # calculate seconds secs = min(_addLimit(secs, int(_DAY_HOUR_MIN_SEC_REGEXP.sub(r"\4", pLimitStr))), cons.TK_LIMIT_PER_MINUTE) # days to weeks/month if pLimitType in ("w", "m", "d") and _DAY_HOUR_MIN_REGEXP.match(pLimitStr): # calculate minutes secs = min(_addLimit(secs, int(_DAY_HOUR_MIN_REGEXP.sub(r"\3", pLimitStr)) * (cons.TK_LIMIT_PER_MINUTE if pLimitType != "d" else 1)), cons.TK_LIMIT_PER_HOUR if pLimitType != "d" else cons.TK_LIMIT_PER_MINUTE) # hours/minutes or days/hours if _HOUR_MIN_REGEXP.match(pLimitStr): # calculate seconds secs = min(_addLimit(secs, int(_HOUR_MIN_REGEXP.sub(r"\2", pLimitStr)) * (cons.TK_LIMIT_PER_MINUTE if pLimitType in ("h", "d") else cons.TK_LIMIT_PER_HOUR)), cons.TK_LIMIT_PER_HOUR if pLimitType in ("h", "d") else cons.TK_LIMIT_PER_DAY) # hours / days if _HOUR_REGEXP.match(pLimitStr): # calculate seconds secs = min(_addLimit(secs, int(_HOUR_REGEXP.sub(r"\1", pLimitStr)) * (cons.TK_LIMIT_PER_HOUR if pLimitType in ("h", "d") else cons.TK_LIMIT_PER_DAY)), cons.TK_LIMIT_PER_DAY if pLimitType in ("h", "d") else cons.TK_LIMIT_PER_MONTH) # no error if secs is not None: # normalize total seconds secs = min(secs, cons.TK_LIMIT_PER_MONTH if pLimitType == "m" else cons.TK_LIMIT_PER_WEEK if pLimitType == "w" else cons.TK_LIMIT_PER_DAY) except: # we do not care about any errors secs = None # return seconds return secs # --------------- limit configuration GTK signal methods --------------- # def dayLimitsIncreaseClicked(self, evt): """Increase time limits""" self.adjustTimeLimits(pType="DailyLimits", pAdd=True) def dayLimitsDecreaseClicked(self, evt): """Decrease time limits""" self.adjustTimeLimits(pType="DailyLimits", pAdd=False) def dailyLimitsDaySelectionChanged(self, evt): """Set up intervals on GUI day change""" # refresh the child days = self.getSelectedDays() # get current seconds dt = datetime.now().replace(microsecond=0) dtd = str(datetime.date(dt).isoweekday()) dts = (dt - datetime.now().replace(microsecond=0, second=0, minute=0, hour=0)).total_seconds() selIdx = 0 # only if there is smth selected if len(days) > 0: # go to last day (this cannot and should not be calculated for everything) dayIdx = days[len(days)-1]["idx"] dayNum = days[len(days)-1]["nr"] # whether day is enabled enabled = self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS")[dayIdx][2] limit = self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS")[dayIdx][3] # clear out existing intervals self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").clear() # fill intervals only if that day exists if dayNum in self._tkSavedCfg["timeLimitDaysHoursActual"] and enabled and limit > 0: # idx idx = 0 # fill the intervals for rInterval in self.getIntervalList(dayNum): # determine which is the current hour selIdx = idx if rInterval[2] <= dts <= rInterval[3] and dtd == dayNum else selIdx # fill in the intervals self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").append([idx, rInterval[0], rInterval[1], dayNum, rInterval[2], rInterval[3], self._ROWCOL_OK, self._ROWSTYLE_OK, rInterval[4]]) idx += 1 # set selection to found row self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").set_cursor(selIdx) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").scroll_to_cell(selIdx) def dayAvailabilityChanged(self, widget, path): """Change minutes depending on day availability""" # get list store limitSt = self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS") # flip the checkbox limitSt[path][2] = not limitSt[path][2] # if we have a day, restore limits if limitSt[path][2]: # if we have limits set in background store, restore them if limitSt[path][0] in self._tkSavedCfg["timeLimitDays"]: limitSt[path][3] = self._tkSavedCfg["timeLimitDaysLimits"][self._tkSavedCfg["timeLimitDays"].index(limitSt[path][0])] else: limitSt[path][3] = 0 # format string too limitSt[path][4] = self.formatTimeStr(limitSt[path][3], True) # restore intervals from saved state self._tkSavedCfg["timeLimitDaysHoursActual"][limitSt[path][0]] = self._tkSavedCfg["timeLimitDaysHoursSaved"][limitSt[path][0]].copy() # enable interval refresh self._timekprAdminFormBuilder.get_object("TimekprWeekDaysTreeView").get_selection().emit("changed") else: # reset hours & minutes limitSt[path][3] = 0 limitSt[path][4] = _NO_TIME_LABEL # intervals store intervalsSt = self._timekprAdminFormBuilder.get_object("TimekprWeekDaysLS") # change interval selection as well for rHour in range(0, 23+1): self._tkSavedCfg["timeLimitDaysHoursActual"][intervalsSt[path][0]][str(rHour)] = {cons.TK_CTRL_SMIN: 0, cons.TK_CTRL_EMIN: cons.TK_LIMIT_PER_MINUTE, cons.TK_CTRL_UACC: False} # clear stuff and disable intervals self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS").clear() # recalc control availability self.calculateUserConfigControlAvailability() def intervalsIncreaseClicked(self, evt): """Increase time limits""" self.adjustTimeLimits(pType="Intervals", pAdd=True) def intervalsDecreaseClicked(self, evt): """Decrease time limits""" self.adjustTimeLimits(pType="Intervals", pAdd=False) def userLimitsHourFromEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.verifyAndSetHourInterval(path, text, pIsFrom=True) def userLimitsHourToEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.verifyAndSetHourInterval(path, text, pIsFrom=False) def userLimitsWeeklyLimitsEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.verifyAndSetWeeklyLimits(path, text) def userLimitsDailyLimitsEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.verifyAndSetDayLimits(path, text) def userLimitsDailyPlayTimeLimitsEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.verifyAndSetDayLimits(path, text, pIsPlayTime=True) def userLimitsHourUnaccountableToggled(self, widget, path): """Set internal representation of in-place edited value""" # store intSt = self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS") # flip the checkbox intSt[path][8] = not intSt[path][8] # we need to rebuild hours self.rebuildHoursFromIntervals() # calculate control availability self.calculateUserConfigControlAvailability() def addHourIntervalClicked(self, evt): """Add PlayTime activity placeholder to the list""" limitsSt = self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS") limitsTw = self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView") limitsLen = len(limitsSt) # add addRow = True # check if the last one is not empty (no need to add more empty rows) if (limitsLen > 0 and limitsSt[limitsLen-1][4] == 0 and limitsSt[limitsLen-1][5] == 0): addRow = False # we can add the row if addRow: # get day to which add the interval days = self.getSelectedDays() # if it's not selected if len(days) < 1: # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_NODAY_SELECTED")) else: # normalize day calcDay = days[len(days)-1]["nr"] # add limitsSt.append([-1, "", "", calcDay, 0, 0, self._ROWCOL_OK, self._ROWSTYLE_OK, False]) # scroll to end limitsTw.set_cursor(limitsLen) limitsTw.scroll_to_cell(limitsLen) # verify control availability self.calculateUserConfigControlAvailability() def removeHourIntervalClicked(self, evt): """Remove hour interval""" # defaults limitsSt = self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS") elemIdx = self.getSelectedConfigElement("TimekprHourIntervalsTreeView") rIdx = 0 # only if something is selected if elemIdx is not None: # remove selected item for rIt in limitsSt: if elemIdx == rIdx: # remove limitsSt.remove(rIt.iter) break # count further rIdx += 1 # verify hours self.verifyHourIntervals(None) # verify control availability self.calculateUserConfigControlAvailability() # status change self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_INTERVAL_REMOVED")) def wkMonLimitsIncreaseClicked(self, evt): """Increase week / month time limits""" self.adjustTimeLimits(pType="WeekMonthLimits", pAdd=True) def wkMonLimitsDecreaseClicked(self, evt): """Decrease week / month time limits""" self.adjustTimeLimits(pType="WeekMonthLimits", pAdd=False) def applyUserLimitConfigurationChangesClicked(self, evt): """Call set methods for changes""" # disable button so it cannot be triggered again self._timekprAdminFormBuilder.get_object("TimekprUserConfDaySettingsApplyBT").set_sensitive(False) # process setting self.applyUserLimitConfigurationChanges() # --------------- PlayTime limit configuration GTK signal methods --------------- # def userPlayTimeEnabledChanged(self, evt): """PlayTime enablement changed""" self.calculateUserPlayTimeConfigControlAvailability() def userPlayTimeOverrideEnabledChanged(self, evt): """PlayTime override enablement changed""" self.calculateUserPlayTimeConfigControlAvailability() def userPlayTimeUnaccountedIntervalsEnabledChanged(self, evt): """PlayTime allowed during unaccounted intervals enablement changed""" self.calculateUserPlayTimeConfigControlAvailability() def playTimeLimitsIncreaseClicked(self, evt): """Increase PlayTime limits""" self.adjustTimeLimits(pType="PlayTimeLimits", pAdd=True) def playTimeLimitsDecreaseClicked(self, evt): """Decrease PlayTime limits""" self.adjustTimeLimits(pType="PlayTimeLimits", pAdd=False) def dayPlayTimeAvailabilityChanged(self, widget, path): """Change PlayTime minutes depending on day availability""" # get list store limitSt = self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeLimitsLS") # flip the checkbox limitSt[path][2] = not limitSt[path][2] # if we have a day, restore limits if limitSt[path][2]: # if we have limits set in background store, restore them if limitSt[path][0] in self._tkSavedCfg["playTimeLimitDays"]: limitSt[path][3] = self._tkSavedCfg["playTimeLimitDaysLimits"][self._tkSavedCfg["playTimeLimitDays"].index(limitSt[path][0])] else: limitSt[path][3] = 0 # format string too limitSt[path][4] = self.formatTimeStr(limitSt[path][3], True) else: # reset hours & minutes limitSt[path][3] = 0 limitSt[path][4] = _NO_TIME_LABEL # recalc control availability self.calculateUserPlayTimeConfigControlAvailability() def addPlayTimeActivityClicked(self, evt): """Add PlayTime activity placeholder to the list""" limitsSt = self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS") limitsTw = self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesTreeView") PTActivityLen = len(limitsSt) # add addRow = True # check if the last one is not empty (no need to add more empty rows) if (PTActivityLen > 0 and limitsSt[PTActivityLen-1][1] == ""): addRow = False # we can add the row if addRow: # get last index PTActivityIdx = str(int(limitsSt[PTActivityLen-1][0]) + 1 if PTActivityLen > 0 else 1) # add limitsSt.append([PTActivityIdx, "", ""]) # scroll to end limitsTw.set_cursor(PTActivityLen) limitsTw.scroll_to_cell(PTActivityLen) limitsTw.get_selection().emit("changed") def removePlayTimeActivityClicked(self, evt): """Remove excluded user""" # defaults limitsSt = self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS") elemIdx = self.getSelectedConfigElement("TimekprUserPlayTimeProcessesTreeView") rIdx = 0 # only if something is selected if elemIdx is not None: # remove selected item for rIt in limitsSt: if elemIdx == rIdx: # remove limitsSt.remove(rIt.iter) elif elemIdx < rIdx: # adjust next element index limitsSt[rIdx-1][0] = str(rIdx) # count further rIdx += 1 # verify control availability self.calculateUserPlayTimeConfigControlAvailability() def playTimeActivityMaskEntryEdited(self, widget, path, text): """Set internal representation of in-place edited value""" # store value self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS")[path][1] = text # recalc control availability self.calculateUserPlayTimeConfigControlAvailability() def playTimeActivityDescriptionEntryEdited(self, widget, path, text): """Set internal representation of in-place edited value""" # store value self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesLS")[path][2] = text # recalc control availability self.calculateUserPlayTimeConfigControlAvailability() def applyUserPlayTimeConfigurationChangesClicked(self, evt): """Apply PlayTime configuration changes""" # disable button so it cannot be triggered again self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesApplyBT").set_sensitive(False) # process setting self.applyUserPlayTimeConfigurationChanges() # --------------- additional page configuration GTK signal methods --------------- # def trackInactiveChanged(self, evt): """Call control calculations when inactive flag has been changed""" # recalc control availability self.calculateUserAdditionalConfigControlAvailability() def hideTrayIconChanged(self, evt): """Call control calculations when hide icon has been changed""" # recalc control availability self.calculateUserAdditionalConfigControlAvailability() def lockoutTypeGroupChanged(self, evt): """Call control calculations when restriction / lockout type has been changed""" # recalc control availability self.calculateUserAdditionalConfigControlAvailability() def wakeUpIntervalChanged(self, evt): """Call control calculations when restriction / lockout wake up hours have been changed""" # recalc control availability self.calculateUserAdditionalConfigControlAvailability() def applyUserAdditionalConfigurationChangesClicked(self, evt): """Apply additional configuration changes""" # disable button so it cannot be triggered again self._timekprAdminFormBuilder.get_object("TimekprUserPlayTimeProcessesApplyBT").set_sensitive(False) # process setting self.applyUserAdditionalConfigurationChanges() # --------------- helper methods for signal methods --------------- # def adjustTimeLimits(self, pType, pAdd): """Recalc total seconds""" # get objects depending on type # rb format: # array of: checkbutton, seconds to add, check limit, seconds in liststore, string secs in liststore, control to execute, format seconds, format days if pType == "PlayTimeLimits": tw = "TimekprUserPlayTimeLimitsTreeView" ls = "TimekprUserPlayTimeLimitsLS" rb = [["TimekprUserPlayTimeLimitsHrRB", cons.TK_LIMIT_PER_HOUR, cons.TK_LIMIT_PER_DAY, 3, 4, self.calculateUserPlayTimeConfigControlAvailability, True, False], ["TimekprUserPlayTimeLimitsMinRB", cons.TK_LIMIT_PER_MINUTE, cons.TK_LIMIT_PER_DAY, 3, 4, self.calculateUserPlayTimeConfigControlAvailability, True, False]] elif pType == "DailyLimits": tw = "TimekprWeekDaysTreeView" ls = "TimekprWeekDaysLS" rb = [["TimekprUserTimeLimitsHrRB", cons.TK_LIMIT_PER_HOUR, cons.TK_LIMIT_PER_DAY, 3, 4, self.calculateUserConfigControlAvailability, True, False], ["TimekprUserTimeLimitsMinRB", cons.TK_LIMIT_PER_MINUTE, cons.TK_LIMIT_PER_DAY, 3, 4, self.calculateUserConfigControlAvailability, True, False]] elif pType == "WeekMonthLimits": tw = "TimekprUserConfWkMonLimitsTreeView" ls = "TimekprUserConfWkMonLimitsLS" rb = [["TimekprUserConfWkMonLimitsAdjustmentDayRB", cons.TK_LIMIT_PER_DAY, None, 2, 3, self.calculateUserConfigControlAvailability, True, True], ["TimekprUserConfWkMonLimitsAdjustmentHrRB", cons.TK_LIMIT_PER_HOUR, None, 2, 3, self.calculateUserConfigControlAvailability, True, True], ["TimekprUserConfWkMonLimitsAdjustmentMinRB", cons.TK_LIMIT_PER_MINUTE, None, 2, 3, self.calculateUserConfigControlAvailability, True, True]] elif pType == "Intervals": tw = "TimekprHourIntervalsTreeView" ls = "TimekprHourIntervalsLS" rb = [["TimekprUserConfDaySettingsSetDaysIntervalsHrRB", cons.TK_LIMIT_PER_HOUR, cons.TK_LIMIT_PER_DAY, None, None, self.calculateUserConfigControlAvailability, False, False], ["TimekprUserConfDaySettingsSetDaysIntervalsMinRB", cons.TK_LIMIT_PER_MINUTE, cons.TK_LIMIT_PER_DAY, None, None, self.calculateUserConfigControlAvailability, False, False]] # depending on selected items isFrom = self._timekprAdminFormBuilder.get_object("TimekprUserConfDaySettingsSetDaysIntervalsFromRB").get_active() # set seconds and display idx for rIdx in range(0, len(rb)): # depending whether start or end is selected we change that rb[rIdx][3] = 4 if isFrom else 5 # seconds rb[rIdx][4] = 1 if isFrom else 2 # time (seconds) to display # opposite indexes (special case) rb[rIdx].append(4 if not isFrom else 5) rb[rIdx].append(1 if not isFrom else 2) # get selected rows (tm, paths) = self._timekprAdminFormBuilder.get_object(tw).get_selection().get_selected_rows() # if rows were selected if paths is not None: # def adj = None # determine adjustment amount for rRb in (rRb for rRb in rb if self._timekprAdminFormBuilder.get_object(rRb[0]).get_active()): # if checked adj = rRb # check type found if adj is not None: # limits store limitsSt = self._timekprAdminFormBuilder.get_object(ls) # idx for path in paths: # get idx idx = tm.get_path(tm.get_iter(path))[0] # for DailyLimits and PlayTimeLimits we do not need to adjust inactive rows if pType in ("DailyLimits", "PlayTimeLimits"): # check if day is active if not limitsSt[idx][2]: # we do not process disabled days continue # for week / month a row that is selected makes limits different (two rows in LS) elif pType == "WeekMonthLimits": if limitsSt[idx][0] == "WK": adj[2] = cons.TK_LIMIT_PER_WEEK elif limitsSt[idx][0] == "MON": adj[2] = cons.TK_LIMIT_PER_MONTH # adjust value secs = int(limitsSt[idx][adj[3]]) + adj[1] * (1 if pAdd else -1) secs = min(adj[2], max(0, secs)) # set up new value limitsSt[idx][adj[3]] = secs limitsSt[idx][adj[4]] = self.formatTimeStr(secs, adj[6], adj[7]) # in case of intervals, we need to manage the end / start of it too if pType == "Intervals": # now check the other end whether start is later than end (from both sides) if (isFrom and limitsSt[idx][adj[3]] > limitsSt[idx][adj[8]]) or (not isFrom and limitsSt[idx][adj[3]] < limitsSt[idx][adj[8]]): # equalize limitsSt[idx][adj[8]] = limitsSt[idx][adj[3]] # format string limitsSt[idx][adj[9]] = self.formatTimeStr(limitsSt[idx][adj[8]], adj[6], adj[7]) # verify control availability by calling configured method (check setup) adj[5]() else: # status self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_NODAY_SELECTED")) def verifyHourIntervals(self, evt): """Verify hour intervals""" # limits store intervalsSt = self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS") intervalIdx = -1 result = False # loop through all entered intervals for rInt in intervalsSt: # get interval seconds intervalIdx += 1 secondsFrom = intervalsSt[intervalIdx][4] secondsTo = intervalsSt[intervalIdx][5] # do not check empty intervals if secondsFrom == 0 == secondsTo and intervalsSt[intervalIdx][0] < 0: continue # len intervalsLen = len(intervalsSt) # whether interval is valid intervalOverlaps = False intervalHourConflictStart = False intervalHourConflictEnd = False intervalDuplicate = False intervalSameStartEnd = False intervalStartEndMismatch = False # check intervals for rIdx in range(0, intervalsLen): # interval boundaries fromSecs = intervalsSt[rIdx][4] toSecs = intervalsSt[rIdx][5] result = False errIdx = None # do not check empty intervals if fromSecs == 0 == toSecs and intervalsSt[rIdx][0] < 0: continue # start is the same as end if secondsFrom == secondsTo: # this is it intervalSameStartEnd = True elif secondsFrom > secondsTo: # this is it intervalStartEndMismatch = True # these are for all hours if intervalIdx != rIdx and not (intervalSameStartEnd or intervalStartEndMismatch): # check whether user tries to insert duplicate iterval if fromSecs == secondsFrom or toSecs == secondsTo: # this is it intervalDuplicate = True # check whether start is betwen existing interval elif secondsFrom < fromSecs < secondsTo or secondsFrom < toSecs < secondsTo: # this is it intervalOverlaps = True # check whether start is betwen existing interval elif fromSecs < secondsFrom < toSecs or fromSecs < secondsTo < toSecs: # this is it intervalOverlaps = True # check whether user tries to insert iterval that doesn'y overlaps with start / end hours from other intervals, but are on the same day elif int(fromSecs/cons.TK_LIMIT_PER_HOUR) <= int(secondsFrom/cons.TK_LIMIT_PER_HOUR) <= int(toSecs/cons.TK_LIMIT_PER_HOUR) and int(secondsFrom/cons.TK_LIMIT_PER_HOUR) * cons.TK_LIMIT_PER_HOUR not in (secondsTo, toSecs): # this is it intervalHourConflictStart = True # check whether user tries to insert iterval that doesn'y overlaps with start / end hours from other intervals, but are on the same day elif int(fromSecs/cons.TK_LIMIT_PER_HOUR) <= int(secondsTo/cons.TK_LIMIT_PER_HOUR) <= int(toSecs/cons.TK_LIMIT_PER_HOUR) and int(secondsTo/cons.TK_LIMIT_PER_HOUR) * cons.TK_LIMIT_PER_HOUR not in (secondsTo, toSecs): # this is it intervalHourConflictEnd = True # get final result whether intervals are ok result = (intervalOverlaps or intervalHourConflictStart or intervalHourConflictEnd or intervalDuplicate or intervalSameStartEnd or intervalStartEndMismatch) # if we have errors if intervalsSt[rIdx][7] != result or result: # mark offending row intervalsSt[rIdx][6] = self._ROWCOL_NOK if result else self._ROWCOL_OK intervalsSt[rIdx][7] = self._ROWSTYLE_NOK if result else self._ROWSTYLE_OK # mark checked row too intervalsSt[intervalIdx][6] = self._ROWCOL_NOK if result else self._ROWCOL_OK intervalsSt[intervalIdx][7] = self._ROWSTYLE_NOK if result else self._ROWSTYLE_OK # we have a problem if result: # set ofending row and finish up errIdx = rIdx # interval is not ok, remove id intervalsSt[rIdx][0] = -1 # exit on first error break else: # assingn an id intervalsSt[intervalIdx][0] = intervalIdx # scroll to first error if result: # set status message if fail if intervalOverlaps: self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_INTERVAL_OVERLAP_DETECTED")) elif intervalHourConflictStart: self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_INTERVALSTART_CONFLICT_DETECTED")) elif intervalHourConflictEnd: self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_INTERVALEND_CONFLICT_DETECTED")) elif intervalDuplicate: self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_INTERVAL_DUPLICATE_DETECTED")) elif intervalSameStartEnd: self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_INTERVAL_STARTENDEQUAL_DETECTED")) elif intervalStartEndMismatch: self.setTimekprStatus(False, msg.getTranslation("TK_MSG_STATUS_INTERVAL_ENDLESSTHANSTART_DETECTED")) else: # sort self.sortHourIntervals() self.setTimekprStatus(False, "") self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").set_cursor(errIdx) self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsTreeView").scroll_to_cell(errIdx) break if not result: # sort intervals self.sortHourIntervals() # rebuild hour intervals self.rebuildHoursFromIntervals() # calculate control availability self.calculateUserConfigControlAvailability() def rebuildHoursFromIntervals(self): """Rebuild hours from intervals in GUI, representation to user is different than actual config""" # get days days = self.getSelectedDays() # day is here if len(days) > 0: # first day day = days[0]["nr"] # clear internal hour representation self._tkSavedCfg["timeLimitDaysHoursActual"][day] = {} # remove selected item for rIt in self._timekprAdminFormBuilder.get_object("TimekprHourIntervalsLS"): # start time calcTime = cons.TK_DATETIME_START + timedelta(seconds=rIt[4]) # total seconds totalSeconds = rIt[5] - rIt[4] # failover maxIt = 30 # now loop through time in interval while totalSeconds > 0 and maxIt > 0: # failover maxIt -= 1 # hour calcHour = str(calcTime.hour) # build up hour self._tkSavedCfg["timeLimitDaysHoursActual"][day][calcHour] = {cons.TK_CTRL_SMIN: calcTime.minute, cons.TK_CTRL_EMIN: None, cons.TK_CTRL_UACC: rIt[8]} # calc end of the hour timeToSubtract = min(cons.TK_LIMIT_PER_HOUR - calcTime.minute * cons.TK_LIMIT_PER_MINUTE, totalSeconds) # adjust time calcTime += timedelta(seconds=timeToSubtract) # subtract hour totalSeconds -= timeToSubtract # add end hour self._tkSavedCfg["timeLimitDaysHoursActual"][day][calcHour][cons.TK_CTRL_EMIN] = cons.TK_LIMIT_PER_MINUTE if calcTime.minute == 0 else calcTime.minute # set this up to all selected rows for rDay in days: # set to all days (except the one we modified) if rDay["nr"] != day: # copy config self._tkSavedCfg["timeLimitDaysHoursActual"][rDay["nr"]] = self._tkSavedCfg["timeLimitDaysHoursActual"][day].copy() # --------------- additional and misc methods --------------- # def timekprLogoClicked(self, evt, smth): """Open link to development support page, disabled, and maybe never will be enabled :)""" if 1 == 1: pass elif os.geteuid() == 0: # copy to clipboard and show message Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD).set_text(cons.TK_DEV_SUPPORT_PAGE, -1) tkrMsg = Gtk.MessageDialog(parent=self._timekprAdminForm, flags=Gtk.DialogFlags.MODAL, type=Gtk.MessageType.INFO, buttons=Gtk.ButtonsType.OK, message_format="\nDonations link copied to clipbard!\nPlease paste the address in internet browser.\nThanks for your support!") tkrMsg.run() tkrMsg.destroy() else: # open link webbrowser.open(cons.TK_DEV_SUPPORT_PAGE, new=2, autoraise=True) def closePropertiesSignal(self, evt, smth): """Close the config form""" # close self._mainLoop.quit() # flush log log.flushLogFile() timekpr-next/client/gui/clientgui.py000664 001750 001750 00000113625 14021162252 021577 0ustar00bezvfedubezvfedu000000 000000 """ Created on Aug 28, 2018 @author: mjasnik """ import gi import os import re gi.require_version("Gtk", "3.0") from gi.repository import Gtk from datetime import datetime, timedelta # timekpr imports from timekpr.common.constants import constants as cons from timekpr.common.log import log from timekpr.common.constants import messages as msg # constant _NO_TIME_LABEL = "--:--:--" _NO_TIME_LABEL_SHORT = "--:--" _NO_TIME_LIMIT_LABEL = "--:--:--:--" _HOUR_REGEXP = re.compile("^([0-9]{1,2})$") _HOUR_MIN_REGEXP = re.compile("^([0-9]{1,2}):([0-9]{1,2})$") class timekprGUI(object): """Main class for supporting timekpr forms""" def __init__(self, pTimekprVersion, pTimekprClientConfig, pUsername, pUserNameFull): """Initialize gui""" # set up base variables self._userName = pUsername self._timekprVersion = pTimekprVersion self._timekprClientConfig = pTimekprClientConfig self._timekprPTPageNr = 2 # sets up limit variables self._timeSpent = None self._timeSpentWeek = None self._timeSpentMonth = None self._timeInactive = None self._timeLeftToday = None self._timeLeftContinous = None self._timeTrackInactive = True self._timeTimeLimitOverridePT = False self._timeUnaccountedIntervalsFlagPT = False self._timeSpentPT = None self._timeLeftPT = None self._timePTActivityCntStr = "0" self._limitConfig = {} # change tracking self._configChanged = False # ## forms builders ## # init about builder self._timekprAboutDialogBuilder = Gtk.Builder() # get our dialog self._timekprAboutDialogBuilder.add_from_file(os.path.join(self._timekprClientConfig.getTimekprSharedDir(), "client/forms", "about.glade")) # get main form (to set various runtime things) self._timekprAboutDialog = self._timekprAboutDialogBuilder.get_object("timekprAboutDialog") # init config builder self._timekprConfigDialogBuilder = Gtk.Builder() # get our dialog self._timekprConfigDialogBuilder.add_from_file(os.path.join(self._timekprClientConfig.getTimekprSharedDir(), "client/forms", "client.glade")) # get main form (to set various runtime things) self._timekprConfigDialog = self._timekprConfigDialogBuilder.get_object("timekprConfigDialog") self._timekprAboutDialogBuilder.connect_signals(self) self._timekprConfigDialogBuilder.connect_signals(self) # set up username (this does not change) self._timekprConfigDialogBuilder.get_object("timekprUsernameLB").set_text("%s (%s)" % (self._userName, pUserNameFull) if pUserNameFull != "" else self._userName) # this sets up columns for days config col = Gtk.TreeViewColumn("Day", Gtk.CellRendererText(), text=1) col.set_min_width(100) self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysDaysTreeview").append_column(col) col = Gtk.TreeViewColumn("Limit", Gtk.CellRendererText(), text=2) col.set_min_width(60) self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysDaysTreeview").append_column(col) # this sets up columns for interval list # interval string col = Gtk.TreeViewColumn("Interval", Gtk.CellRendererText(), text=0) self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysIntervalsTreeview").append_column(col) # unaccountable interval column col = Gtk.TreeViewColumn("Unaccounted", Gtk.CellRendererText(), text=1) col.set_min_width(10) self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysIntervalsTreeview").append_column(col) # PlayTime # this sets up columns for limits list col = Gtk.TreeViewColumn("Day", Gtk.CellRendererText(), text=1) col.set_min_width(100) self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsDaysTreeview").append_column(col) col = Gtk.TreeViewColumn("Limit", Gtk.CellRendererText(), text=2) col.set_min_width(60) self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsDaysTreeview").append_column(col) # this sets up columns for process list col = Gtk.TreeViewColumn("Day", Gtk.CellRendererText(), text=0) col.set_min_width(140) self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsApplsTreeview").append_column(col) # hide PT page by default self._timekprConfigDialogBuilder.get_object("timekprConfigNotebook").get_nth_page(self._timekprPTPageNr).set_visible(False) # hide PT config as well self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigPlayTimeGrid").set_visible(False) # initial config (everything is to the max) for i in range(0, 7): # set up default limits self._limitConfig[str(i+1)] = {cons.TK_CTRL_LIMITD: None, cons.TK_CTRL_INT: [[None, None, False]]} # initialize week and month limits self._limitConfig[cons.TK_CTRL_LIMITW] = {cons.TK_CTRL_LIMITW: None} self._limitConfig[cons.TK_CTRL_LIMITM] = {cons.TK_CTRL_LIMITM: None} # ## notification configuration ## # Less than rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_NOTIF_CONFIG_TIME_PHLD_LABEL")) rend.connect("edited", self.userTimeEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_NOTIF_CONFIG_TIME_LABEL"), rend, text=1) col.set_min_width(90) self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigTreeView").append_column(col) # importance rend = Gtk.CellRendererCombo() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_NOTIF_CONFIG_IMPORTANCE_PHLD_LABEL")) rend.set_property("model", self._timekprConfigDialogBuilder.get_object("TimekprNotificationPrioritiesLS")) rend.set_property("text-column", 1) rend.set_property("has-entry", False) rend.connect("edited", self.userPriorityEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_NOTIF_CONFIG_IMPORTANCE_LABEL"), rend, text=3) col.set_min_width(120) self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigTreeView").append_column(col) # clear self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigLS").clear() # ## PlayTime notification configuration ## # Less than rend = Gtk.CellRendererText() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_NOTIF_CONFIG_TIME_PHLD_LABEL")) rend.connect("edited", self.userPlayTimeEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_NOTIF_CONFIG_TIME_LABEL"), rend, text=1) col.set_min_width(90) self._timekprConfigDialogBuilder.get_object("TimekprUserPlayTimeNotificationConfigTreeView").append_column(col) # importance rend = Gtk.CellRendererCombo() rend.set_property("editable", True) rend.set_property("placeholder-text", msg.getTranslation("TK_MSG_NOTIF_CONFIG_IMPORTANCE_PHLD_LABEL")) rend.set_property("model", self._timekprConfigDialogBuilder.get_object("TimekprNotificationPrioritiesLS")) rend.set_property("text-column", 1) rend.set_property("has-entry", False) rend.connect("edited", self.userPlayTimePriorityEdited) col = Gtk.TreeViewColumn(msg.getTranslation("TK_MSG_NOTIF_CONFIG_IMPORTANCE_LABEL"), rend, text=3) col.set_min_width(120) self._timekprConfigDialogBuilder.get_object("TimekprUserPlayTimeNotificationConfigTreeView").append_column(col) # clear self._timekprConfigDialogBuilder.get_object("TimekprUserPlayTimeNotificationConfigLS").clear() # status self.setStatus(msg.getTranslation("TK_MSG_STATUS_STARTED")) # --------------- TMP (move to proper places later) --------------- # def userTimeEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.setTimeValue(path, text, pConfType="Time") def userPlayTimeEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.setTimeValue(path, text, pConfType="PlayTime") def userPriorityEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.setPriorityValue(path, text, "Time") def userPlayTimePriorityEdited(self, widget, path, text): """Set internal representation of in-place edited value""" self.setPriorityValue(path, text, "PlayTime") def setTimeValue(self, path, text, pConfType): """Verify and set time string values""" # element prioLs = "TimekprUserNotificationConfigLS" if pConfType == "Time" else "TimekprUserPlayTimeNotificationConfigLS" # store timelSt = self._timekprConfigDialogBuilder.get_object(prioLs) # value before secsBefore = timelSt[path][0] secs = None # verify values if _HOUR_REGEXP.match(text): # calculate seconds secs = min(int(_HOUR_REGEXP.sub(r"\1", text)) * cons.TK_LIMIT_PER_HOUR, cons.TK_LIMIT_PER_DAY) elif _HOUR_MIN_REGEXP.match(text): # calculate seconds secs = min(int(_HOUR_MIN_REGEXP.sub(r"\1", text)) * cons.TK_LIMIT_PER_HOUR + int(_HOUR_MIN_REGEXP.sub(r"\2", text)) * cons.TK_LIMIT_PER_MINUTE, cons.TK_LIMIT_PER_DAY) # if we could calculate seconds (i.e. entered text is correct) if secs is not None: # only if changed if secsBefore != secs: # check if we have this interval already dupl = [rPrio for rPrio in timelSt if rPrio[0] == secs] # we can not allow duplicates if not len(dupl) > 0: # format secs textStr = self.formatTimeStr(cons.TK_DATETIME_START + timedelta(seconds=secs), "s") # set values timelSt[path][0] = secs timelSt[path][1] = textStr # sort self.sortNotificationConfig(pConfType) # verify controls too self.processConfigChanged() def setPriorityValue(self, path, text, pConfType): """Verify and set time string values""" # element prioLs = "TimekprUserNotificationConfigLS" if pConfType == "Time" else "TimekprUserPlayTimeNotificationConfigLS" # store priolSt = self._timekprConfigDialogBuilder.get_object(prioLs) # value before prioBefore = priolSt[path][3] # only if priority actuall changed if prioBefore != text: # find selected value val = [(rVal[0], rVal[1]) for rVal in self._timekprConfigDialogBuilder.get_object("TimekprNotificationPrioritiesLS") if rVal[1] == text] # set values priolSt[path][2] = val[0][0] priolSt[path][3] = val[0][1] # verify controls too self.processConfigChanged() def addNotificationConfigClicked(self, evt): """Add notification interval to the list""" self.addNotificationConf("Time") def addPlayTimeNotificationConfigClicked(self, evt): """Add notification interval to the list""" self.addNotificationConf("PlayTime") def removeNotificationConfigClicked(self, evt): """Remove notification interval""" self.removeNotificationConf("Time") def removePlayTimeNotificationConfigClicked(self, evt): """Remove notification interval""" self.removeNotificationConf("PlayTime") def addNotificationConf(self, pConfType): """Add notification interval to the list""" prioSt = self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigLS" if pConfType == "Time" else "TimekprUserPlayTimeNotificationConfigLS") prioTw = self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigTreeView" if pConfType == "Time" else "TimekprUserPlayTimeNotificationConfigTreeView") prioLen = len(prioSt) # add addRow = True # check if the last one is not empty (no need to add more empty rows) if (prioLen > 0 and prioSt[prioLen-1][0] < 0): addRow = False # we can add the row if addRow: # add prioSt.append([-1, "", "", ""]) # scroll to end prioTw.set_cursor(prioLen) prioTw.scroll_to_cell(prioLen) def removeNotificationConf(self, pConfType): """Remove notification interval""" # defaults prioSt = self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigLS" if pConfType == "Time" else "TimekprUserPlayTimeNotificationConfigLS") # refresh the child (tm, ti) = self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigTreeView" if pConfType == "Time" else "TimekprUserPlayTimeNotificationConfigTreeView").get_selection().get_selected() # only if there is smth selected elemIdx = tm.get_path(ti)[0] if ti is not None else None # only if something is selected if elemIdx is not None: rIdx = 0 # remove selected item for rIt in prioSt: if elemIdx == rIdx: # remove prioSt.remove(rIt.iter) # count further rIdx += 1 # verify controls too self.processConfigChanged() def sortNotificationConfig(self, pConfType): """Sort notification config for ease of use""" # element prioSt = self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigLS" if pConfType == "Time" else "TimekprUserPlayTimeNotificationConfigLS") # sort vairables prio = {} rIdx = 0 # prepare sort for rIt in prioSt: prio[rIt[0]] = rIdx # count further rIdx += 1 # set sort order sortedPrio = [] # set up proper order for rKey in sorted(prio, reverse=True): # append to order sortedPrio.append(prio[rKey]) # reorder rows in liststore prioSt.reorder(sortedPrio) # --------------- helper methods --------------- # def formatTimeStr(self, pTime, pFormatType="f"): """Format time for output on form""" # f - full, s - short, t - time # final result timeStr = None if pTime is None: timeStr = _NO_TIME_LABEL_SHORT if pFormatType == "s" else _NO_TIME_LABEL if pFormatType == "t" else _NO_TIME_LIMIT_LABEL else: # calculate days days = (pTime - cons.TK_DATETIME_START).days # calculate hours and mins hrMin = "%s:%s" % (("24" if pFormatType != "f" and days >= 1 else str(pTime.hour)).rjust(2, "0"), str(pTime.minute).rjust(2, "0")) # calculate secs secs = str(pTime.second).rjust(2, "0") # final composition # for limit time (h:m:s) if pFormatType == "t": timeStr = "%s:%s" % (hrMin, secs) # for full time (d:h:m:s) else: timeStr = "%s:%s:%s" % (str(days).rjust(2, "0"), hrMin, secs) if pFormatType != "s" else hrMin # return return timeStr def renewUserConfiguration(self): """Update configuration options""" # if speech is not supported, we disable and uncheck the box if self._timekprClientConfig.getIsNotificationSpeechSupported(): # disable speech self._timekprConfigDialogBuilder.get_object("timekprUseSpeechNotifCB").set_sensitive(False) # if sound is not supported by libnotify implementation, we disable and uncheck the box if self._timekprClientConfig.getIsNotificationSoundSupported(): # disable speech self._timekprConfigDialogBuilder.get_object("timekprUseNotificationSoundCB").set_sensitive(False) # user config self._timekprConfigDialogBuilder.get_object("timekprLimitChangeNotifCB").set_active(self._timekprClientConfig.getClientShowLimitNotifications()) self._timekprConfigDialogBuilder.get_object("timekprShowAllNotifCB").set_active(self._timekprClientConfig.getClientShowAllNotifications()) self._timekprConfigDialogBuilder.get_object("timekprUseSpeechNotifCB").set_active(self._timekprClientConfig.getClientUseSpeechNotifications()) self._timekprConfigDialogBuilder.get_object("timekprShowSecondsCB").set_active(self._timekprClientConfig.getClientShowSeconds()) self._timekprConfigDialogBuilder.get_object("timekprUseNotificationSoundCB").set_active(self._timekprClientConfig.getClientUseNotificationSound()) self._timekprConfigDialogBuilder.get_object("timekprNotificationTimeoutSB").set_value(self._timekprClientConfig.getClientNotificationTimeout()) self._timekprConfigDialogBuilder.get_object("timekprNotificationTimeoutCriticalSB").set_value(self._timekprClientConfig.getClientNotificationTimeoutCritical()) self._timekprConfigDialogBuilder.get_object("timekprLogLevelSB").set_value(self._timekprClientConfig.getClientLogLevel()) # priority config prioConfSt = self._timekprConfigDialogBuilder.get_object("TimekprNotificationPrioritiesLS") # load notification priorities prioSt = self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigLS") prioSt.clear() for rPrio in self._timekprClientConfig.getClientNotificationLevels(): # append intervals val = [(rVal[0], rVal[1]) for rVal in prioConfSt if rVal[0] == cons.TK_PRIO_LVL_MAP[rPrio[1]]] prioSt.append([rPrio[0], self.formatTimeStr(cons.TK_DATETIME_START + timedelta(seconds=rPrio[0]), "s"), val[0][0], val[0][1]]) # sort configd self.sortNotificationConfig("Time") # load PlayTime notification priorities prioSt = self._timekprConfigDialogBuilder.get_object("TimekprUserPlayTimeNotificationConfigLS") prioSt.clear() for rPrio in self._timekprClientConfig.getClientPlayTimeNotificationLevels(): # append intervals val = [(rVal[0], rVal[1]) for rVal in prioConfSt if rVal[0] == cons.TK_PRIO_LVL_MAP[rPrio[1]]] prioSt.append([rPrio[0], self.formatTimeStr(cons.TK_DATETIME_START + timedelta(seconds=rPrio[0]), "s"), val[0][0], val[0][1]]) # sort config self.sortNotificationConfig("PlayTime") # verify controls too self.processConfigChanged() def renewLimits(self, pTimeInformation=None): """Renew information to be show for user in GUI""" # sets time left if pTimeInformation is not None: # limits self._timeSpent = cons.TK_DATETIME_START + timedelta(seconds=pTimeInformation[cons.TK_CTRL_SPENT]) self._timeSpentWeek = cons.TK_DATETIME_START + timedelta(seconds=pTimeInformation[cons.TK_CTRL_SPENTW]) self._timeSpentMonth = cons.TK_DATETIME_START + timedelta(seconds=pTimeInformation[cons.TK_CTRL_SPENTM]) self._timeInactive = cons.TK_DATETIME_START + timedelta(seconds=pTimeInformation[cons.TK_CTRL_SLEEP]) self._timeLeftToday = cons.TK_DATETIME_START + timedelta(seconds=pTimeInformation[cons.TK_CTRL_LEFTD]) self._timeLeftContinous = cons.TK_DATETIME_START + timedelta(seconds=pTimeInformation[cons.TK_CTRL_LEFT]) self._timeTrackInactive = True if pTimeInformation[cons.TK_CTRL_TRACK] else False self._timeTimeLimitOverridePT = bool(pTimeInformation[cons.TK_CTRL_PTTLO]) if cons.TK_CTRL_PTTLO in pTimeInformation else False self._timeUnaccountedIntervalsFlagPT = bool(pTimeInformation[cons.TK_CTRL_PTAUH]) if cons.TK_CTRL_PTAUH in pTimeInformation else False self._timeSpentPT = cons.TK_DATETIME_START + timedelta(seconds=pTimeInformation[cons.TK_CTRL_PTSPD]) if cons.TK_CTRL_PTSPD in pTimeInformation else None self._timeLeftPT = cons.TK_DATETIME_START + timedelta(seconds=pTimeInformation[cons.TK_CTRL_PTLPD]) if cons.TK_CTRL_PTLPD in pTimeInformation else None self._timePTActivityCntStr = str(pTimeInformation[cons.TK_CTRL_PTLSTC] if cons.TK_CTRL_PTLSTC in pTimeInformation else 0) # calculate strings to show (and show only those, which have data) timeSpentStr = self.formatTimeStr(self._timeSpent) timeSpentWeekStr = self.formatTimeStr(self._timeSpentWeek) timeSpentMonthStr = self.formatTimeStr(self._timeSpentMonth) timeSleepStr = self.formatTimeStr(self._timeInactive) timeLeftTodayStr = self.formatTimeStr(self._timeLeftToday) timeLeftTotalStr = self.formatTimeStr(self._timeLeftContinous) timeSpentPTStr = self.formatTimeStr(self._timeSpentPT) timeLeftPTStr = self.formatTimeStr(self._timeLeftPT if self._timeLeftPT is None else min(self._timeLeftPT, self._timeLeftToday)) if not self._timeTimeLimitOverridePT else _NO_TIME_LABEL # sets up stuff self._timekprConfigDialogBuilder.get_object("timekprLimitInfoTimeSpeneLB").set_text(timeSpentStr) self._timekprConfigDialogBuilder.get_object("timekprLimitInfoTimeSpentWeeeLB").set_text(timeSpentWeekStr) self._timekprConfigDialogBuilder.get_object("timekprLimitInfoTimeSpentMonteLB").set_text(timeSpentMonthStr) self._timekprConfigDialogBuilder.get_object("timekprLimitInfoTimeInactiveLB").set_text(timeSleepStr) self._timekprConfigDialogBuilder.get_object("timekprLimitInfoTimeLeftTodaeLB").set_text(timeLeftTodayStr) self._timekprConfigDialogBuilder.get_object("timekprLimitInfoContTimeLefeLB").set_text(timeLeftTotalStr) self._timekprConfigDialogBuilder.get_object("timekprLimitInfoTrackInactiveCB").set_active(self._timeTrackInactive) self._timekprConfigDialogBuilder.get_object("timekprPTLimitInfoTimeLimitOverrideLB").set_active(self._timeTimeLimitOverridePT) self._timekprConfigDialogBuilder.get_object("timekprPTLimitInfoUnaccountedIntervalsFlagLB").set_active(self._timeUnaccountedIntervalsFlagPT) self._timekprConfigDialogBuilder.get_object("timekprPTLimitInfoTimeSpentTodayLB").set_text(timeSpentPTStr) self._timekprConfigDialogBuilder.get_object("timekprPTLimitInfoTimeLeftTodayLB").set_text(timeLeftPTStr) self._timekprConfigDialogBuilder.get_object("timekprPTLimitInfoActivityCountLB").set_text(self._timePTActivityCntStr) def setStatus(self, pStatus): """Change status of timekpr""" if pStatus is not None: # get main status statusBar = self._timekprConfigDialogBuilder.get_object("timekprStatusBar") contextId = statusBar.get_context_id("status") # pop existing message and add new one statusBar.remove_all(contextId) statusBar.push(contextId, pStatus) def renewLimitConfiguration(self, pLimits=None): """Renew information to be show for user""" # if there is smth if pLimits is not None: # new limits appeared self._limitConfig = pLimits # hide PT page by default enablePT = False # clear out days / limits / processes self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysDaysLS").clear() self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsDaysLS").clear() self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsActsLS").clear() # go in sorted order for rKey in sorted(self._limitConfig): # some of configuration needs different approach if rKey in (cons.TK_CTRL_LIMITW, cons.TK_CTRL_LIMITM): # set locally if self._limitConfig[rKey][rKey] is not None: # limit timeLimitWKMON = cons.TK_DATETIME_START + timedelta(seconds=self._limitConfig[rKey][rKey]) # limit timeLimitWKMONStr = self.formatTimeStr(timeLimitWKMON) else: timeLimitWKMONStr = _NO_TIME_LIMIT_LABEL # set week limit if rKey == cons.TK_CTRL_LIMITW: # set up limits self._timekprConfigDialogBuilder.get_object("timekprLimitForWeeeLB").set_text(timeLimitWKMONStr) elif rKey == cons.TK_CTRL_LIMITM: # set up limits self._timekprConfigDialogBuilder.get_object("timekprLimitForMonteLB").set_text(timeLimitWKMONStr) # check for override elif rKey == cons.TK_CTRL_PTTLO: # if enabled self._timeTimeLimitOverridePT = True if bool(self._limitConfig[rKey][rKey]) else False # check for allowed during unaccounted intervals elif rKey == cons.TK_CTRL_PTAUH: # if enabled self._timeUnaccountedIntervalsFlagPT = True if bool(self._limitConfig[rKey][rKey]) else False # for the days limits elif rKey in ("1", "2", "3", "4", "5", "6", "7"): # get time limit string timeLimitStr = self.formatTimeStr(cons.TK_DATETIME_START + timedelta(seconds=self._limitConfig[rKey][cons.TK_CTRL_LIMITD]) if self._limitConfig[rKey][cons.TK_CTRL_LIMITD] is not None else None, "t") # add limit to the list self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysDaysLS").append([rKey, (cons.TK_DATETIME_START + timedelta(days=int(rKey)-1)).strftime("%A"), "%s" % (timeLimitStr)]) # current day currDay = datetime.now().isoweekday()-1 # calculate day index for scrolling dayIdx = 0 finalDayIdx = None # PT limits are processed separately due to override detection if cons.TK_CTRL_PTLMT in self._limitConfig and cons.TK_CTRL_PTLST in self._limitConfig and cons.TK_CTRL_PTTLE in self._limitConfig: # PlayTime for rKey in (cons.TK_CTRL_PTLMT, cons.TK_CTRL_PTLST, cons.TK_CTRL_PTTLE): # PT enable if rKey == cons.TK_CTRL_PTTLE: # enable PT enablePT = bool(self._limitConfig[rKey][cons.TK_CTRL_PTTLE]) # PT limits elif rKey == cons.TK_CTRL_PTLMT: # for all days for rDay in self._limitConfig[rKey][cons.TK_CTRL_PTLMT]: # count dayIdx += 1 # if override enabled, we do not show limits because that's not meaningful timeLimitStr = self.formatTimeStr(cons.TK_DATETIME_START + timedelta(seconds=rDay[1]) if not self._timeTimeLimitOverridePT else None, "t") # add to the list self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsDaysLS").append([rDay[0], (cons.TK_DATETIME_START + timedelta(days=int(rDay[0])-1)).strftime("%A"), "%s" % (timeLimitStr)]) # if alllowed list has current day if currDay == int(rDay[0]) + 1: # index finalDayIdx = dayIdx # PT process list elif rKey == cons.TK_CTRL_PTLST: # all activities (source array format: 0 - friendly name, 1 - process name) for rAppl in self._limitConfig[rKey][cons.TK_CTRL_PTLST]: # add process to the list self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsActsLS").append(["%s" % (rAppl[1] if rAppl[1] != "" else rAppl[0])]) # determine curent day and point to it self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysDaysTreeview").set_cursor(currDay) self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysDaysTreeview").scroll_to_cell(currDay) # do the same for PT if finalDayIdx is not None: # scroll to current day self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsDaysTreeview").set_cursor(currDay) self._timekprConfigDialogBuilder.get_object("timekprPTAllowedDaysLimitsDaysTreeview").scroll_to_cell(currDay) def processConfigChanged(self): """Determine whether config has been changed and enable / disable apply""" # initial configChanged = False # determine what's changed configChanged = configChanged or self._timekprConfigDialogBuilder.get_object("timekprLimitChangeNotifCB").get_active() != self._timekprClientConfig.getClientShowLimitNotifications() configChanged = configChanged or self._timekprConfigDialogBuilder.get_object("timekprShowAllNotifCB").get_active() != self._timekprClientConfig.getClientShowAllNotifications() configChanged = configChanged or self._timekprConfigDialogBuilder.get_object("timekprUseSpeechNotifCB").get_active() != self._timekprClientConfig.getClientUseSpeechNotifications() configChanged = configChanged or self._timekprConfigDialogBuilder.get_object("timekprShowSecondsCB").get_active() != self._timekprClientConfig.getClientShowSeconds() configChanged = configChanged or self._timekprConfigDialogBuilder.get_object("timekprUseNotificationSoundCB").get_active() != self._timekprClientConfig.getClientUseNotificationSound() configChanged = configChanged or self._timekprConfigDialogBuilder.get_object("timekprNotificationTimeoutSB").get_value_as_int() != self._timekprClientConfig.getClientNotificationTimeout() configChanged = configChanged or self._timekprConfigDialogBuilder.get_object("timekprNotificationTimeoutCriticalSB").get_value_as_int() != self._timekprClientConfig.getClientNotificationTimeoutCritical() configChanged = configChanged or self._timekprConfigDialogBuilder.get_object("timekprLogLevelSB").get_value_as_int() != self._timekprClientConfig.getClientLogLevel() # interval changes tmpVal = [[rVal[0], cons.TK_PRIO_LVL_MAP[rVal[2]]] for rVal in self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigLS") if rVal[2] in cons.TK_PRIO_LVL_MAP and rVal[0] > 0] configChanged = configChanged or self._timekprClientConfig.getClientNotificationLevels() != tmpVal # interval changes tmpVal = [[rVal[0], cons.TK_PRIO_LVL_MAP[rVal[2]]] for rVal in self._timekprConfigDialogBuilder.get_object("TimekprUserPlayTimeNotificationConfigLS") if rVal[2] in cons.TK_PRIO_LVL_MAP and rVal[0] > 0] configChanged = configChanged or self._timekprClientConfig.getClientPlayTimeNotificationLevels() != tmpVal # this is it self._timekprConfigDialogBuilder.get_object("timekprSaveBT").set_sensitive(configChanged) # --------------- init methods --------------- # def initAboutForm(self): """Initialize about form""" # version self._timekprAboutDialog.set_version(self._timekprVersion) # comment self._timekprAboutDialog.set_comments(msg.getTranslation("TK_MSG_LOGO_LABEL")) # show up all self._timekprAboutDialog.show() self._timekprAboutDialog.run() # hide for later use self._timekprAboutDialog.hide() def initConfigForm(self): """Initialize config form""" # refresh info self.renewUserConfiguration() self.renewLimits() self.renewLimitConfiguration() self.configPageSwitchSignal() # show up all self._timekprConfigDialog.show() self._timekprConfigDialog.run() # hide for later use self._timekprConfigDialog.hide() # --------------- user clicked methods --------------- # def clientConfigChangedSignal(self, evt): """Process config changed signal""" self.processConfigChanged() def daysChangedSignal(self, evt): """Refresh intervals when days change""" # refresh the child (tm, ti) = self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysDaysTreeview").get_selection().get_selected() # only if there is smth selected if ti is not None: # get current seconds dt = datetime.now().replace(microsecond=0) dtd = str(datetime.date(dt).isoweekday()) dts = (dt - datetime.now().replace(microsecond=0, second=0, minute=0, hour=0)).total_seconds() idx = 0 selIdx = 0 # clear out existing intervals self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysIntervalsLS").clear() # fill intervals only if that day exists if tm.get_value(ti, 0) in self._limitConfig: # if no intervals if not self._limitConfig[tm.get_value(ti, 0)][cons.TK_CTRL_INT]: # fill in the intervals with empty values self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysIntervalsLS").append([("%s - %s") % (_NO_TIME_LABEL_SHORT, _NO_TIME_LABEL_SHORT), ""]) else: # fill the intervals for r in self._limitConfig[tm.get_value(ti, 0)][cons.TK_CTRL_INT]: # determine which is the current hour selIdx = idx if r[0] is not None and r[0] <= dts <= r[1] and dtd == tm.get_value(ti, 0) else selIdx # if we have no data, we fill this up with nothing if r[0] is None or (r[0] == 0 and r[1] == 0): # fill in the intervals with empty values self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysIntervalsLS").append([("%s - %s") % (_NO_TIME_LABEL_SHORT, _NO_TIME_LABEL_SHORT), ""]) else: start = (cons.TK_DATETIME_START + timedelta(seconds=r[0])) end = (cons.TK_DATETIME_START + timedelta(seconds=r[1])) uacc = "∞" if r[2] else "" # fill in the intervals self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysIntervalsLS").append([("%s:%s - %s:%s") % (str(start.hour).rjust(2, "0"), str(start.minute).rjust(2, "0"), str(end.hour).rjust(2, "0") if r[1] < cons.TK_LIMIT_PER_DAY else "24", str(end.minute).rjust(2, "0")), uacc]) # count idx += 1 # set selection to found row self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysIntervalsTreeview").set_cursor(selIdx) self._timekprConfigDialogBuilder.get_object("timekprAllowedDaysIntervalsTreeview").scroll_to_cell(selIdx) def configPageSwitchSignal(self, nb=None, pg=None, pgn=None): """Enable or disable apply on page change""" # nothing here pass def saveUserConfigSignal(self, evt): """Save the configuration using config file manager""" # get config, set config to manager and save it self._timekprClientConfig.setClientShowLimitNotifications(self._timekprConfigDialogBuilder.get_object("timekprLimitChangeNotifCB").get_active()) self._timekprClientConfig.setClientShowAllNotifications(self._timekprConfigDialogBuilder.get_object("timekprShowAllNotifCB").get_active()) self._timekprClientConfig.setClientUseSpeechNotifications(self._timekprConfigDialogBuilder.get_object("timekprUseSpeechNotifCB").get_active()) self._timekprClientConfig.setClientShowSeconds(self._timekprConfigDialogBuilder.get_object("timekprShowSecondsCB").get_active()) self._timekprClientConfig.setClientUseNotificationSound(self._timekprConfigDialogBuilder.get_object("timekprUseNotificationSoundCB").get_active()) self._timekprClientConfig.setClientNotificationTimeout(self._timekprConfigDialogBuilder.get_object("timekprNotificationTimeoutSB").get_value_as_int()) self._timekprClientConfig.setClientNotificationTimeoutCritical(self._timekprConfigDialogBuilder.get_object("timekprNotificationTimeoutCriticalSB").get_value_as_int()) self._timekprClientConfig.setClientLogLevel(self._timekprConfigDialogBuilder.get_object("timekprLogLevelSB").get_value_as_int()) # save notification priorities tmpVal = [[rVal[0], cons.TK_PRIO_LVL_MAP[rVal[2]]] for rVal in self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigLS") if rVal[2] in cons.TK_PRIO_LVL_MAP and rVal[0] > 0] self._timekprClientConfig.setClientNotificationLevels(tmpVal) # save PlayTime notification priorities tmpVal = [[rVal[0], cons.TK_PRIO_LVL_MAP[rVal[2]]] for rVal in self._timekprConfigDialogBuilder.get_object("TimekprUserPlayTimeNotificationConfigLS") if rVal[2] in cons.TK_PRIO_LVL_MAP and rVal[0] > 0] self._timekprClientConfig.setClientPlayTimeNotificationLevels(tmpVal) # save config self._timekprClientConfig.saveClientConfig() # disable apply for now self._timekprConfigDialogBuilder.get_object("timekprSaveBT").set_sensitive(False) # enable as well log.setLogLevel(self._timekprClientConfig.getClientLogLevel()) def closePropertiesSignal(self, evt): """Close the config form""" # close self._timekprConfigDialog.hide() def preventDestroyingDialogSignal(self, evt, bs): """Prevent destroying the dialog""" return False # --------------- helper methods --------------- # def isPlayTimeAccountingInfoEnabled(self): """Whether PlayTime controls are enabled""" return self._timekprConfigDialogBuilder.get_object("timekprConfigNotebook").get_nth_page(self._timekprPTPageNr).get_visible() def setPlayTimeAccountingInfoEnabled(self, pState): """Whether PlayTime controls are enabled""" # enable page self._timekprConfigDialogBuilder.get_object("timekprConfigNotebook").get_nth_page(self._timekprPTPageNr).set_visible(pState) # enable config self._timekprConfigDialogBuilder.get_object("TimekprUserNotificationConfigPlayTimeGrid").set_visible(pState) timekpr-next/client/gui/__init__.py000664 001750 001750 00000000000 13476006650 021345 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/000775 001750 001750 00000000000 13716566163 017042 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/launchers/000775 001750 001750 00000000000 14017261747 021021 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/launchers/timekpr-client.desktop000664 001750 001750 00000001104 14017261747 025337 0ustar00bezvfedubezvfedu000000 000000 [Desktop Entry] Version=1.0 Name=Timekpr-nExT Client Name[de]=Timekpr-nExT-Client Name[fr]=Client Timekpr-nExT Name[it]=Client Timekpr-nExT Name[lv]=Timekpr-nExT klients Comment=Keep control of computer usage Comment[de]=Kontrolle der Computernutzung Comment[fr]=Gardez le contrôle de l'utilisation de l'ordinateur Comment[it]=Mantieni il controllo sull'utilizzo del computer Comment[lv]=Uzturēt kontroli pār datora lietošanu Exec=/usr/bin/timekprc Icon=timekpr-client Terminal=false Type=Application Categories= X-GNOME-Autostart-enabled=true X-Ubuntu-Gettext-Domain=timekpr timekpr-next/resource/launchers/timekpr-admin.desktop000664 001750 001750 00000001227 14017261747 025157 0ustar00bezvfedubezvfedu000000 000000 [Desktop Entry] Version=1.0 Name=Timekpr-nExT Control Panel Name[de]=Timekpr-nExT-Systemsteuerung Name[fr]=Panneau de configuration Timekpr-nExT Name[it]=Pannello di controllo Timekpr-nExT Name[lv]=Timekpr-nExT vadības panelis Comment=Keep control of computer usage Comment[de]=Kontrolle der Computernutzung Comment[fr]=Gardez le contrôle de l'utilisation de l'ordinateur Comment[it]=Mantieni il controllo sull'utilizzo del computer Comment[lv]=Uzturēt kontroli pār datora lietošanu Exec=/usr/bin/timekpra Icon=timekpr Terminal=false Type=Application Categories=System;Settings;GTK; StartupNotify=true X-AppStream-Ignore=true X-Ubuntu-Gettext-Domain=timekpr timekpr-next/resource/launchers/timekpr-admin-su.desktop000664 001750 001750 00000001444 14017261747 025605 0ustar00bezvfedubezvfedu000000 000000 [Desktop Entry] Version=1.0 Name=(SU) Timekpr-nExT Control Panel (superuser mode) Name[de]=(SU) Timekpr-nExT-Systemsteuerung (Superuser-Modus) Name[fr]=(SU) Panneau de configuration Timekpr-nExT (mode superutilisateur) Name[it]=(SU) Pannello di controllo Timekpr-nExT (modalità superutente) Name[lv]=(SU) Timekpr-nExT vadības panelis (administratora režīms) Comment=Keep control of computer usage Comment[de]=Kontrolle der Computernutzung Comment[fr]=Gardez le contrôle de l'utilisation de l'ordinateur Comment[it]=Mantieni il controllo sull'utilizzo del computer Comment[lv]=Uzturēt kontroli pār datora lietošanu Exec=pkexec /usr/bin/timekpra Icon=timekpr Terminal=false Type=Application Categories=System;Settings;GTK; StartupNotify=true X-AppStream-Ignore=true X-Ubuntu-Gettext-Domain=timekpr timekpr-next/resource/locale/000775 001750 001750 00000000000 14017261747 020274 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/hu/000775 001750 001750 00000000000 13705523357 020711 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/hu/LC_MESSAGES/000775 001750 001750 00000000000 14017261747 022475 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/hu/LC_MESSAGES/timekpr.mo000664 001750 001750 00000061654 14017261747 024521 0ustar00bezvfedubezvfedu000000 000000 % PQl$*0Hf*~%C$iD8  %(Fo$+)*.'YY. LZ r |#%*<3*p#+ & *8%*!<L!3 '9 *HM*j 1( -7V\*s 0 7<RN%( -;0Z%-) > &F m ~  0  !!!! "U/""#""!""%#7(#`#+#2#4#7$K$4e$6$5$7%;?%7{%6%2%&C5&y&&&& &&&D&*9')d''''''3'@)(j(2(.( ()()3)O))c)')))B)#*59**o******I+HQ+S+"+,%*,$P,u,,,<,+,=&-*d-$-6-#-/.'?./g...-.?.,4//a/A/./,0>/0+n00 0006J1(1131G1E2H2L2"P2s2W5q57S4777=77@8PZ8"8?89*9*9b:R{:::1:7;*W;5;;;,;8<9H<2<<O<!=/5=6e=== ==4='%>5M>0>4>O>*9?+d?%??0??@@$@ >@L@a@-x@4@O@0+AL\A2AAA9BTB69C+pCC#CBC DD /DM:DD6D D)DEE22EeE)wEDE%E F%F"DFVgFQF<G8MGG.GIG*H5DH;zH+H9HI;-IiI I+IFI' J1J0K$AK$fK8KpK 5L%@LfL*LL+LFL'5M2]M6M2MKMFN/`N/NBN1O>5O+tOIO9O$P\DPPPPPQQ+Q]?Q&Q&QQR'R?R#YRI}RSRS@;SA|S S+SST1T.ET/tTT TT1TLU8cU,U!UUV Vl4VbViW'nW!W6W&W$X;X*WXaX>XY#Y@}Y0YKY2;ZDnZDZBZP;[3[N[5\GE\b\I\3:]Nn]5]]^^6^<^(_H_7d_S____6 `@`\Ocp'!Q/a[:u(f#k Pm".wb+B@r$o}c,*N-ER&vt0nUl?~A^{DXH Ld39O=T\5 yJSC4j`YqIW 1h)7<gie%KV> M s8zx6G|2_;]ZF%(n)s minute%(n)s minutes%(n)s second%(n)s seconds%(n)s second left%(n)s seconds left%(n)s user in total:%(n)s users in total:---=== NOTICE ===---==> get saved user list from the server, example==> get user configuration and time information from the server, example==> print help, example==> set allowed days for the user, example==> set time left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set time limit per month, example==> set time limit per week, example==> set whether to hide tray icon and prevent notifications, example==> set whether to track inactive user sessions, exampleAboutAbout Timekpr-nExTAdd a user to the exclusion listAdd an excluded session type to the listAdd specified time (reward)Add tracked session type to the listAdditional limitsAdditional statisticsAdditional time for user has been processedAllowed days for user have been processedAllowed hours for user have been processedApply all Timekpr-nExT settings at onceApply daily limitsBrief information about time spent and everything related to time management for this dayClose the windowCommand FAILED: access deniedCommand FAILED: communication was not acceptedConfigurationConfiguration retrievedConnectedConnecting...Continuous time left:Control Timekpr-nExT SettingsControl Timekpr-nExT tracking itemsControl sessions types are not passedControl sessions types list is not correctControl sessions types list is not correct and cannot be setCopyright (c) 2018-2021 Eduards BezverhijsCritical notification timeout (sec)Current effective usernameCurrent statisticsDaily limit configuration for all week daysDaily limitsDayDays & LimitsEduards Bezverhijs (Translations fine-tuning by JP Lord ) (English fine-tuning by Phil Hudson )EnabledExcluded SessionsExcluded UsersExcluded session types are not passedExcluded session types list is not correctExcluded session types list is not correct and cannot be setExcluded user list is not correctExcluded user list is not correct and cannot be setExcluded user list is not passedFailed to connectFeature "%%s", which is used to detect idle time, cannot be enabled! Idle / inactive time might not be accounted when screen is locked!Final warning time "%%s" is not correctFinal warning time "%%s" is not correct and cannot be setFinal warning time is not passedFormat: FromHide icon and notifications:Hide tray icon for user has been processedHour intervalsIcon, isn't it?Info & TodayInternal connection error, please check log filesInterval removedInterval start cannot be the same as endIntervalsKeep control of computer usageLimitLimits & ConfigurationList of usernames registered on the systemLog levelLog level "%%s" is not correctLog level "%%s" is not correct and cannot be setLog level is not passedLogging levelNotes, read carefully ;)Notification timeout (sec)PARAMETER PARSE ERROR (please check parameter validity): %%sPlease reopen the application if you are superuser and Timekpr-nExT is runningPlease select a day to set the limitsPlease select an hour interval to removePoll intervalPoll time "%%s" is not correctPoll time "%%s" is not correct and cannot be setPoll time is not passedRemove a user from the exclusion listRemove an excluded session type from the listRemove excluded session typeRemove tracked session type from the listRestoreRestore configuration from saved stateSave all changesSave timeSave time "%%s" is not correctSave time "%%s" is not correct and cannot be setSave time is not passedSelect whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Session typeShow all notificationsShow limit changesShow seconds in notification areaSpecify whether to show a notification when limit configurations or allowance changesStartedStatus of Timekpr-nExT admin clientStatus of Timekpr-nExT clientSubtract specified time (penalty)Termination timeTermination time "%%s" is not correctTermination time "%%s" is not correct and cannot be setTermination time is not passedThat interval overlaps with an existing oneThat interval's end conflicts with an existing oneThat interval's start conflicts with an existing oneThat interval's start or end duplicates an existing oneThe command is incorrect:The number of hours to be adjusted for today's limitThe number of minutes to be adjusted for today's limitThe usage of Timekpr-nExT admin client is as follows:There is a problem communicating to Timekpr-nExT (%%s)!There is a problem connecting to Timekpr-nExT daemon (%%s)!These are the days and limits that are available to youTime allowance has changed, please note new time left!Time available today (saved stated, not real-time)Time inactive (actual):Time inactive this session or after Timekpr-nExT has been restartedTime inactive:Time left (actual):Time left (today):Time left today:Time left...Time limit (month):Time limit (week):Time limit configuration has changed, please note new configuration!Time limit for this month available to youTime limit for this week available to youTime spent (month):Time spent (session):Time spent (today):Time spent (week):Time spent this monthTime spent this month (saved stated, not real-time)Time spent this session or after Timekpr-nExT has been restartedTime spent this weekTime spent this week (saved stated, not real-time)Time spent today (saved stated, not real-time)Timekpr-nExTTimekpr-nExT Administration ConfigurationTimekpr-nExT ConfigurationTimekpr-nExT administrationTimekpr-nExT clientTimekpr-nExT configuration has been savedTimekpr-nExT interface is not yet readyTimekpr-nExT notificationToTotal time available left today in a row, up to the end of the dayTrack inactive "%%s" is not correctTrack inactive "%%s" is not correct and cannot be setTrack inactive for user has been processedTrack inactive is not passedTrack inactive sessions:Track inactive:Tracked SessionsUNEXPECTED ERROR: %%sUnexpected ERROR getting user list. Please inspect Timekpr-nExT log filesUnexpected ERROR updating control. Please inspect Timekpr-nExT log filesUnexpected ERROR while loading configuration. Please inspect Timekpr-nExT log filesUse sound "bell" for notificationsUse speech notificationsUser "%%s" configuration is not foundUser "%%s" control file is not foundUser "%%s" is not foundUser ConfigurationUser configuration retrievedUser's "%%s" allowed hours are not correct and cannot be setUser's "%%s" day limits list is not correctUser's "%%s" day limits list is not correct and cannot be setUser's "%%s" day limits list is not passedUser's "%%s" day list is not correctUser's "%%s" day list is not correct and cannot be setUser's "%%s" day list is not passedUser's "%%s" day number must be between 1 and 7User's "%%s" day number must be presentUser's "%%s" hide tray icon flag is not correctUser's "%%s" hide tray icon flag is not passedUser's "%%s" monthly allowance is not correctUser's "%%s" monthly allowance is not correct and cannot be setUser's "%%s" monthly allowance is not passedUser's "%%s" track inactive flag is not correctUser's "%%s" track inactive flag is not correct and cannot be setUser's "%%s" track inactive flag is not passedUser's "%%s" weekly allowance is not correctUser's "%%s" weekly allowance is not correct and cannot be setUser's "%%s" weekly allowance is not passedUsernameUsername:Users related configurationWARNING: Timekpr-nExT administration utility was asked to run in GUI mode, but no displays are available, thus running in CLI...Weekly and monthly limits for user have been processedYou have %(n)s hourYou have %(n)s hoursYour time is not limited todayYour time is up, you will be forcibly logged out inhours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)hrminn/anumeric time values are in secondstimekpr-nextThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . In Debian, see file /usr/share/common-licenses/GPL-3weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, format: 1-7)Project-Id-Version: timekpr-next Report-Msgid-Bugs-To: FULL NAME PO-Revision-Date: 2021-03-01 22:17+0200 Last-Translator: Eduards Bezverhijs Language-Team: Hungarian Language: hu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2020-10-10 15:24+0000 X-Generator: Poedit 2.4.1 %(n)s perc%(n)s perc%(n)s másodperc múlva ki lesz léptetve%(n)s másodperc múlva ki lesz léptetve%(n)s másodperc van hátra%(n)s másodperc van hátraÖsszesen %(n)s felhasználó:Összesen %(n)s felhasználó:---=== ÉRTESÍTÉS ===---==> mentett felhasználólista betöltése a szerverről, példa==> felhasználói konfigurációs és időinformációkat a szerverről, példa==> súgó megjelenítése, példa==> felhasználónak engedélyezett napok beállítása, példa==> a felhasználó aktuálisan fennmaradó idejének beállítása: "+" (idő hozzáadása), "-" (idő kivonása), "=" (a rendelkezésre álló pontos idő beállítása), példa==> havi időkorlát beállítása, példa==> heti időkorlát beállítása, példa==> beállíthatja, hogy elrejtse-e a tálca ikont és megakadályozza az értesítéseket, példa==> inaktív felhasználói meneteket figyelembe vételének beállítása, példaNévjegyTimekpr-nExT névjegyFelhasználó hozzáadása a kizárási listáhozKizárt munkamenet típusának hozzáadása a listáhozMegadott mennyiség hozzáadása (jutalom)Felügyelt munkamenet-típus hozzáadása a listáhozTovábbi korlátokTovábbi statisztikákA felhasználói többletidőt feldolgoztákAz felhasználónak engedélyezett napokat feldolgoztákAz felhasználónak engedélyezett órákat feldolgoztákTimekpr-nExT beállítások együttes alkalmazásaNapi korlátok alkalmazásaRövid összefoglaló a mai napon felhasznált időről és az időkezelésrőlAz ablak bezárásaA parancs meghiúsult: hozzáférés megtagadvaA parancs meghiúsult: a kommunikációt nem fogadtákBeállításokA konfiguráció betöltveKapcsolódvaKapcsolódás folyamatban…Megszakítások nélkül rendelkezésre álló idő:A Timekpr-nExT beállítások kezeléseA Timekpr-nExT által felügyelt állapotok kezeléseNem adták át a vezérlő munkamenet típusaitNem megfelelő a vezérlő munkamenet típuslistájaNem megfelelő a vezérlő munkamenet típuslistája és nem lehet beállítaniCopyright (c) 2018-2021 Eduards BezverhijsKritikus értesítési időtúllépés (mp)A jelenleg hatásos felhasználónévAktuális statisztikákNapi korlát beállítása az összes munkanapraNapi korlátokNapNapok & korlátokrolkovit+ubuntu@gmail.comEngedélyezveKizárt munkamenetekKizárt felhasználókA kizárt munkamenet típusait nem adták átNem megfelelő a kizárt munkamenetek típuslistájaNem megfelelő a kizárt munkamenetek típuslistája és nem lehet beállítaniNem megfelelő a kizárt felhasználók listájaA kizárt felhasználók listáját nem adták át és nem lehet feldolgozniA kizárt felhasználók listáját nem adták átSikertelen kapcsolódásA tétlen idő észlelésére szolgáló "%%s" szolgáltatás nem engedélyezhető! Lehet, hogy a tétlen / inaktív időt nem veszik figyelembe, amikor a képernyő le van zárva!A utolsó figyelmeztetés "%%s" időpontja nem megfelelőA utolsó figyelmeztetés "%%s" időpontja nem megfelelő és nem lehet beállítaniAz utolsó figyelmeztetés időpontját nem adták átFormátum: KezdettIkon és értesítések elrejtése:A felhasználó tálcaikonjának elrejtése feldolgozásra kerültÓra időközökEz egy ikon, ugye?Infó & maBelső kapcsolati hiba, további információk a naplófájlokban találhatóAz időköz eltávolítvaAz időköz kezdete nem lehet azonos a befejezésévelIdőközökFelügyelje a számítógép-használatotKorlátKorlátok & konfigurációA rendszerben regisztrált felhasználók listájaNaplózási szintA "%%s" naplózás szintje nem megfelelőA "%%s" naplózás szintje nem megfelelő és nem lehet beállítaniA naplózás szintjét nem adták átNaplózási szintMegjegyzések, figyelmesen olvasni :)Értesítési időtúllépés (mp)PARAMÉTER ELEMZÉSI HIBA (kérjük, ellenőrizze a paraméter érvényességét): %%sKérjük, indítsa újra az alkalmazást, ha Ön superuser és a Timekpr-nExT futKérjük, válasszon egy napot a korlátok beállításáhozKérjük, válasszon egy eltávolítandó óra-időköztLekérdezési intervallumA lekérdezés "%%s" időpontja nem megfelelőA lekérdezés "%%s" időpontja nem megfelelő és nem lehet beállítaniA lekérdezés időpontját nem adták átFelhasználó eltávolítása a kizárási listárólKizárt munkamenet típusának eltávolítása a listábólKizárt munkamenet-típusok eltávolításaFelügyelt munkamenet-típus eltávolítása a listárólVisszaállításA beállítások visszaállítása egy mentett állapotbólÖsszes változtatás mentéseIdő mentéseA tárolás "%%s" időpontja nem megfelelőA tárolás "%%s" időpontja nem megfelelő és nem lehet beállítaniA tárolás időpontját nem adták átVálasszuk ki, hogy az inaktív munkamenetek ideje számít-e. Ha nincsen kiválasztva, akkor a zárolt képernyő alatt a konzolban (nem egy terminálban) töltött idő nem lesz figyelembe véve (ez asztali környezetenként nagy mértékben eltérhet)MunkamenettípusÖsszes értesítés megjelenítéseKorlátok változásainak kijelzéseMásodpercek megjelenítése az értesítési területenAnnak megjelenítését állíthatjuk be, hogy korlátozások beállításai vagy engedélyezések megváltoztakElindítvaA Timekpr-nExT admin kliens állapotaA Timekpr-nExT kliens állapotaMegadott mennyiség levonása (büntetés)Befejezés idejeA kilépés "%%s" időpontja nem megfelelőA kilépés "%%s" időpontja nem megfelelő és nem lehet beállítaniA kilépés időpontját nem adták átAz időköz átfedésben vagy egy már létezővelAz időköz befejezése ütközik egy már létezővelAz időköz kezdete ütközik egy már létezővelAz időköz kezdete vagy befejezése megkettőz egy már létező időköztA parancs nem megfelelő:A mai napi időkorláthoz beállítandó órákA mai napi időkorláthoz beállítandó percekA Timekpr-nExT admin klienst a következőképpen kell használni:Nem lehet a Timekpr-nExT-tel kommunikálni (%%s)!Nem lehet a Timekpr-nExT szolgáltatáshoz kapcsolódni (%%s)!A rendelkezésre álló napok és korlátokAz engedélyezett időt megváltoztatták, az új időt vegye figyelembe!Ma elérhető idő (mentett kijelentve, nem valósidejű)Hátralévő idő (tényleges):Inaktív felhasználási idő ebben a munkamenetben vagy a Timekpr-nExT újraindítása ótaInaktív idő:Hátralévő idő (tényleges):Még hátralévő idő (ma):Mai fennmaradó idő:Fennmaradó idő...Időkorlát (havi):Időkorlát (hét):Az időkorlát konfigurációját megváltoztatták, az új konfigurációt vegye figyelembe!Rendelkezésre álló havi időkorlátRendelkezésre álló heti időkorlátFelhasznált idő (hónap):Felhasznált idő (munkamenet):Felhasznált idő (ma):Felhasznált idő (hét):Ebben a hónapban felhasznált időEbben a hónapban felhasznált idő (mentett állapot, nem valós idejű)Az ebben a munkamenetben vagy a Timekpr-nExT újraindítása óta felhasznált időEzen a héten felhasznált időA héten felhasznált idő (mentett állapot, nem valós idejű)Mai napon felhasznált idő (tárolt állapot, nem valós idejű)Timekpr-nExTTimekpr-nExT adminisztráció beállításaTimekpr-nExT beállításokTimekpr-nExT adminisztrációTimekpr-nExT kliensA Timekpr-nExT konfigurációját elmentettékA Timekpr-nExT interfész még nem áll készenTimekpr-nExT jelzésBefejezésA nap végéig fennmaradó időA(z) "%%s" inaktivitás figyelése nem megfelelőA(z) "%%s" inaktivitás figyelése nem megfelelő és nem lehet beállítaniA felhasználói inaktivitás követését feldolgoztákAz inaktívitás figyelését nem adták átInaktív munkamenetek követése:Inaktív idő felügyelete:Felügyelet munkamenetekVáratlan hiba: %%sVáratlan hiba a felhasználólista lekérése során. Kérjük, tekintse meg a Timekpr-nExT naplófájljaitVáratlan hiba a vezérlés frissítésekor. Kérjük, tekintse meg a Timekpr-nExT naplófájljaitVáratlan hiba a konfiguráció betöltése során. Kérjük, tekintse meg a Timekpr-nExT naplófájljaitHasználjon hangos az értesítésekhezBeszédértesítések használataA "%%s" felhasználó konfigurációját nem találtukA "%%s" vezérlő fájlt nem találtukA "%%s" felhasználót nem találtukFelhasználói beállításA felhasználó konfigurációja betöltveA "%%s" felhasználó számára engedélyezett órák nem megfelelőek és nem lehet beállítaniA "%%s" felhasználó napi korlátozáslistája nem megfelelőA "%%s" felhasználó napi korlátozáslistája nem megfelelő és nem lehet beállítaniA "%%s" felhasználó napi korlátozáslistáját nem adták átA "%%s" felhasználó naplistája nem megfelelőA "%%s" felhasználó naplistája nem megfelelő és nem lehet beállítaniA "%%s" felhasználó naplistáját nem adták átA "%%s" felhasználó napjai számának 1 és 7 között kell lennieA "%%s" felhasználó napjai számának rendelkezésre kell állniukA felhasználó "%%s" elrejtõ tálcájának ikonja nem megfelelõA felhasználó "%%s" elrejtő tálca ikonjának jelzője nem került átadásraA "%%s" felhasználó havi korlátja nem megfelelőA "%%s" felhasználó havi korlátja nem megfelelő és nem lehet beállítaniA "%%s" felhasználó havi korlátját nem adták átA "%%s" felhasználó inaktivitást figyelő kapcsolója nem megfelelőA "%%s" felhasználó inaktivitást figyelő kapcsolója nem megfelelő és nem lehet beállítaniA "%%s" felhasználó inaktivitást figyelő kapcsolóját nem adták átA "%%s" felhasználó heti korlátja nem megfelelőA "%%s" felhasználó heti korlátja nem megfelelő és nem lehet beállítaniA "%%s" felhasználó heti korlátját nem adták átFelhasználónévFelhasználónév:Felhasználói beállításokFigyelmeztetés: A Timekpr-nExT adminisztrációs eszközt GUI üzemmódban kellene elindítani, de a grafikus megjelenítés nem elérhető. Ezért CLI üzemmódban fog elindulni.A felhasználói heti és havi időkorlátokat feldolgoztákMég %(n)s óraMég %(n)s óraMára nincsen időkorlátodAz ideje lejárt, akkor erőszakkal be lesz jelentkezveaz órákat az ISO 8601 szerint számozzuk (azaz 24 órás óra, formátum: 0–23)órapercnem elérhetőa numerikus időértékek másodpercben vannak megadvaEz a program szabad szoftver; terjeszthető illetve módosítható a Free Software Foundation által kiadott GNU General Public License dokumentumában leírtak; akár a licenc 3-as, akár (tetszőleges) későbbi változata szerint. Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve. További részleteket a GNU General Public License tartalmaz. A felhasználónak a programmal együtt meg kell kapnia a GNU General Public License egy példányát; ha mégsem kapta meg, akkor az megtalálható a címen. Debian disztribúcióban lásd a /usr/share/common-licenses/GPL-3 fájlta hétköznapokat az ISO 8601 szerint számozzuk (azaz hétfő az első nap, formátum: 1-7)timekpr-next/resource/locale/hu/LC_MESSAGES/timekpr.po000664 001750 001750 00000351221 14017261747 024514 0ustar00bezvfedubezvfedu000000 000000 # Hungarian translation for timekpr-next # Copyright (c) 2019 Rosetta Contributors and Canonical Ltd 2019 # This file is distributed under the same license as the timekpr-next package. # FIRST AUTHOR , 2019. # msgid "" msgstr "" "Project-Id-Version: timekpr-next\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2021-03-01 22:11+0200\n" "PO-Revision-Date: 2021-03-01 22:17+0200\n" "Last-Translator: Eduards Bezverhijs \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2020-10-10 15:24+0000\n" "X-Generator: Poedit 2.4.1\n" #: common/constants/messages.py:31 msgid "==> print help, example" msgstr "==> súgó megjelenítése, példa" #: common/constants/messages.py:32 msgid "==> get saved user list from the server, example" msgstr "==> mentett felhasználólista betöltése a szerverről, példa" #: common/constants/messages.py:33 msgid "" "==> get user configuration and time information from the server, example" msgstr "==> felhasználói konfigurációs és időinformációkat a szerverről, példa" #: common/constants/messages.py:34 msgid "==> set allowed days for the user, example" msgstr "==> felhasználónak engedélyezett napok beállítása, példa" #. TRANSLATORS: please DO NOT translate the keyword "ALL" #: common/constants/messages.py:36 #, fuzzy msgid "" "==> set allowed hours for the specified day, or \"ALL\" for every day, " "optionally specify start and end minutes in brackets like this [x-y], " "additionally specify ! in front of hour if it doesn't have to be accounted " "(free time for user), example" msgstr "" "==> meghatározott napra vagy \"ALL\" az összes napra engedélyezett órák " "beállítása (opcionálisan zárójelben adja meg a kezdő és a végi percet), példa" #: common/constants/messages.py:37 #, fuzzy msgid "" "==> set time limits for all allowed days, the number of values must not " "exceed the allowed days for the user, example" msgstr "" "==> időkorlátok beállítása az engedélyezett napokra (az értékszámnak meg " "kell egyeznie az engedélyezett napszámmal), példa" #: common/constants/messages.py:38 msgid "==> set time limit per week, example" msgstr "==> heti időkorlát beállítása, példa" #: common/constants/messages.py:39 msgid "==> set time limit per month, example" msgstr "==> havi időkorlát beállítása, példa" #: common/constants/messages.py:40 msgid "==> set whether to track inactive user sessions, example" msgstr "" "==> inaktív felhasználói meneteket figyelembe vételének beállítása, példa" #: common/constants/messages.py:41 msgid "==> set whether to hide tray icon and prevent notifications, example" msgstr "" "==> beállíthatja, hogy elrejtse-e a tálca ikont és megakadályozza az " "értesítéseket, példa" #. TRANSLATORS: please DO NOT translate the keywords: "lock", "suspend", "suspendwake", "terminate", "shutdown" #: common/constants/messages.py:43 #, fuzzy msgid "" "==> set restriction / lockout type (\"lock\" - lock session, \"suspend\" - " "suspend the computer, \"suspendwake\" - suspend and wake up, \"terminate\" - " "terminate sessions, \"shutdown\" - shutdown the computer), examples" msgstr "" "==> korlátozás / zárolás típusának beállítása (\"lock\", \"suspend\", " "\"suspendwake\", \"terminate\", \"shutdown\"), példa" #: common/constants/messages.py:44 msgid "" "==> set time left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> a felhasználó aktuálisan fennmaradó idejének beállítása: \"+\" (idő " "hozzáadása), \"-\" (idő kivonása), \"=\" (a rendelkezésre álló pontos idő " "beállítása), példa" #: common/constants/messages.py:45 #, fuzzy #| msgid "==> set allowed days for the user, example" msgid "==> set whether PlayTime is enabled for the user, example" msgstr "==> felhasználónak engedélyezett napok beállítása, példa" #: common/constants/messages.py:46 #, fuzzy #| msgid "==> set whether to hide tray icon and prevent notifications, example" msgid "" "==> set whether PlayTime must be accounted instead of normal activity, " "example" msgstr "" "==> beállíthatja, hogy elrejtse-e a tálca ikont és megakadályozza az " "értesítéseket, példa" #: common/constants/messages.py:47 msgid "" "==> set whether PlayTime activities are allowed during unaccounted (\"∞\") " "intervals, example" msgstr "" #: common/constants/messages.py:48 #, fuzzy #| msgid "==> set allowed days for the user, example" msgid "==> set allowed days for PlayTime activities, example" msgstr "==> felhasználónak engedélyezett napok beállítása, példa" #: common/constants/messages.py:49 #, fuzzy msgid "" "==> set PlayTime limits for all allowed days, the number of values must not " "exceed the allowed PlayTime allowed days for the user, example" msgstr "" "==> időkorlátok beállítása az engedélyezett napokra (az értékszámnak meg " "kell egyeznie az engedélyezett napszámmal), példa" #: common/constants/messages.py:50 msgid "" "==> set PlayTime activity process masks, for which the time is accounted, " "example" msgstr "" #: common/constants/messages.py:51 #, fuzzy #| msgid "" #| "==> set time left for the user at the current moment of time: \"+\" (add " #| "time), \"-\" (subtract time), \"=\" (set exact time available), example " #| "(add one hour)" msgid "" "==> set PlayTime left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> a felhasználó aktuálisan fennmaradó idejének beállítása: \"+\" (idő " "hozzáadása), \"-\" (idő kivonása), \"=\" (a rendelkezésre álló pontos idő " "beállítása), példa" #: common/constants/messages.py:54 msgid "Control sessions types are not passed" msgstr "Nem adták át a vezérlő munkamenet típusait" #: common/constants/messages.py:55 msgid "Control sessions types list is not correct" msgstr "Nem megfelelő a vezérlő munkamenet típuslistája" #: common/constants/messages.py:56 msgid "Control sessions types list is not correct and cannot be set" msgstr "" "Nem megfelelő a vezérlő munkamenet típuslistája és nem lehet beállítani" #: common/constants/messages.py:57 msgid "Excluded session types are not passed" msgstr "A kizárt munkamenet típusait nem adták át" #: common/constants/messages.py:58 msgid "Excluded session types list is not correct" msgstr "Nem megfelelő a kizárt munkamenetek típuslistája" #: common/constants/messages.py:59 msgid "Excluded session types list is not correct and cannot be set" msgstr "" "Nem megfelelő a kizárt munkamenetek típuslistája és nem lehet beállítani" #: common/constants/messages.py:60 msgid "Excluded user list is not passed" msgstr "A kizárt felhasználók listáját nem adták át" #: common/constants/messages.py:61 msgid "Excluded user list is not correct" msgstr "Nem megfelelő a kizárt felhasználók listája" #: common/constants/messages.py:62 msgid "Excluded user list is not correct and cannot be set" msgstr "A kizárt felhasználók listáját nem adták át és nem lehet feldolgozni" #: common/constants/messages.py:63 msgid "Final warning time is not passed" msgstr "Az utolsó figyelmeztetés időpontját nem adták át" #: common/constants/messages.py:64 #, python-format msgid "Final warning time \"%%s\" is not correct" msgstr "A utolsó figyelmeztetés \"%%s\" időpontja nem megfelelő" #: common/constants/messages.py:65 #, python-format msgid "Final warning time \"%%s\" is not correct and cannot be set" msgstr "" "A utolsó figyelmeztetés \"%%s\" időpontja nem megfelelő és nem lehet " "beállítani" #: common/constants/messages.py:66 #, fuzzy #| msgid "Final warning time is not passed" msgid "Final notification time is not passed" msgstr "Az utolsó figyelmeztetés időpontját nem adták át" #: common/constants/messages.py:67 #, fuzzy, python-format #| msgid "Final warning time \"%%s\" is not correct" msgid "Final notification time \"%%s\" is not correct" msgstr "A utolsó figyelmeztetés \"%%s\" időpontja nem megfelelő" #: common/constants/messages.py:68 #, fuzzy, python-format #| msgid "Final warning time \"%%s\" is not correct and cannot be set" msgid "Final notification time \"%%s\" is not correct and cannot be set" msgstr "" "A utolsó figyelmeztetés \"%%s\" időpontja nem megfelelő és nem lehet " "beállítani" #: common/constants/messages.py:69 msgid "Termination time is not passed" msgstr "A kilépés időpontját nem adták át" #: common/constants/messages.py:70 #, python-format msgid "Termination time \"%%s\" is not correct" msgstr "A kilépés \"%%s\" időpontja nem megfelelő" #: common/constants/messages.py:71 #, python-format msgid "Termination time \"%%s\" is not correct and cannot be set" msgstr "A kilépés \"%%s\" időpontja nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:72 msgid "Track inactive is not passed" msgstr "Az inaktívitás figyelését nem adták át" #: common/constants/messages.py:73 #, python-format msgid "Track inactive \"%%s\" is not correct" msgstr "A(z) \"%%s\" inaktivitás figyelése nem megfelelő" #: common/constants/messages.py:74 #, python-format msgid "Track inactive \"%%s\" is not correct and cannot be set" msgstr "" "A(z) \"%%s\" inaktivitás figyelése nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:75 msgid "Log level is not passed" msgstr "A naplózás szintjét nem adták át" #: common/constants/messages.py:76 #, python-format msgid "Log level \"%%s\" is not correct" msgstr "A \"%%s\" naplózás szintje nem megfelelő" #: common/constants/messages.py:77 #, python-format msgid "Log level \"%%s\" is not correct and cannot be set" msgstr "A \"%%s\" naplózás szintje nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:78 msgid "Poll time is not passed" msgstr "A lekérdezés időpontját nem adták át" #: common/constants/messages.py:79 #, python-format msgid "Poll time \"%%s\" is not correct" msgstr "A lekérdezés \"%%s\" időpontja nem megfelelő" #: common/constants/messages.py:80 #, python-format msgid "Poll time \"%%s\" is not correct and cannot be set" msgstr "A lekérdezés \"%%s\" időpontja nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:81 msgid "Save time is not passed" msgstr "A tárolás időpontját nem adták át" #: common/constants/messages.py:82 #, python-format msgid "Save time \"%%s\" is not correct" msgstr "A tárolás \"%%s\" időpontja nem megfelelő" #: common/constants/messages.py:83 #, python-format msgid "Save time \"%%s\" is not correct and cannot be set" msgstr "A tárolás \"%%s\" időpontja nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:84 #, fuzzy #| msgid "Poll time is not passed" msgid "PlayTime flag is not passed" msgstr "A lekérdezés időpontját nem adták át" #: common/constants/messages.py:85 #, fuzzy, python-format #| msgid "Poll time \"%%s\" is not correct" msgid "PlayTime flag \"%%s\" is not correct" msgstr "A lekérdezés \"%%s\" időpontja nem megfelelő" #: common/constants/messages.py:86 #, fuzzy, python-format #| msgid "Poll time \"%%s\" is not correct and cannot be set" msgid "PlayTime flag \"%%s\" is not correct and cannot be set" msgstr "A lekérdezés \"%%s\" időpontja nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:87 msgid "PlayTime enhanced activity monitor flag is not passed" msgstr "" #: common/constants/messages.py:88 #, fuzzy, python-format #| msgid "Track inactive \"%%s\" is not correct" msgid "PlayTime enhanced activity monitor flag \"%%s\" is not correct" msgstr "A(z) \"%%s\" inaktivitás figyelése nem megfelelő" #: common/constants/messages.py:89 #, fuzzy, python-format #| msgid "Track inactive \"%%s\" is not correct and cannot be set" msgid "" "PlayTime enhanced activity monitor flag \"%%s\" is not correct and cannot be " "set" msgstr "" "A(z) \"%%s\" inaktivitás figyelése nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:92 #, python-format msgid "User's \"%%s\" day number must be present" msgstr "A \"%%s\" felhasználó napjai számának rendelkezésre kell állniuk" #: common/constants/messages.py:93 #, python-format msgid "User's \"%%s\" day number must be between 1 and 7" msgstr "A \"%%s\" felhasználó napjai számának 1 és 7 között kell lennie" #: common/constants/messages.py:94 #, python-format msgid "User's \"%%s\" allowed hours are not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó számára engedélyezett órák nem megfelelőek és nem " "lehet beállítani" #: common/constants/messages.py:95 #, python-format msgid "User's \"%%s\" day list is not passed" msgstr "A \"%%s\" felhasználó naplistáját nem adták át" #: common/constants/messages.py:96 #, python-format msgid "User's \"%%s\" day list is not correct" msgstr "A \"%%s\" felhasználó naplistája nem megfelelő" #: common/constants/messages.py:97 #, python-format msgid "User's \"%%s\" day list is not correct and cannot be set" msgstr "A \"%%s\" felhasználó naplistája nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:98 #, python-format msgid "User's \"%%s\" day limits list is not passed" msgstr "A \"%%s\" felhasználó napi korlátozáslistáját nem adták át" #: common/constants/messages.py:99 #, python-format msgid "User's \"%%s\" day limits list is not correct" msgstr "A \"%%s\" felhasználó napi korlátozáslistája nem megfelelő" #: common/constants/messages.py:100 #, python-format msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó napi korlátozáslistája nem megfelelő és nem lehet " "beállítani" #: common/constants/messages.py:101 #, fuzzy, python-format #| msgid "User's \"%%s\" set time operation can be one of these: -+=" msgid "User's \"%%s\" time operation can be one of these: - + =" msgstr "A \"%%s\" felhasználó időbeállító műveletei ezek lehetnek: -+=" #: common/constants/messages.py:102 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct" msgid "User's \"%%s\" time limit is not correct" msgstr "A \"%%s\" felhasználó időkorlátja nem megfelelő" #: common/constants/messages.py:103 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct and cannot be set" msgid "User's \"%%s\" time limit is not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó időkorlátja nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:104 #, python-format msgid "User's \"%%s\" monthly allowance is not passed" msgstr "A \"%%s\" felhasználó havi korlátját nem adták át" #: common/constants/messages.py:105 #, python-format msgid "User's \"%%s\" monthly allowance is not correct" msgstr "A \"%%s\" felhasználó havi korlátja nem megfelelő" #: common/constants/messages.py:106 #, python-format msgid "User's \"%%s\" monthly allowance is not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó havi korlátja nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:107 #, python-format msgid "User's \"%%s\" track inactive flag is not passed" msgstr "A \"%%s\" felhasználó inaktivitást figyelő kapcsolóját nem adták át" #: common/constants/messages.py:108 #, python-format msgid "User's \"%%s\" track inactive flag is not correct" msgstr "A \"%%s\" felhasználó inaktivitást figyelő kapcsolója nem megfelelő" #: common/constants/messages.py:109 #, python-format msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó inaktivitást figyelő kapcsolója nem megfelelő és nem " "lehet beállítani" #: common/constants/messages.py:110 #, python-format msgid "User's \"%%s\" hide tray icon flag is not passed" msgstr "" "A felhasználó \"%%s\" elrejtő tálca ikonjának jelzője nem került átadásra" #: common/constants/messages.py:111 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct" msgstr "A felhasználó \"%%s\" elrejtõ tálcájának ikonja nem megfelelõ" #: common/constants/messages.py:112 #, fuzzy, python-format msgid "User's \"%%s\" hide tray icon flag is not correct and cannot be set" msgstr "" "A felhasználó \"%%s\" elrejtõ tálcájának ikonja nem megfelelõ, és nem " "állítható be" #: common/constants/messages.py:113 #, fuzzy, python-format msgid "User's \"%%s\" restriction / lockout type is not passed" msgstr "" "A felhasználó \"%%s\" korlátozásának / zárolásának típusa nincs megadva" #: common/constants/messages.py:114 #, fuzzy, python-format msgid "User's \"%%s\" restriction / lockout type is not correct" msgstr "" "A felhasználó \"%%s\" korlátozásának / zárolásának típusa nem megfelelő" #: common/constants/messages.py:115 #, fuzzy, python-format msgid "" "User's \"%%s\" restriction / lockout type is not correct and cannot be set" msgstr "" "A felhasználó \"%%s\" korlátozási / zárolási típusa nem megfelelő, és nem " "állítható be" #: common/constants/messages.py:116 #, python-format msgid "User's \"%%s\" weekly allowance is not passed" msgstr "A \"%%s\" felhasználó heti korlátját nem adták át" #: common/constants/messages.py:117 #, python-format msgid "User's \"%%s\" weekly allowance is not correct" msgstr "A \"%%s\" felhasználó heti korlátja nem megfelelő" #: common/constants/messages.py:118 #, python-format msgid "User's \"%%s\" weekly allowance is not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó heti korlátja nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:119 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not passed" msgid "User's \"%%s\" PlayTime enable flag is not passed" msgstr "A \"%%s\" felhasználó inaktivitást figyelő kapcsolóját nem adták át" #: common/constants/messages.py:120 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct" msgid "User's \"%%s\" PlayTime enable flag is not correct" msgstr "A \"%%s\" felhasználó inaktivitást figyelő kapcsolója nem megfelelő" #: common/constants/messages.py:121 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgid "User's \"%%s\" PlayTime enable flag is not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó inaktivitást figyelő kapcsolója nem megfelelő és nem " "lehet beállítani" #: common/constants/messages.py:122 #, fuzzy, python-format #| msgid "User's \"%%s\" hide tray icon flag is not passed" msgid "User's \"%%s\" PlayTime override flag is not passed" msgstr "" "A felhasználó \"%%s\" elrejtő tálca ikonjának jelzője nem került átadásra" #: common/constants/messages.py:123 #, fuzzy, python-format #| msgid "User's \"%%s\" hide tray icon flag is not correct" msgid "User's \"%%s\" PlayTime override flag is not correct" msgstr "A felhasználó \"%%s\" elrejtõ tálcájának ikonja nem megfelelõ" #: common/constants/messages.py:124 #, fuzzy, python-format msgid "User's \"%%s\" PlayTime override flag is not correct and cannot be set" msgstr "" "A felhasználó \"%%s\" elrejtõ tálcájának ikonja nem megfelelõ, és nem " "állítható be" #: common/constants/messages.py:125 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not passed" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "passed" msgstr "A \"%%s\" felhasználó inaktivitást figyelő kapcsolóját nem adták át" #: common/constants/messages.py:126 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct" msgstr "A \"%%s\" felhasználó inaktivitást figyelő kapcsolója nem megfelelő" #: common/constants/messages.py:127 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct and cannot be set" msgstr "" "A \"%%s\" felhasználó inaktivitást figyelő kapcsolója nem megfelelő és nem " "lehet beállítani" #: common/constants/messages.py:128 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not passed" msgid "User's \"%%s\" PlayTime day list is not passed" msgstr "A \"%%s\" felhasználó naplistáját nem adták át" #: common/constants/messages.py:129 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not correct" msgid "User's \"%%s\" PlayTime day list is not correct" msgstr "A \"%%s\" felhasználó naplistája nem megfelelő" #: common/constants/messages.py:130 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not correct and cannot be set" msgid "User's \"%%s\" PlayTime day list is not correct and cannot be set" msgstr "A \"%%s\" felhasználó naplistája nem megfelelő és nem lehet beállítani" #: common/constants/messages.py:131 common/constants/messages.py:134 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not passed" msgid "User's \"%%s\" PlayTime day limits list is not passed" msgstr "A \"%%s\" felhasználó napi korlátozáslistáját nem adták át" #: common/constants/messages.py:132 common/constants/messages.py:135 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not correct" msgid "User's \"%%s\" PlayTime day limits list is not correct" msgstr "A \"%%s\" felhasználó napi korlátozáslistája nem megfelelő" #: common/constants/messages.py:133 common/constants/messages.py:136 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgid "" "User's \"%%s\" PlayTime day limits list is not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó napi korlátozáslistája nem megfelelő és nem lehet " "beállítani" #: common/constants/messages.py:137 #, fuzzy, python-format #| msgid "User's \"%%s\" set time operation can be one of these: -+=" msgid "User's \"%%s\" PlayTime operation can be one of these: - + =" msgstr "A \"%%s\" felhasználó időbeállító műveletei ezek lehetnek: -+=" #: common/constants/messages.py:138 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct" msgid "User's \"%%s\" set PlayTime limit is not correct" msgstr "A \"%%s\" felhasználó időkorlátja nem megfelelő" #: common/constants/messages.py:139 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct and cannot be set" msgid "User's \"%%s\" PlayTime time limit is not correct and cannot be set" msgstr "" "A \"%%s\" felhasználó időkorlátja nem megfelelő és nem lehet beállítani" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:143 msgid "" "Unexpected ERROR while loading configuration. Please inspect Timekpr-nExT " "log files" msgstr "" "Váratlan hiba a konfiguráció betöltése során. Kérjük, tekintse meg a Timekpr-" "nExT naplófájljait" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:145 #, fuzzy #| msgid "" #| "Unexpected ERROR getting confguration. Please inspect Timekpr-nExT log " #| "files" msgid "" "Unexpected ERROR getting configuration. Please inspect Timekpr-nExT log files" msgstr "" "Váratlan hiba a konfiguráció lekérése során. Kérjük, tekintse meg a Timekpr-" "nExT naplófájljait" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:147 #, fuzzy #| msgid "" #| "Unexpected ERROR getting user confguration. Please inspect Timekpr-nExT " #| "log files" msgid "" "Unexpected ERROR getting user configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "Váratlan hiba a felhasználói konfiguráció lekérése során. Kérjük, tekintse " "meg a Timekpr-nExT naplófájljait" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:149 msgid "" "Unexpected ERROR getting user list. Please inspect Timekpr-nExT log files" msgstr "" "Váratlan hiba a felhasználólista lekérése során. Kérjük, tekintse meg a " "Timekpr-nExT naplófájljait" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:151 #, fuzzy #| msgid "" #| "Unexpected ERROR updating confguration. Please inspect Timekpr-nExT log " #| "files" msgid "" "Unexpected ERROR updating configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "Váratlan hiba a konfiguráció frissítésekor. Kérjük, tekintse meg a Timekpr-" "nExT naplófájljait" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:153 msgid "" "Unexpected ERROR updating control. Please inspect Timekpr-nExT log files" msgstr "" "Váratlan hiba a vezérlés frissítésekor. Kérjük, tekintse meg a Timekpr-nExT " "naplófájljait" #: common/constants/messages.py:154 #, python-format msgid "User \"%%s\" configuration is not found" msgstr "A \"%%s\" felhasználó konfigurációját nem találtuk" #: common/constants/messages.py:155 #, python-format msgid "User \"%%s\" control file is not found" msgstr "A \"%%s\" vezérlő fájlt nem találtuk" #: common/constants/messages.py:156 #, python-format msgid "User \"%%s\" is not found" msgstr "A \"%%s\" felhasználót nem találtuk" #: common/constants/messages.py:159 msgid "Connected" msgstr "Kapcsolódva" #: common/constants/messages.py:160 msgid "Connecting..." msgstr "Kapcsolódás folyamatban…" #: common/constants/messages.py:161 msgid "Failed to connect" msgstr "Sikertelen kapcsolódás" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:163 msgid "" "Please reopen the application if you are superuser and Timekpr-nExT is " "running" msgstr "" "Kérjük, indítsa újra az alkalmazást, ha Ön superuser és a Timekpr-nExT fut" #: common/constants/messages.py:164 msgid "Started" msgstr "Elindítva" #: common/constants/messages.py:165 msgid "User configuration retrieved" msgstr "A felhasználó konfigurációja betöltve" #: common/constants/messages.py:166 msgid "Configuration retrieved" msgstr "A konfiguráció betöltve" #: common/constants/messages.py:167 msgid "Track inactive for user has been processed" msgstr "A felhasználói inaktivitás követését feldolgozták" #: common/constants/messages.py:168 msgid "Hide tray icon for user has been processed" msgstr "A felhasználó tálcaikonjának elrejtése feldolgozásra került" #: common/constants/messages.py:169 #, fuzzy msgid "Restriction / lockout type for user has been processed" msgstr "A felhasználó korlátozásának / zárolásának típusa feldolgozásra került" #: common/constants/messages.py:170 msgid "Additional time for user has been processed" msgstr "A felhasználói többletidőt feldolgozták" #: common/constants/messages.py:171 #, fuzzy #| msgid "Additional time for user has been processed" msgid "Additional PlayTime for user has been processed" msgstr "A felhasználói többletidőt feldolgozták" #: common/constants/messages.py:172 msgid "Weekly and monthly limits for user have been processed" msgstr "A felhasználói heti és havi időkorlátokat feldolgozták" #: common/constants/messages.py:173 msgid "Allowed days for user have been processed" msgstr "Az felhasználónak engedélyezett napokat feldolgozták" #: common/constants/messages.py:174 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "Day time limits for user have been processed" msgstr "A felhasználó napi időkorlátjait feldolgozták" #: common/constants/messages.py:175 msgid "Allowed hours for user have been processed" msgstr "Az felhasználónak engedélyezett órákat feldolgozták" #: common/constants/messages.py:176 msgid "Timekpr-nExT configuration has been saved" msgstr "A Timekpr-nExT konfigurációját elmentették" #: common/constants/messages.py:177 #, fuzzy #| msgid "==> set time limit per week, example" msgid "User time limits have been saved" msgstr "==> heti időkorlát beállítása, példa" #: common/constants/messages.py:178 #, fuzzy #| msgid "Time limit for the week is enabled" msgid "User PlayTime limits have been saved" msgstr "A heti időkorlát be van kapcsolva" #: common/constants/messages.py:179 #, fuzzy #| msgid "Additional time for user has been processed" msgid "User additional options have been saved" msgstr "A felhasználói többletidőt feldolgozták" #: common/constants/messages.py:180 #, fuzzy #| msgid "Additional time for user has been processed" msgid "Enable PlayTime for the user has been processed" msgstr "A felhasználói többletidőt feldolgozták" #: common/constants/messages.py:181 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime override flag for the user has been processed" msgstr "A felhasználó napi időkorlátjait feldolgozták" #: common/constants/messages.py:182 #, fuzzy #| msgid "Track inactive for user has been processed" msgid "" "PlayTime allowed during unaccounted intervals flag for the user has been " "processed" msgstr "A felhasználói inaktivitás követését feldolgozták" #: common/constants/messages.py:183 #, fuzzy #| msgid "Allowed days for user have been processed" msgid "PlayTime allowed days for user have been processed" msgstr "Az felhasználónak engedélyezett napokat feldolgozták" #: common/constants/messages.py:184 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime day limits for user have been processed" msgstr "A felhasználó napi időkorlátjait feldolgozták" #: common/constants/messages.py:185 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime activities for user have been processed" msgstr "A felhasználó napi időkorlátjait feldolgozták" #: common/constants/messages.py:186 msgid "Please select a day to set the limits" msgstr "Kérjük, válasszon egy napot a korlátok beállításához" #: common/constants/messages.py:187 msgid "That interval overlaps with an existing one" msgstr "Az időköz átfedésben vagy egy már létezővel" #: common/constants/messages.py:188 msgid "That interval's start conflicts with an existing one" msgstr "Az időköz kezdete ütközik egy már létezővel" #: common/constants/messages.py:189 msgid "That interval's end conflicts with an existing one" msgstr "Az időköz befejezése ütközik egy már létezővel" #: common/constants/messages.py:190 msgid "That interval's start or end duplicates an existing one" msgstr "Az időköz kezdete vagy befejezése megkettőz egy már létező időközt" #: common/constants/messages.py:191 msgid "Interval start cannot be the same as end" msgstr "Az időköz kezdete nem lehet azonos a befejezésével" #: common/constants/messages.py:192 #, fuzzy #| msgid "Interval start cannot be the same as end" msgid "Interval's start cannot be later than end" msgstr "Az időköz kezdete nem lehet azonos a befejezésével" #: common/constants/messages.py:193 msgid "Please select an hour interval to remove" msgstr "Kérjük, válasszon egy eltávolítandó óra-időközt" #: common/constants/messages.py:194 msgid "Interval removed" msgstr "Az időköz eltávolítva" #: common/constants/messages.py:195 msgid "Timekpr-nExT interface is not yet ready" msgstr "A Timekpr-nExT interfész még nem áll készen" #: common/constants/messages.py:198 msgid "" "WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, " "but no displays are available, thus running in CLI..." msgstr "" "Figyelmeztetés: A Timekpr-nExT adminisztrációs eszközt GUI üzemmódban " "kellene elindítani, de a grafikus megjelenítés nem elérhető. Ezért CLI " "üzemmódban fog elindulni." #: common/constants/messages.py:199 msgid "The command is incorrect:" msgstr "A parancs nem megfelelő:" #: common/constants/messages.py:200 msgid "The usage of Timekpr-nExT admin client is as follows:" msgstr "A Timekpr-nExT admin klienst a következőképpen kell használni:" #: common/constants/messages.py:201 msgid "---=== NOTICE ===---" msgstr "---=== ÉRTESÍTÉS ===---" #: common/constants/messages.py:202 msgid "numeric time values are in seconds" msgstr "a numerikus időértékek másodpercben vannak megadva" #: common/constants/messages.py:203 msgid "" "weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, " "format: 1-7)" msgstr "" "a hétköznapokat az ISO 8601 szerint számozzuk (azaz hétfő az első nap, " "formátum: 1-7)" #: common/constants/messages.py:204 msgid "hours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)" msgstr "" "az órákat az ISO 8601 szerint számozzuk (azaz 24 órás óra, formátum: 0–23)" #: common/constants/messages.py:206 #, python-format msgid "%(n)s user in total:" msgid_plural "%(n)s users in total:" msgstr[0] "Összesen %(n)s felhasználó:" msgstr[1] "Összesen %(n)s felhasználó:" #: common/constants/messages.py:207 #, fuzzy, python-format #| msgid "Config for %s:" msgid "Configuration for user %s:" msgstr "%s konfigurációja:" #: common/constants/messages.py:210 msgid "Time left..." msgstr "Fennmaradó idő..." #: common/constants/messages.py:211 msgid "Limits & Configuration" msgstr "Korlátok & konfiguráció" #: common/constants/messages.py:212 msgid "About" msgstr "Névjegy" #: common/constants/messages.py:215 resource/client/forms/about.glade:17 msgid "Keep control of computer usage" msgstr "Felügyelje a számítógép-használatot" #: common/constants/messages.py:216 msgid "Day" msgstr "Nap" #: common/constants/messages.py:217 msgid "Enabled" msgstr "Engedélyezve" #: common/constants/messages.py:218 common/constants/messages.py:224 msgid "Limit" msgstr "Korlát" #: common/constants/messages.py:219 msgid "From" msgstr "Kezdett" #: common/constants/messages.py:220 #, fuzzy #| msgid "from" msgid "from..." msgstr "ettől" #: common/constants/messages.py:221 msgid "To" msgstr "Befejezés" #: common/constants/messages.py:222 msgid "to..." msgstr "" #: common/constants/messages.py:223 msgid "Period" msgstr "" #: common/constants/messages.py:225 msgid "Weekly" msgstr "" #: common/constants/messages.py:226 msgid "Monthly" msgstr "" #: common/constants/messages.py:227 common/constants/messages.py:229 msgid "Session type" msgstr "Munkamenettípus" #: common/constants/messages.py:228 common/constants/messages.py:230 #, fuzzy #| msgid "Session type" msgid "session type..." msgstr "Munkamenettípus" #: common/constants/messages.py:231 msgid "Username" msgstr "Felhasználónév" #: common/constants/messages.py:232 #, fuzzy #| msgid "Username" msgid "username..." msgstr "Felhasználónév" #: common/constants/messages.py:233 msgid "Process mask" msgstr "" #: common/constants/messages.py:234 msgid "executable mask..." msgstr "" #: common/constants/messages.py:235 msgid "Process description" msgstr "" #: common/constants/messages.py:236 msgid "process description..." msgstr "" #: common/constants/messages.py:237 msgid "Time" msgstr "" #: common/constants/messages.py:238 msgid "time..." msgstr "" #: common/constants/messages.py:239 msgid "Importance" msgstr "" #: common/constants/messages.py:240 msgid "importance..." msgstr "" #: common/constants/messages.py:243 msgid "Timekpr-nExT notification" msgstr "Timekpr-nExT jelzés" #: common/constants/messages.py:244 #, fuzzy #| msgid "Timekpr-nExT notification" msgid "Timekpr-nExT PlayTime notification" msgstr "Timekpr-nExT jelzés" #: common/constants/messages.py:245 msgid "Your time is not limited today" msgstr "Mára nincsen időkorlátod" #: common/constants/messages.py:246 msgid "Time allowance has changed, please note new time left!" msgstr "Az engedélyezett időt megváltoztatták, az új időt vegye figyelembe!" #: common/constants/messages.py:247 msgid "Time limit configuration has changed, please note new configuration!" msgstr "" "Az időkorlát konfigurációját megváltoztatták, az új konfigurációt vegye " "figyelembe!" #: common/constants/messages.py:248 #, python-format msgid "There is a problem connecting to Timekpr-nExT daemon (%%s)!" msgstr "Nem lehet a Timekpr-nExT szolgáltatáshoz kapcsolódni (%%s)!" #: common/constants/messages.py:249 #, python-format msgid "There is a problem communicating to Timekpr-nExT (%%s)!" msgstr "Nem lehet a Timekpr-nExT-tel kommunikálni (%%s)!" #: common/constants/messages.py:250 #, fuzzy, python-format #| msgid "Icon inititalization error (%%s)!" msgid "Icon initialization error (%%s)!" msgstr "Hiba az ikon inicializálásakor (%%s)!" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:252 msgid "Your time is up, you will be forcibly logged out in" msgstr "Az ideje lejárt, akkor erőszakkal be lesz jelentkezve" #. TRANSLATORS: this is a part of message "Your time is up, your computer will be forcibly shutdown in %s seconds", please translate accordingly #: common/constants/messages.py:254 #, fuzzy msgid "Your time is up, your computer will be forcibly shutdown in" msgstr "Lejárt az ideje, a számítógépet erőszakkal leállítják" #. TRANSLATORS: this is a part of message "Your time is up, your session will be forcibly locked in %s seconds", please translate accordingly #: common/constants/messages.py:256 #, fuzzy msgid "Your time is up, your session will be forcibly locked in" msgstr "Lejárt az ideje, a munkamenetet erőszakkal bezárják" #. TRANSLATORS: this is a part of message ", Your computer will be forcibly suspended in %s seconds", please translate accordingly #: common/constants/messages.py:258 #, fuzzy msgid "Your time is up, your computer will be forcibly suspended in" msgstr "Lejárt az ideje, számítógépét erőszakosan felfüggesztjük" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:260 #, python-format msgid "%(n)s second" msgid_plural "%(n)s seconds" msgstr[0] "%(n)s másodperc múlva ki lesz léptetve" msgstr[1] "%(n)s másodperc múlva ki lesz léptetve" #: common/constants/messages.py:261 msgid "Internal connection error, please check log files" msgstr "Belső kapcsolati hiba, további információk a naplófájlokban található" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:263 #, python-format msgid "You have %(n)s hour" msgid_plural "You have %(n)s hours" msgstr[0] "Még %(n)s óra" msgstr[1] "Még %(n)s óra" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:265 #, python-format msgid "%(n)s minute" msgid_plural "%(n)s minutes" msgstr[0] "%(n)s perc" msgstr[1] "%(n)s perc" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) of PlayTime left" please translate accordingly #: common/constants/messages.py:267 common/constants/messages.py:269 #, python-format msgid "%(n)s second left" msgid_plural "%(n)s seconds left" msgstr[0] "%(n)s másodperc van hátra" msgstr[1] "%(n)s másodperc van hátra" #: common/constants/messages.py:269 #, fuzzy, python-format #| msgid "%(n)s second left" #| msgid_plural "%(n)s seconds left" msgid "%(n)s second of PlayTime left" msgid_plural "%(n)s seconds of PlayTime left" msgstr[0] "%(n)s másodperc van hátra" msgstr[1] "%(n)s másodperc van hátra" #: common/constants/messages.py:270 #, python-format msgid "" "Feature \"%%s\", which is used to detect idle time, cannot be enabled!\n" "Idle / inactive time might not be accounted when screen is locked!" msgstr "" "A tétlen idő észlelésére szolgáló \"%%s\" szolgáltatás nem engedélyezhető!\n" "Lehet, hogy a tétlen / inaktív időt nem veszik figyelembe, amikor a képernyő " "le van zárva!" #: common/constants/messages.py:273 #, python-format msgid "UNEXPECTED ERROR: %%s" msgstr "Váratlan hiba: %%s" #: common/constants/messages.py:274 #, python-format msgid "PARAMETER PARSE ERROR (please check parameter validity): %%s" msgstr "" "PARAMÉTER ELEMZÉSI HIBA (kérjük, ellenőrizze a paraméter érvényességét): %%s" #: common/constants/messages.py:275 msgid "Command FAILED: access denied" msgstr "A parancs meghiúsult: hozzáférés megtagadva" #: common/constants/messages.py:276 msgid "Command FAILED: communication was not accepted" msgstr "A parancs meghiúsult: a kommunikációt nem fogadták" #: common/constants/messages.py:277 msgid "n/a" msgstr "nem elérhető" #: resource/client/forms/about.glade:7 msgid "About Timekpr-nExT" msgstr "Timekpr-nExT névjegy" #: resource/client/forms/about.glade:16 msgid "Copyright (c) 2018-2021 Eduards Bezverhijs" msgstr "Copyright (c) 2018-2021 Eduards Bezverhijs" #: resource/client/forms/about.glade:19 msgid "Timekpr-nExT" msgstr "Timekpr-nExT" #. Please enter GPL3 licence text in your language #: resource/client/forms/about.glade:20 msgctxt "timekpr-next" msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details.\n" "\n" "You should have received a copy of the GNU General Public License along with " "this program. If not, see . In Debian, see " "file /usr/share/common-licenses/GPL-3" msgstr "" "Ez a program szabad szoftver; terjeszthető illetve módosítható a Free " "Software Foundation által kiadott GNU General Public License dokumentumában " "leírtak; akár a licenc 3-as, akár (tetszőleges) későbbi változata szerint.\n" "\n" "Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, de " "minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA VALÓ " "ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve. További " "részleteket a GNU General Public License tartalmaz.\n" "\n" "A felhasználónak a programmal együtt meg kell kapnia a GNU General Public " "License egy példányát; ha mégsem kapta meg, akkor az megtalálható a címen. Debian disztribúcióban lásd a /usr/share/" "common-licenses/GPL-3 fájlt" #. Please fill in translator credits, each person in new line in format: name.surname@mail.xy, name@mail.xy, nick@mail.xy or so... #: resource/client/forms/about.glade:26 msgid "" "Eduards Bezverhijs \n" "(Translations fine-tuning by JP Lord )\n" "(English fine-tuning by Phil Hudson )" msgstr "rolkovit+ubuntu@gmail.com" #: resource/client/forms/admin.glade:155 msgid "Remove excluded session type" msgstr "Kizárt munkamenet-típusok eltávolítása" #: resource/client/forms/admin.glade:385 msgid "Timekpr-nExT administration" msgstr "Timekpr-nExT adminisztráció" #: resource/client/forms/admin.glade:403 resource/client/forms/admin.glade:409 #: resource/client/forms/client.glade:261 msgid "Icon, isn't it?" msgstr "Ez egy ikon, ugye?" #: resource/client/forms/admin.glade:432 msgid "Notes, read carefully ;)" msgstr "Megjegyzések, figyelmesen olvasni :)" #: resource/client/forms/admin.glade:435 #, fuzzy #| msgid "" #| "This is the configuration app for Timekpr-nExT. It allows you to set time " #| "limits for your individual users as well as general Timekpr-nExT " #| "options.\n" #| "\n" #| "To use this application, you either have to execute it as superuser or " #| "have to be part of the timekpr group.\n" #| "Please note that the \"Timekpr-nExT Configuration\" is available in " #| "superuser (administrator) mode only!\n" #| "\n" #| "Please configure carefully: do not lock yourself out!" msgid "" "This is the configuration app for Timekpr-nExT. It allows you to set time " "limits for your individual users as well as general Timekpr-nExT options.\n" "To use this application, you either have to execute it as superuser or have " "to be part of the timekpr group.\n" "Please note that the \"Timekpr-nExT Configuration\" is available in " "superuser (administrator) mode only!\n" "\n" "Please configure carefully: do not lock yourself out!" msgstr "" "Ez a Timekpr-nExT konfigurációs app. Beállíthatjuk vele a felhasználóink " "idejét, valamint a Timekpr-nExT paramétereket.\n" "\n" "Az app futtatása superuser-ként vagy a timekpr csoport tagjaként " "lehetséges.\n" "A \"Timekpr-nExT konfiguráció\" csak superuser (adminisztrátor) üzemmódban " "lehetséges.\n" "\n" "A konfiguráció során legyünk óvatosak, nehogy kizárjuk magunkat!" #: resource/client/forms/admin.glade:465 resource/client/forms/admin.glade:3016 msgid "Users related configuration" msgstr "Felhasználói beállítások" #: resource/client/forms/admin.glade:476 resource/client/forms/client.glade:298 msgid "Username:" msgstr "Felhasználónév:" #: resource/client/forms/admin.glade:504 resource/client/forms/admin.glade:516 msgid "List of usernames registered on the system" msgstr "A rendszerben regisztrált felhasználók listája" #: resource/client/forms/admin.glade:530 msgid "Restore" msgstr "Visszaállítás" #: resource/client/forms/admin.glade:535 msgid "Restore configuration from saved state" msgstr "A beállítások visszaállítása egy mentett állapotból" #: resource/client/forms/admin.glade:586 #, fuzzy #| msgid "This shows information about time left / spent" msgid "Information about time left / spent" msgstr "Ez megmutatja a hátralévő / eltöltött időt" #: resource/client/forms/admin.glade:610 #, fuzzy msgid "" "Continuous time left. May span more than the current day (realtime, " "available when user is logged in)" msgstr "" "A felhasználó számára fenntartott folyamatos idő, amely meghaladhatja az " "aktuális napot (valós idő, elérhető, amikor a felhasználó be van jelentkezve)" #: resource/client/forms/admin.glade:612 msgid "Time left (actual):" msgstr "Hátralévő idő (tényleges):" #: resource/client/forms/admin.glade:626 resource/client/forms/admin.glade:657 #: resource/client/forms/admin.glade:688 resource/client/forms/admin.glade:732 #: resource/client/forms/admin.glade:763 resource/client/forms/admin.glade:794 #: resource/client/forms/client.glade:411 #: resource/client/forms/client.glade:425 #: resource/client/forms/client.glade:456 #: resource/client/forms/client.glade:502 #: resource/client/forms/client.glade:728 #: resource/client/forms/client.glade:786 #: resource/client/forms/client.glade:857 #: resource/client/forms/client.glade:885 #: resource/client/forms/client.glade:985 #: resource/client/forms/client.glade:1011 msgid "Format: " msgstr "Formátum: " #: resource/client/forms/admin.glade:641 #, fuzzy msgid "" "How long the user was inactive since last login (realtime, available when " "user is logged in)" msgstr "" "Meddig volt inaktív a felhasználó a legutóbbi bejelentkezés óta (valós " "idejű, elérhető, amikor a felhasználó be van jelentkezve)" #: resource/client/forms/admin.glade:643 msgid "Time inactive (actual):" msgstr "Hátralévő idő (tényleges):" #: resource/client/forms/admin.glade:672 msgid "Time available today (saved stated, not real-time)" msgstr "Ma elérhető idő (mentett kijelentve, nem valósidejű)" #: resource/client/forms/admin.glade:674 msgid "Time left (today):" msgstr "Még hátralévő idő (ma):" #: resource/client/forms/admin.glade:716 msgid "Time spent today (saved stated, not real-time)" msgstr "Mai napon felhasznált idő (tárolt állapot, nem valós idejű)" #: resource/client/forms/admin.glade:718 msgid "Time spent (today):" msgstr "Felhasznált idő (ma):" #: resource/client/forms/admin.glade:747 msgid "Time spent this week (saved stated, not real-time)" msgstr "A héten felhasznált idő (mentett állapot, nem valós idejű)" #: resource/client/forms/admin.glade:749 resource/client/forms/client.glade:717 msgid "Time spent (week):" msgstr "Felhasznált idő (hét):" #: resource/client/forms/admin.glade:777 msgid "Time spent this month (saved stated, not real-time)" msgstr "Ebben a hónapban felhasznált idő (mentett állapot, nem valós idejű)" #: resource/client/forms/admin.glade:779 resource/client/forms/client.glade:744 msgid "Time spent (month):" msgstr "Felhasznált idő (hónap):" #: resource/client/forms/admin.glade:861 msgid "Allowance adjustments" msgstr "" #: resource/client/forms/admin.glade:885 #, fuzzy #| msgid "Set day's time limit" msgid "today's time" msgstr "Napi időkorlát meghatározása" #: resource/client/forms/admin.glade:889 msgid "Choose this to adjust user's time allowance for today" msgstr "" #: resource/client/forms/admin.glade:901 msgid "PlayTime" msgstr "" #: resource/client/forms/admin.glade:905 msgid "Choose this to adjust user's PlayTime allowance for today" msgstr "" #: resource/client/forms/admin.glade:934 msgid "hr" msgstr "óra" #: resource/client/forms/admin.glade:945 msgid "The number of minutes to be adjusted for today's limit" msgstr "A mai napi időkorláthoz beállítandó percek" #: resource/client/forms/admin.glade:961 msgid "The number of hours to be adjusted for today's limit" msgstr "A mai napi időkorláthoz beállítandó órák" #: resource/client/forms/admin.glade:977 msgid "min" msgstr "perc" #: resource/client/forms/admin.glade:1004 msgid "Add specified time (reward)" msgstr "Megadott mennyiség hozzáadása (jutalom)" #: resource/client/forms/admin.glade:1020 msgid "Subtract specified time (penalty)" msgstr "Megadott mennyiség levonása (büntetés)" #: resource/client/forms/admin.glade:1036 #, fuzzy #| msgid "Set this specific limit" msgid "Set this specific time limit" msgstr "Pontosan megadott időkorlát beállítása" #: resource/client/forms/admin.glade:1101 msgid "Information about PlayTime" msgstr "" #: resource/client/forms/admin.glade:1134 #, fuzzy #| msgid "" #| "How long user was inactive since last login (realtime, available when " #| "user is logged in)" msgid "" "Actual PlayTime available today (realtime, available when user is logged in)" msgstr "" "Meddig volt inaktív a felhasználó a legutóbbi bejelentkezés óta (valós " "idejű, elérhető, amikor a felhasználó be van jelentkezve)" #: resource/client/forms/admin.glade:1136 #, fuzzy #| msgid "Time left (actual):" msgid "PlayTime left (actual):" msgstr "Hátralévő idő (tényleges):" #: resource/client/forms/admin.glade:1150 #: resource/client/forms/admin.glade:1181 #: resource/client/forms/admin.glade:1269 #, fuzzy #| msgid "Format: " msgid "Format: " msgstr "Formátum: " #: resource/client/forms/admin.glade:1165 #, fuzzy #| msgid "Time available today (saved stated, not real-time)" msgid "PlayTime available today (saved stated, not real-time)" msgstr "Ma elérhető idő (mentett kijelentve, nem valósidejű)" #: resource/client/forms/admin.glade:1167 #, fuzzy #| msgid "Time left (today):" msgid "PlayTime left (today):" msgstr "Még hátralévő idő (ma):" #: resource/client/forms/admin.glade:1196 #: resource/client/forms/admin.glade:1212 #, fuzzy #| msgid "" #| "How long user was inactive since last login (realtime, available when " #| "user is logged in)" msgid "" "Active PlayTime activity count (realtime, available when user is logged in)" msgstr "" "Meddig volt inaktív a felhasználó a legutóbbi bejelentkezés óta (valós " "idejű, elérhető, amikor a felhasználó be van jelentkezve)" #: resource/client/forms/admin.glade:1198 #, fuzzy #| msgid "Time inactive (actual):" msgid "Running activities (actual):" msgstr "Hátralévő idő (tényleges):" #: resource/client/forms/admin.glade:1253 #, fuzzy #| msgid "Time spent today (saved stated, not real-time)" msgid "PlayTime spent today (saved stated, not real-time)" msgstr "Mai napon felhasznált idő (tárolt állapot, nem valós idejű)" #: resource/client/forms/admin.glade:1255 #, fuzzy #| msgid "Time spent (today):" msgid "PlayTime spent (today):" msgstr "Felhasznált idő (ma):" #: resource/client/forms/admin.glade:1306 msgid "" "Brief information about time spent and everything related to time management " "for this day" msgstr "Rövid összefoglaló a mai napon felhasznált időről és az időkezelésről" #: resource/client/forms/admin.glade:1307 msgid "Info & Today" msgstr "Infó & ma" #: resource/client/forms/admin.glade:1348 #, fuzzy msgid "This lets you configure time limits." msgstr "Ez lehetővé teszi a mai határidők megváltoztatását" #: resource/client/forms/admin.glade:1350 #, fuzzy #| msgid "Weekly & Monthly limits" msgid "Week day limits" msgstr "Heti & havi időkorlátok" #. This is meant for very short (e.g. one letter) abbreviation of hours #: resource/client/forms/admin.glade:1370 #: resource/client/forms/admin.glade:1865 #: resource/client/forms/admin.glade:2265 #, fuzzy #| msgid "hr" msgid "h" msgstr "óra" #: resource/client/forms/admin.glade:1374 #: resource/client/forms/admin.glade:2269 #, fuzzy #| msgid "The amount of hours to be adjusted for today's limit" msgid "Choose hours to be adjusted for selected days." msgstr "A mai napi időkorláthoz beállítandó órák" #. This is meant for very short (e.g. one letter) abbreviation of minutes #: resource/client/forms/admin.glade:1386 #: resource/client/forms/admin.glade:1881 #: resource/client/forms/admin.glade:2281 msgid "m" msgstr "" #: resource/client/forms/admin.glade:1390 #: resource/client/forms/admin.glade:2285 #, fuzzy #| msgid "The amount of minutes to be adjusted for today's limit" msgid "Choose minutes to be adjusted for selected days." msgstr "A mai napi időkorláthoz beállítandó percek" #: resource/client/forms/admin.glade:1410 msgid "" "Increase daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:1427 msgid "" "Decrease daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:1474 #, fuzzy #| msgid "" #| "Lists day of the week and additional information about the day's limit. " #| "Please enable / disable days for the user." msgid "" "Lists day of the week and additional information about the day's limit.\n" "\n" "Please enable / disable days for the user." msgstr "" "A hét napjainak listája és információ a napi időkorlátokról, felhasználó " "napjainak engedélyezése / tiltása." #: resource/client/forms/admin.glade:1550 #, fuzzy #| msgid "" #| "Hour intervals per day available to this user.\n" #| "Please note that if the day's limit ends at 24:00 and the next day's " #| "limit starts at 00:00, then the user can work continuously past " #| "midnight.\n" #| "Please note that multiple intervals cannot be configured within the same " #| "hour. An interval can start or end or contain a specific hour, but not " #| "more than once. This is by design, not a bug." msgid "" "Hour intervals for selected day available to the user.\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead.\n" "\n" "Please note that if the day's limit ends at 24:00 and the next day's limit " "starts at 00:00, then the user can work continuously past midnight.\n" "\n" "Please note that multiple intervals cannot be configured within the same " "hour.\n" "An interval can start or end or contain a specific hour, but not more than " "once. This is by design, not a bug.\n" "\n" msgstr "" "Felhasználónak rendelkezésére álló napi óra időkeret.\n" "Megjegyzés: ha egy nap a 24. órában véget és a következő nap a 0. órával " "megkezdődik, akkor a felhasználható idő átnyúlik az éjfélen.\n" "Megjegyzés: egy órán belül nem lehet több intervallumot beállítani. " "Kizárólag egy időintervallum eleje és vége lehet ugyanazon az órában (ez " "szándékolt, nem hiba)" #: resource/client/forms/admin.glade:1581 msgid "Hour intervals" msgstr "Óra időközök" #: resource/client/forms/admin.glade:1603 msgid "" "Create a new time interval that will be available to the user.\n" "\n" "After creating the interval, please edit its start and end times directly in " "interval list." msgstr "" #: resource/client/forms/admin.glade:1620 msgid "Delete the selected time interval from the available list of intervals." msgstr "" #: resource/client/forms/admin.glade:1688 #, fuzzy #| msgid "Hour intervals" msgid "enter hour intervals" msgstr "Óra időközök" #: resource/client/forms/admin.glade:1742 msgid "verify" msgstr "" #: resource/client/forms/admin.glade:1746 msgid "" "Verify configured time intervals. This is a mandatory step to ensure that " "intervals are correct.\n" "\n" "Intervals which have problems will be highlighted." msgstr "" #: resource/client/forms/admin.glade:1821 #, fuzzy #| msgid "Weekly & Monthly limits" msgid "Weekly and monthly limits" msgstr "Heti & havi időkorlátok" #. This is meant for very short (e.g. one letter) abbreviation of days #: resource/client/forms/admin.glade:1849 msgid "d" msgstr "" #: resource/client/forms/admin.glade:1853 msgid "Choose days to be adjusted for selected period." msgstr "" #: resource/client/forms/admin.glade:1869 #, fuzzy #| msgid "The amount of hours to be adjusted for today's limit" msgid "Choose hours to be adjusted for selected period." msgstr "A mai napi időkorláthoz beállítandó órák" #: resource/client/forms/admin.glade:1885 #, fuzzy #| msgid "The amount of minutes to be adjusted for today's limit" msgid "Choose minutes to be adjusted for selected period." msgstr "A mai napi időkorláthoz beállítandó percek" #: resource/client/forms/admin.glade:1913 msgid "" "Increase weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" #: resource/client/forms/admin.glade:1927 msgid "" "Decrease weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" #: resource/client/forms/admin.glade:1976 msgid "" "Weekly and monthly limits for the user.\n" "\n" "These limits are applied to user together with the rest of limit " "configuration." msgstr "" #: resource/client/forms/admin.glade:2016 msgid "Apply daily limits" msgstr "Napi korlátok alkalmazása" #: resource/client/forms/admin.glade:2021 #, fuzzy #| msgid "Apply all changes made in this page" msgid "Apply limit all changes made in this page" msgstr "Az ezen a lapon eszközölt összes változtatás alkalmazása" #: resource/client/forms/admin.glade:2042 msgid "Daily limit configuration for all week days" msgstr "Napi korlát beállítása az összes munkanapra" #: resource/client/forms/admin.glade:2043 #, fuzzy #| msgid "Limits & Configuration" msgid "Limit configuration" msgstr "Korlátok & konfiguráció" #: resource/client/forms/admin.glade:2064 msgid "Settings for PlayTime activities" msgstr "" #: resource/client/forms/admin.glade:2084 msgid "PlayTime options" msgstr "" #: resource/client/forms/admin.glade:2108 #: resource/client/forms/admin.glade:2147 msgid "Enable PlayTime for selected user" msgstr "" #: resource/client/forms/admin.glade:2110 msgid "Enable PlayTime:" msgstr "" #: resource/client/forms/admin.glade:2124 #: resource/client/forms/admin.glade:2161 msgid "" "Enable PlayTime override for selected user.\n" "\n" "This setting overrides time accounting in a way that time is accounted only " "when at least one of the applications on the PlayTime activity list are " "running!\n" "\n" "This affects only time accounting, intervals are still fully enforced!\n" "\n" "If no processes are running, time is accounted as idle thus effectively it's " "free time for user!" msgstr "" #: resource/client/forms/admin.glade:2132 msgid "Enable PlayTime override:" msgstr "" #: resource/client/forms/admin.glade:2180 #: resource/client/forms/admin.glade:2201 msgid "" "Allow PlayTime activities during unaccounted (\"∞\") time intervals for " "selected user.\n" "\n" "This setting allows the user to use applications configured in his PlayTime " "activity list during time intervals which are marked as unaccounted (\"∞" "\").\n" "\n" "If this setting is enabled, the use of activities will not be accounted " "towards PlayTime limits, otherwise applications in PlayTime activity list " "will be terminated as soon as they are started during unaccounted (\"∞\") " "time intervals." msgstr "" #: resource/client/forms/admin.glade:2186 msgid "Allowed during \"∞\" intervals:" msgstr "" #: resource/client/forms/admin.glade:2245 #, fuzzy msgid "This lets you configure PlayTime limits." msgstr "Ez lehetővé teszi a mai határidők megváltoztatását" #: resource/client/forms/admin.glade:2247 #: resource/client/forms/client.glade:1253 #, fuzzy #| msgid "Daily limits" msgid "PlayTime limits" msgstr "Napi korlátok" #: resource/client/forms/admin.glade:2305 msgid "" "Increase daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:2322 msgid "" "Decrease daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:2374 #, fuzzy #| msgid "" #| "Lists day of the week and additional information about the day's limit. " #| "Please enable / disable days for the user." msgid "" "Lists day of the week and additional information about the day's PlayTime " "limit.\n" "\n" "Please enable / disable days for the user and set time allowance for " "PlayTime activities." msgstr "" "A hét napjainak listája és információ a napi időkorlátokról, felhasználó " "napjainak engedélyezése / tiltása." #: resource/client/forms/admin.glade:2423 #, fuzzy #| msgid "Time inactive:" msgid "PlayTime activities" msgstr "Inaktív idő:" #: resource/client/forms/admin.glade:2445 msgid "" "Add new PlayTime activity.\n" "\n" "Please specify activity mask and user friendly description in the activity " "list directly." msgstr "" #: resource/client/forms/admin.glade:2462 msgid "Remove selected entry from PlayTime activities." msgstr "" #: resource/client/forms/admin.glade:2506 msgid "" "Please specify a list of full process (executable) names without path as " "case sensitive strings to be monitored in the system.\n" "\n" "It's possible to specify RegExp masks for processes too, but please be very " "careful about them as misusing this setting may lead to killing unwanted " "processes for the user!\n" "\n" "NOTE: RegExp is an expert setting!" msgstr "" #: resource/client/forms/admin.glade:2546 #, fuzzy #| msgid "Users related configuration" msgid "Apply PlayTime configuration" msgstr "Felhasználói beállítások" #: resource/client/forms/admin.glade:2550 msgid "Apply PlayTime limits and configuration changes on this page" msgstr "" #: resource/client/forms/admin.glade:2569 #, fuzzy #| msgid "Timekpr-nExT Configuration" msgid "PlayTime configuration" msgstr "Timekpr-nExT beállítások" #: resource/client/forms/admin.glade:2594 #, fuzzy msgid "Additional configuration options" msgstr "További konfigurációs lehetőségek" #: resource/client/forms/admin.glade:2629 #: resource/client/forms/admin.glade:2652 #, fuzzy #| msgid "" #| "Select whether inactive session time is counted. If this is unchecked, " #| "time spent in console (not terminal emulator) login sessions and while " #| "the screen is locked is NOT taken into account. This varies among desktop " #| "environments." msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account. This " "varies among desktop environments." msgstr "" "Válasszuk ki, hogy az inaktív munkamenetek ideje számít-e. Ha nincsen " "kiválasztva, akkor a zárolt képernyő alatt a konzolban (nem egy terminálban) " "töltött idő nem lesz figyelembe véve (ez asztali környezetenként nagy " "mértékben eltérhet)" #: resource/client/forms/admin.glade:2633 msgid "Track inactive sessions:" msgstr "Inaktív munkamenetek követése:" #: resource/client/forms/admin.glade:2669 #: resource/client/forms/admin.glade:2692 #, fuzzy msgid "" "Select whether to show Timekpr-next's padlock icon and notifications to the " "user.\n" "\n" "Please note that unchecking this will disable showing all information and " "notifications to the user!" msgstr "" "Válassza ki, hogy megjelenjen-e a lakat ikon és az értesítések a felhasználó " "számára.\n" "Felhívjuk figyelmét, hogy ez letiltja az összes információ és értesítés " "megjelenítését a felhasználó számára!" #: resource/client/forms/admin.glade:2673 msgid "Hide icon and notifications:" msgstr "Ikon és értesítések elrejtése:" #: resource/client/forms/admin.glade:2744 #, fuzzy msgid "" "Select a restriction / lockout type for the user.\n" "\n" "NOTE: please be very careful, think ahead and read every options description " "when changing this setting from default value!" msgstr "" "Válasszon egy korlátozási / zárolási típust a felhasználó számára.\n" "MEGJEGYZÉS: kérjük, legyen nagyon körültekintő, gondolkodjon előre és " "olvassa el az összes opció leírását, amikor megváltoztatja ezt a beállítást " "az alapértelmezett értékről!" #: resource/client/forms/admin.glade:2748 #, fuzzy msgid "Restriction / lockout type:" msgstr "Korlátozás / zárolás típusa:" #: resource/client/forms/admin.glade:2770 #, fuzzy msgid "terminate sessions" msgstr "szekciók befejezése" #: resource/client/forms/admin.glade:2774 #, fuzzy msgid "" "When time ends, user sessions will be terminated.\n" "\n" "This option is a restriction!\n" "\n" "This is the default option and most likely is the one you need!" msgstr "" "Az idő lejártakor a felhasználói munkamenetek befejeződnek.\n" "Ez az opció korlátozás!\n" "Ez az alapértelmezett opció, és valószínűleg ez az, amelyre szüksége van!" #: resource/client/forms/admin.glade:2792 #, fuzzy msgid "shutdown computer" msgstr "leállított számítógép" #: resource/client/forms/admin.glade:2796 #, fuzzy msgid "" "When time ends, computer will be shut down.\n" "\n" "This option is a restriction!\n" "\n" "Please evaluate whether you need this type of restriction!" msgstr "" "Ha lejár az idő, a számítógép leáll.\n" "Ez az opció korlátozás!\n" "Kérjük, értékelje, hogy szüksége van-e ilyen típusú korlátozásra!" #: resource/client/forms/admin.glade:2814 #, fuzzy msgid "suspend computer" msgstr "függessze fel a számítógépet" #: resource/client/forms/admin.glade:2818 #, fuzzy msgid "" "When time ends, computer will be suspended (put to sleep).\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Ha lejár az idő, a számítógépet felfüggesztik (elalszik).\n" "Ez az opció nem korlátozás, és inkább önkontroll célokra alkalmas.\n" "Amikor felébred, amikor még nincs idő, a számítógép képernyője zárolva lesz, " "és egy idő után újra elalszik." #: resource/client/forms/admin.glade:2836 #, fuzzy msgid "suspend / wakeup computer" msgstr "felfüggesztés / ébresztés számítógép" #: resource/client/forms/admin.glade:2840 #, fuzzy msgid "" "When time ends, computer will be suspended (put to sleep) and will be woken " "up at start of next available time interval for the user.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Az idő lejártával a számítógépet felfüggesztik (elalszik), és felébresztik a " "felhasználó számára elérhető következő időintervallum elején.\n" "Ez az opció nem korlátozás, és inkább önkontroll célokra alkalmas.\n" "Amikor felébred, amikor még nincs idő, a számítógép képernyője zárolva lesz, " "és egy idő után újra elalszik." #: resource/client/forms/admin.glade:2858 #, fuzzy msgid "lock screen" msgstr "zár képernyőn" #: resource/client/forms/admin.glade:2862 #, fuzzy msgid "" "When time ends, computer screen will be locked.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes." msgstr "" "Az idő lejártakor a számítógép képernyője zárolva lesz.\n" "Ez az opció nem korlátozás, és inkább önkontroll célokra alkalmas." #: resource/client/forms/admin.glade:2893 #, fuzzy msgid "" "Select a time interval when computer can be woken up automatically.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Válassza ki azt az időintervallumot, amikor a számítógép automatikusan " "felébreszthető.\n" "Felhívjuk figyelmét, hogy ez az opció csak akkor hatékony, ha a RealTime " "Clock felébresztést támogatja és engedélyezi a BIOS / UEFI!" #: resource/client/forms/admin.glade:2897 #, fuzzy msgid "Wakeup hour interval:" msgstr "Ébresztési időintervallum:" #: resource/client/forms/admin.glade:2909 #, fuzzy msgid "" "Enter start hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Adja meg az automatikus ébresztés kezdési óráját.\n" "Felhívjuk figyelmét, hogy ez az opció csak akkor hatékony, ha a RealTime " "Clock felébresztést támogatja és engedélyezi a BIOS / UEFI!" #: resource/client/forms/admin.glade:2928 #, fuzzy msgid "" "Enter end hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Adja meg a záró órát az automatikus ébresztés funkcióhoz.\n" "Felhívjuk figyelmét, hogy ez az opció csak akkor hatékony, ha a RealTime " "Clock felébresztést támogatja és engedélyezi a BIOS / UEFI!" #: resource/client/forms/admin.glade:2966 #, fuzzy #| msgid "Configuration" msgid "Apply configuration" msgstr "Beállítások" #: resource/client/forms/admin.glade:2970 #, fuzzy msgid "Apply additional configuration changes on this page" msgstr "További konfigurációs lehetőségek" #: resource/client/forms/admin.glade:2989 #, fuzzy msgid "Additional configuration" msgstr "További konfiguráció" #: resource/client/forms/admin.glade:2990 #: resource/client/forms/admin.glade:3661 #, fuzzy msgid "Additional options" msgstr "További beállítások" #: resource/client/forms/admin.glade:3017 msgid "User Configuration" msgstr "Felhasználói beállítás" #: resource/client/forms/admin.glade:3027 #, fuzzy #| msgid "Timekpr-nExT Configuration" msgid "Timekpr-nExT related configuration" msgstr "Timekpr-nExT beállítások" #: resource/client/forms/admin.glade:3054 msgid "Control Timekpr-nExT Settings" msgstr "A Timekpr-nExT beállítások kezelése" #: resource/client/forms/admin.glade:3081 #: resource/client/forms/admin.glade:3233 #, fuzzy #| msgid "" #| "Timekpr-nExT log level. Please do not change this unless asked. You " #| "likely won't find anything pretty in the log files.\n" #| "1 - standard, 2 - debug, 3 - extra debug" msgid "" "Timekpr-nExT log level.\n" "\n" "Please do not change this unless you have to. You likely won't find anything " "pretty in the log files.\n" "\n" "Values are: 1 - standard, 2 - debug, 3 - extra debug" msgstr "" "A Timekpr-nExT naplózási szinje. Csak kérés esetén változtassuk " "(valószínűleg semmi hasznos nem található a naplófájlokban)\n" "1 - standard, 2 - debug, 3 - extra debug" #: resource/client/forms/admin.glade:3101 #: resource/client/forms/admin.glade:3149 #, fuzzy #| msgid "" #| "Specify session polling time granularity (how often user sessions and " #| "activity are checked).\n" #| "3 - 5 seconds are optimal, don't change this if unsure." msgid "" "Session polling time granularity which specifies how often user sessions and " "activity are checked and accounted.\n" "\n" "3 - 5 seconds are optimal, don't change this if unsure." msgstr "" "A munkamenet lekérdezésének időköze (amilyen időközönként a felhasználói " "munkamenetet és az aktivitási állapotokat lekérdezzük)\n" "3-5 másodperc az optimális, ne változtassuk, ha nem vagyunk biztosak." #: resource/client/forms/admin.glade:3105 msgid "Poll interval" msgstr "Lekérdezési intervallum" #: resource/client/forms/admin.glade:3117 #: resource/client/forms/admin.glade:3220 #, fuzzy #| msgid "" #| "Specify the time in seconds when Timekpr-nExT starts continuous real-time " #| "countdown before terminating the session" msgid "" "Specify the time in seconds when Timekpr-nExT starts continuous real-time " "countdown before enforcing a restriction / lockout to user's sessions." msgstr "" "A Timekpr-nExT munkamenet lezárása előtti, valós idejű visszaszámlálásának " "időtartama másodpercekben" #: resource/client/forms/admin.glade:3133 #: resource/client/forms/admin.glade:3183 msgid "" "This specifies the rate in seconds at which actual user state is saved to " "disk.\n" "\n" "To improve performance and still have great accuracy, Timekpr-nExT accounts " "time in memory at \"Poll interval\" frequency, this setting defines a " "frequency at which user state is saved to disk for permanent storage." msgstr "" #: resource/client/forms/admin.glade:3137 msgid "Save time" msgstr "Idő mentése" #: resource/client/forms/admin.glade:3167 #: resource/client/forms/admin.glade:3202 msgid "" "Number of seconds left for user before enforcing a configured restriction / " "lockout to his sessions.\n" "\n" "After this is reached and user is still active, the user's sessions will be " "handled according to specified restriction / lockout, and almost nothing can " "be done to prevent it." msgstr "" #: resource/client/forms/admin.glade:3171 msgid "Termination time" msgstr "Befejezés ideje" #: resource/client/forms/admin.glade:3222 #, fuzzy #| msgid "Termination time" msgid "Countdown time" msgstr "Befejezés ideje" #: resource/client/forms/admin.glade:3239 msgid "Log level" msgstr "Naplózási szint" #: resource/client/forms/admin.glade:3250 #: resource/client/forms/admin.glade:3266 msgid "" "Number of seconds left for user's available time before sending a final " "critical notification that time is about to run out.\n" "\n" "NOTE: the rest of the notification times are configurable per user by user " "in client application!" msgstr "" #: resource/client/forms/admin.glade:3254 #, fuzzy #| msgid "Show all notifications" msgid "Final notification" msgstr "Összes értesítés megjelenítése" #: resource/client/forms/admin.glade:3308 msgid "Control Timekpr-nExT tracking items" msgstr "A Timekpr-nExT által felügyelt állapotok kezelése" #: resource/client/forms/admin.glade:3341 msgid "Tracked Sessions" msgstr "Felügyelet munkamenetek" #: resource/client/forms/admin.glade:3364 msgid "Add tracked session type to the list" msgstr "Felügyelt munkamenet-típus hozzáadása a listához" #: resource/client/forms/admin.glade:3379 msgid "Remove tracked session type from the list" msgstr "Felügyelt munkamenet-típus eltávolítása a listáról" #: resource/client/forms/admin.glade:3408 #, fuzzy #| msgid "" #| "List of session types to be tracked.\n" #| "Please, do not change or experiment with this unless you actually (not " #| "wishfully) know what you are doing." msgid "" "List of session types to be tracked.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Felügyelendő munkamenetek típusa.\n" "Ezt lehetőleg ne változtassa meg, hacsak nem tudja pontosan, mit csinál." #: resource/client/forms/admin.glade:3442 msgid "Excluded Sessions" msgstr "Kizárt munkamenetek" #: resource/client/forms/admin.glade:3465 msgid "Add an excluded session type to the list" msgstr "Kizárt munkamenet típusának hozzáadása a listához" #: resource/client/forms/admin.glade:3480 msgid "Remove an excluded session type from the list" msgstr "Kizárt munkamenet típusának eltávolítása a listából" #: resource/client/forms/admin.glade:3509 #, fuzzy #| msgid "" #| "List of sessions to be excluded from tracking.\n" #| "Please, do not change or experiment with this unless you actually (not " #| "wishfully) know what you are doing." msgid "" "List of sessions to be excluded from tracking.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "A felügyelet alól kizárt munkamenetek.\n" "Ezt lehetőleg ne változtassa meg, hacsak nem tudja pontosan, mit csinál." #: resource/client/forms/admin.glade:3543 msgid "Excluded Users" msgstr "Kizárt felhasználók" #: resource/client/forms/admin.glade:3566 msgid "Add a user to the exclusion list" msgstr "Felhasználó hozzáadása a kizárási listához" #: resource/client/forms/admin.glade:3581 msgid "Remove a user from the exclusion list" msgstr "Felhasználó eltávolítása a kizárási listáról" #: resource/client/forms/admin.glade:3610 #, fuzzy #| msgid "" #| "List of users excluded from tracking.\n" #| "Please specify actual usernames, not real names here. For example, " #| "\"jsmith\", not \"John Smith\"." msgid "" "List of users excluded from tracking.\n" "\n" "Please specify actual usernames, not real names here. For example, \"jsmith" "\", not \"John Smith\"." msgstr "" "Felügyelet alól kizárt felhasználók.\n" "Valós felhasználóneveket kell megadni, nem való neveket (pl. \"kovacsj\", " "nem \"Kovács János\")" #: resource/client/forms/admin.glade:3688 #: resource/client/forms/admin.glade:3707 #: resource/client/forms/admin.glade:3743 msgid "" "This setting controls whether PlayTime functionality is enabled.\n" "\n" "This is a PlayTime master switch, if it's turned off, it's turned off for " "everyone regardless of individual settings!" msgstr "" #: resource/client/forms/admin.glade:3692 msgid "PlayTime enabled:" msgstr "" #: resource/client/forms/admin.glade:3722 msgid "" "This setting controls whether PlayTime activity monitor will use process " "command line, including arguments, for monitoring processes (by default only " "uses the process name).\n" "\n" "When this setting is enabled Timekpr-nExT will perform a match against full " "command line up to 512 characters enabling enhanced process monitoring " "capabilities.\n" "\n" "Please be careful and double check your RegExp patterns in each individual " "user's PlayTime activity masks!" msgstr "" #: resource/client/forms/admin.glade:3728 msgid "Enhanced activity monitor:" msgstr "" #: resource/client/forms/admin.glade:3777 #, fuzzy #| msgid "Apply Timekpr-nExT setings" msgid "Apply Timekpr-nExT settings" msgstr "Timekpr-nExT beállítások alkalmazása" #: resource/client/forms/admin.glade:3782 msgid "Apply all Timekpr-nExT settings at once" msgstr "Timekpr-nExT beállítások együttes alkalmazása" #: resource/client/forms/admin.glade:3802 msgid "Timekpr-nExT Administration Configuration" msgstr "Timekpr-nExT adminisztráció beállítása" #: resource/client/forms/admin.glade:3803 msgid "Timekpr-nExT Configuration" msgstr "Timekpr-nExT beállítások" #: resource/client/forms/admin.glade:3832 #: resource/client/forms/admin.glade:3849 msgid "Status of Timekpr-nExT admin client" msgstr "A Timekpr-nExT admin kliens állapota" #. This is one of the notification priorities #: resource/client/forms/client.glade:27 #, fuzzy #| msgid "Configuration" msgid "Information" msgstr "Beállítások" #. This is one of the notification priorities #: resource/client/forms/client.glade:31 #, fuzzy #| msgid "Warning time" msgid "Warning" msgstr "Riasztás időzítése" #. This is one of the notification priorities #: resource/client/forms/client.glade:35 msgid "Severe" msgstr "" #. This is one of the notification priorities #: resource/client/forms/client.glade:39 msgid "Critical" msgstr "" #: resource/client/forms/client.glade:133 msgid "Timekpr-nExT client" msgstr "Timekpr-nExT kliens" #: resource/client/forms/client.glade:164 msgid "Status of Timekpr-nExT client" msgstr "A Timekpr-nExT kliens állapota" #: resource/client/forms/client.glade:196 msgid "Save all changes" msgstr "Összes változtatás mentése" #: resource/client/forms/client.glade:213 msgid "Close the window" msgstr "Az ablak bezárása" #: resource/client/forms/client.glade:297 #: resource/client/forms/client.glade:314 msgid "Current effective username" msgstr "A jelenleg hatásos felhasználónév" #: resource/client/forms/client.glade:371 msgid "Current statistics" msgstr "Aktuális statisztikák" #: resource/client/forms/client.glade:396 msgid "Time spent this session or after Timekpr-nExT has been restarted" msgstr "" "Az ebben a munkamenetben vagy a Timekpr-nExT újraindítása óta felhasznált idő" #: resource/client/forms/client.glade:398 msgid "Time spent (session):" msgstr "Felhasznált idő (munkamenet):" #: resource/client/forms/client.glade:441 msgid "Time inactive this session or after Timekpr-nExT has been restarted" msgstr "" "Inaktív felhasználási idő ebben a munkamenetben vagy a Timekpr-nExT " "újraindítása óta" #: resource/client/forms/client.glade:443 msgid "Time inactive:" msgstr "Inaktív idő:" #: resource/client/forms/client.glade:469 #, fuzzy msgid "Continuous time left to you. May span more than the current day." msgstr "" "A megszakítások nélkül rendelkezésre álló idő, mely akár a következő napra " "is áthúzódhat." #: resource/client/forms/client.glade:471 msgid "Continuous time left:" msgstr "Megszakítások nélkül rendelkezésre álló idő:" #: resource/client/forms/client.glade:487 msgid "Total time available left today in a row, up to the end of the day" msgstr "A nap végéig fennmaradó idő" #: resource/client/forms/client.glade:489 #: resource/client/forms/client.glade:974 msgid "Time left today:" msgstr "Mai fennmaradó idő:" #: resource/client/forms/client.glade:548 msgid "These are the days and limits that are available to you" msgstr "A rendelkezésre álló napok és korlátok" #: resource/client/forms/client.glade:573 #: resource/client/forms/client.glade:1171 msgid "Days & Limits" msgstr "Napok & korlátok" #: resource/client/forms/client.glade:609 msgid "" "This shows the time intervals that are available for use.\n" "\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead." msgstr "" #: resource/client/forms/client.glade:634 msgid "Intervals" msgstr "Időközök" #: resource/client/forms/client.glade:663 msgid "Daily limits" msgstr "Napi korlátok" #: resource/client/forms/client.glade:691 msgid "Additional statistics" msgstr "További statisztikák" #: resource/client/forms/client.glade:715 msgid "Time spent this week" msgstr "Ezen a héten felhasznált idő" #: resource/client/forms/client.glade:742 msgid "Time spent this month" msgstr "Ebben a hónapban felhasznált idő" #: resource/client/forms/client.glade:755 #, fuzzy #| msgid "" #| "Select whether inactive session time is counted. If this is unchecked, " #| "time spent in console (not terminal emulator) login sessions and while " #| "the screen is locked is NOT taken into account. This varies among desktop " #| "environments." msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account.\n" "This varies among desktop environments." msgstr "" "Válasszuk ki, hogy az inaktív munkamenetek ideje számít-e. Ha nincsen " "kiválasztva, akkor a zárolt képernyő alatt a konzolban (nem egy terminálban) " "töltött idő nem lesz figyelembe véve (ez asztali környezetenként nagy " "mértékben eltérhet)" #: resource/client/forms/client.glade:760 msgid "Track inactive:" msgstr "Inaktív idő felügyelete:" #: resource/client/forms/client.glade:773 msgid "" "Select whether inactive session time is counted. If this is unchecked, time " "spent in console (not terminal emulator) login sessions and while the screen " "is locked is NOT taken into account. This varies among desktop environments." msgstr "" "Válasszuk ki, hogy az inaktív munkamenetek ideje számít-e. Ha nincsen " "kiválasztva, akkor a zárolt képernyő alatt a konzolban (nem egy terminálban) " "töltött idő nem lesz figyelembe véve (ez asztali környezetenként nagy " "mértékben eltérhet)" #: resource/client/forms/client.glade:820 #: resource/client/forms/client.glade:918 msgid "Additional limits" msgstr "További korlátok" #: resource/client/forms/client.glade:844 msgid "Time limit for this week available to you" msgstr "Rendelkezésre álló heti időkorlát" #: resource/client/forms/client.glade:846 msgid "Time limit (week):" msgstr "Időkorlát (hét):" #: resource/client/forms/client.glade:872 msgid "Time limit for this month available to you" msgstr "Rendelkezésre álló havi időkorlát" #: resource/client/forms/client.glade:874 msgid "Time limit (month):" msgstr "Időkorlát (havi):" #: resource/client/forms/client.glade:948 #, fuzzy #| msgid "Current statistics" msgid "Current PlayTime statistics" msgstr "Aktuális statisztikák" #: resource/client/forms/client.glade:972 msgid "Total PlayTime available left today" msgstr "" #: resource/client/forms/client.glade:998 #, fuzzy #| msgid "Time spent (today):" msgid "Total PlayTime spent today" msgstr "Felhasznált idő (ma):" #: resource/client/forms/client.glade:1000 #, fuzzy #| msgid "Time spent (today):" msgid "Time spent today:" msgstr "Felhasznált idő (ma):" #: resource/client/forms/client.glade:1027 #: resource/client/forms/client.glade:1042 msgid "" "This option overrides the default time accounting.\n" "\n" "If it's checked, the time is accounted only when activities in \"Activity / " "application list\" are running, the rest of the time is considered idle." msgstr "" #: resource/client/forms/client.glade:1046 #, fuzzy #| msgid "Time limit (week):" msgid "Time limit override:" msgstr "Időkorlát (hét):" #: resource/client/forms/client.glade:1060 #: resource/client/forms/client.glade:1073 msgid "Number of currently active PlayTime activities" msgstr "" #: resource/client/forms/client.glade:1062 msgid "Running activities:" msgstr "" #: resource/client/forms/client.glade:1086 #: resource/client/forms/client.glade:1106 msgid "" "Allow activities during unaccounted (\"∞\") time intervals.\n" "\n" "This setting allows to use applications listed in \"Activity / application " "list\" during time intervals which are marked as unaccounted (\"∞\"), if the " "setting is not enabled, none of activities are allowed to run!" msgstr "" #: resource/client/forms/client.glade:1090 msgid "Allowed during \"∞\":" msgstr "" #: resource/client/forms/client.glade:1148 #, fuzzy #| msgid "These are days and limits that available to You" msgid "" "These are days and limits that available to you as part of PlayTime activity " "restrictions" msgstr "A rendelkezésre álló napok és korlátok" #: resource/client/forms/client.glade:1205 msgid "" "This shows activities / applications which are part of PlayTime restrictions" msgstr "" #: resource/client/forms/client.glade:1228 msgid "Activity / application list" msgstr "" #: resource/client/forms/client.glade:1292 msgid "" "Configuration for personalized notifications about available time.\n" "\n" "Please configure notifications as you see fit. However, please keep in mind " "that there will be two types of notifications that cannot be personalized: a " "final warning some time before time ends and a countdown notifications when " "time is about to end.\n" "\n" "The configuration \"Time\" value indicates a value of time left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" #: resource/client/forms/client.glade:1324 #, fuzzy msgid "Notification configuration" msgstr "További konfiguráció" #: resource/client/forms/client.glade:1346 #, fuzzy #| msgid "Add tracked session type to the list" msgid "Add new notification threshold to the list" msgstr "Felügyelt munkamenet-típus hozzáadása a listához" #: resource/client/forms/client.glade:1361 #, fuzzy #| msgid "Remove tracked session type from the list" msgid "Remove notification threshold from the list" msgstr "Felügyelt munkamenet-típus eltávolítása a listáról" #: resource/client/forms/client.glade:1410 msgid "" "Configuration for personalized notifications about available PlayTime.\n" "\n" "Please configure notifications as you see fit.\n" "\n" "The configuration \"Time\" value indicates a value of PlayTime left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" #: resource/client/forms/client.glade:1442 #, fuzzy #| msgid "Timekpr-nExT Administration Configuration" msgid "PlayTime notification configuration" msgstr "Timekpr-nExT adminisztráció beállítása" #: resource/client/forms/client.glade:1464 msgid "Add new PlayTime notification threshold to the list" msgstr "" #: resource/client/forms/client.glade:1479 #, fuzzy #| msgid "Remove tracked session type from the list" msgid "Remove PlayTime notification threshold from the list" msgstr "Felügyelt munkamenet-típus eltávolítása a listáról" #: resource/client/forms/client.glade:1538 #, fuzzy #| msgid "Show all notifications" msgid "Notifications" msgstr "Összes értesítés megjelenítése" #: resource/client/forms/client.glade:1562 #, fuzzy #| msgid "" #| "Select whether to use speech notifications, if available. You may be able " #| "to make speech notifications available by installing package \"python3-" #| "espeak\"." msgid "" "Select whether to use speech notifications, if available.\n" "\n" "You may be able to make speech notifications available by installing package " "\"python3-espeak\"." msgstr "" "Beszédértesítések használatának beállítása (kiszürkítve, ha nem elérhető). A " "működéshez a \"python3-espeak\" csomagnak telepítve kell lennie." #: resource/client/forms/client.glade:1572 msgid "Use speech notifications" msgstr "Beszédértesítések használata" #: resource/client/forms/client.glade:1591 #: resource/client/forms/client.glade:1613 #, fuzzy #| msgid "" #| "This sets the logging level. Please do not change this unless you know " #| "what you're doing." msgid "" "This sets the logging level.\n" "\n" "Please do not change this unless you know what you're doing." msgstr "" "Beállítja a naplózási szintet (ne állítsuk, hacsak nem tudjuk, pontosan mit " "is csinálunk)" #: resource/client/forms/client.glade:1617 msgid "Logging level" msgstr "Naplózási szint" #: resource/client/forms/client.glade:1639 msgid "" "Specify whether to show a notification when limit configurations or " "allowance changes" msgstr "" "Annak megjelenítését állíthatjuk be, hogy korlátozások beállításai vagy " "engedélyezések megváltoztak" #: resource/client/forms/client.glade:1647 msgid "Show limit changes" msgstr "Korlátok változásainak kijelzése" #: resource/client/forms/client.glade:1663 #, fuzzy #| msgid "" #| "Specify whether to show all notifications. If unchecked, then only " #| "important ones are shown" msgid "" "Specify whether to show all notifications.\n" "\n" "If unchecked, then only important ones are shown." msgstr "" "Összes értesítés megjelenítésének beállítása. Ha nincsen kijelölve, akkor " "csak a fontos lesznek megjelenítve" #: resource/client/forms/client.glade:1673 msgid "Show all notifications" msgstr "Összes értesítés megjelenítése" #: resource/client/forms/client.glade:1689 #, fuzzy #| msgid "" #| "Specify whether to show seconds in notification area. Some desktop " #| "environments, like KDE5, do not support text besides notification icons." msgid "" "Specify whether to show seconds in notification area.\n" "\n" "Some desktop environments, like KDE5, do not support text besides " "notification icons." msgstr "" "Másodpercek értesítési sávban történő megjelenítésének beállítása (egyes " "asztali környezetek, mint a KDES nem támogatják az értesítési ikonok " "melletti szöveget)" #: resource/client/forms/client.glade:1699 msgid "Show seconds in notification area" msgstr "Másodpercek megjelenítése az értesítési területen" #: resource/client/forms/client.glade:1718 #: resource/client/forms/client.glade:1742 #, fuzzy msgid "" "This sets how long a notification is shown for regular notifications about " "time left and configuration changes.\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed (not recommended for regular " "notifications).\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Ez beállítja, hogy mennyi ideig jelenjen meg egy értesítés a szokásos " "értesítéseknél a hátralévő időről és a konfigurációs változásokról.\n" "Az értéket másodpercben kell megadni, a 0 érték azt jelenti, hogy az " "elutasításig látható (nem ajánlott a rendszeres értesítéshez).\n" "Felhívjuk figyelmét, hogy az Ön által használt környezet felülbírálhatja az " "időtúllépést, ami azt jelenti, hogy ez a beállítás nincs hatással az " "értesítésre." #: resource/client/forms/client.glade:1749 msgid "Notification timeout (sec)" msgstr "Értesítési időtúllépés (mp)" #: resource/client/forms/client.glade:1774 #: resource/client/forms/client.glade:1799 #, fuzzy msgid "" "This sets how long a notification is shown for \"Critical\" notifications " "about time left (when the icon turns red).\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed.\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Ez beállítja, hogy mennyi ideig jelenjen meg egy értesítés a Kritikus " "értesítéseknél a hátralévő időről (amikor az ikon pirosra vált).\n" "Az értéket másodpercben adják meg, a 0 érték azt jelenti, hogy az " "elutasításig látható.\n" "Felhívjuk figyelmét, hogy az Ön által használt környezet felülbírálhatja az " "időtúllépést, ami azt jelenti, hogy ez a beállítás nincs hatással az " "értesítésre." #: resource/client/forms/client.glade:1806 msgid "Critical notification timeout (sec)" msgstr "Kritikus értesítési időtúllépés (mp)" #: resource/client/forms/client.glade:1828 #, fuzzy msgid "" "Select whether to use sound \"bell\" (short notification sound) to announce " "a new notification from Timekpr-nExT.\n" "\n" "This works only for enabled notifications.\n" "\n" "If this setting is not editable, your environment does not advertise sound " "notification support." msgstr "" "Válassza ki, hogy a \"csengő\" hangot (rövid értesítési hang) használja-e az " "új értesítés megjelenítéséhez a Timekpr-nExT-től. Ez csak az engedélyezett " "értesítéseknél működik.\n" "Ha a beállítás nem szerkeszthető, akkor a környezet nem hirdeti a hangos " "értesítési támogatást...." #: resource/client/forms/client.glade:1840 msgid "Use sound \"bell\" for notifications" msgstr "Használjon hangos az értesítésekhez" #: resource/client/forms/client.glade:1860 msgid "Configuration" msgstr "Beállítások" #, fuzzy #~| msgid "" #~| "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~| "Super tester: Rinalds Dobelis\n" #~| "Beta tester: SanskritFritz" #~ msgid "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Main test (ex): Rinalds Dobelis\n" #~ "Beta test: SanskritFritz" #~ msgstr "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Super tester: Rinalds Dobelis\n" #~ "Beta tester: SanskritFritz" #~ msgid "00:00:00:00" #~ msgstr "00:00:00:00" #~ msgid "Amount:" #~ msgstr "Mérték:" #~ msgid "Add" #~ msgstr "Hozzáad" #~ msgid "Subtract" #~ msgstr "Levonás" #~ msgid "Set" #~ msgstr "Beállít" #~ msgid "Configure time limits for week days" #~ msgstr "Munkanapok időkorlátjainak beállítása" #~ msgid "Set the number of hours to limit available time for particular day" #~ msgstr "Adott nap engedélyezett idejének megadása órában" #~ msgid "" #~ "Set hours and minutes at this user's disposal for this particular day. " #~ "Don't forget to hit the button!" #~ msgstr "" #~ "A felhasználó rendelkezésére álló idő megadása órában és percben egy " #~ "adott napra (ne felejtsük el az nyomógombbal igazolni)" #~ msgid "Manage intervals for the day" #~ msgstr "Napi időintervallumok kezelése" #~ msgid "Specify START minute of the allowed hour interval" #~ msgstr "Az engedélyezett óra időintervallum kezdeti percének meghatározása" #~ msgid "Specify START hour of the allowed hour interval" #~ msgstr "Az engedélyezett óra időintervallum kezdeti órájának meghatározása" #~ msgid "to" #~ msgstr "eddig" #~ msgid "Remove" #~ msgstr "Eltávolít" #~ msgid "" #~ "Remove selected interval from the list. Do not forget to hit the " #~ "button!" #~ msgstr "" #~ "A kiválasztott időintervallum eltávolítása a listából (igazolni kell az " #~ " felülettel)" #~ msgid "" #~ "Add specified hour interval to the list. Do not forget to hit the " #~ "button!" #~ msgstr "" #~ "A megadott óra időintervallum hozzáadása a listához (igazolni kell az " #~ " felülettel)" #~ msgid "Specify the END hour of the allowed hour interval" #~ msgstr "Az engedélyezett óra időintervallum befejező órájának meghatározása" #~ msgid "Specify the END minute of the allowed hour interval" #~ msgstr "Az engedélyezett óra időintervallum befejező percének meghatározása" #~ msgid "Time limit for the month" #~ msgstr "Havi időkorlát" #~ msgid "Time limit (month)" #~ msgstr "Időkorlát (hónap)" #~ msgid "Time limit for the month is enabled" #~ msgstr "A havi időkorlát be van kapcsolva" #~ msgid "Time limit for the week" #~ msgstr "Heti időkorlát" #~ msgid "Time limit (week)" #~ msgstr "Időkorlát (hét)" #~ msgid "day" #~ msgstr "nap" #~ msgid "Week limit (days part)" #~ msgstr "Heti időkorlát (napok)" #~ msgid "Week limit (hours part)" #~ msgstr "Heti időkorlát (órák)" #~ msgid "Week limit (minutes part)" #~ msgstr "Heti időkorlát (percek)" #~ msgid "Month limit (days part)" #~ msgstr "Havi időkorlát (napok)" #~ msgid "Month limit (hours part)" #~ msgstr "Havi időkorlát (órák)" #~ msgid "Month limit (minutes part)" #~ msgstr "Havi időkorlát (percek)" #~ msgid "This allows you to set up weekly and monthly limits" #~ msgstr "A heti és havi időkorlátokat lehet beállítani" #~ msgid "Apply" #~ msgstr "Alkalmaz" #~ msgid "Apply weekly and monthly limits" #~ msgstr "Heti és havi időkorlátok alkalmazása" #~ msgid "Weekly and monthly limit configuration" #~ msgstr "Heti és havi időkorlátok beállítása" #~ msgid "Set track inactive sessions" #~ msgstr "Inaktív munkamenetek követésének beállítása" #~ msgid "Set preference for showing icon to user" #~ msgstr "Állítsa be, hogy a felhasználónak milyen ikon jelenjen meg" #, fuzzy #~ msgid "Set restriction / lockout type" #~ msgstr "Állítsa be a korlátozás / zárolás típusát" #~ msgid "This specifies the frequency with which actual user state is saved" #~ msgstr "Meghatározza a tényleges felhasználói állapot mentésének időközét" #~ msgid "" #~ "Number of seconds before terminating user sessions. After this is " #~ "reached, the user's session will be terminated / locked, and nothing can " #~ "be done to prevent it.\n" #~ "Adding time does not help in this case. Do that before reaching this " #~ "point..." #~ msgstr "" #~ "A felhasználói munkamenet lezárásáig hátrelévő másodpercek. Innentől a " #~ "felhasználó kizárását már nem lehet megakadályozni.\n" #~ "Ebben az esetben idő hozzáadása már nem segít. Ezt ezelőtt az időpont " #~ "előtt kell megtenni..." #~ msgid "Enter session type to be tracked" #~ msgstr "Felügyelt munkamenet-típusok bevitele" #~ msgid "Enter session type to be excluded from tracking" #~ msgstr "Felügyelet alól kizárandó munkamenet típusának bevitele" #~ msgid "Enter username to be excluded from tracking" #~ msgstr "A felügyelet alól kizárandó felhasználók bevitele" #~ msgid "This shows the time periods that are available for your use" #~ msgstr "Rendelkezésre álló időintervallumok" #~ msgid "" #~ "==> set time left for the user at current moment, example (add one hour)" #~ msgstr "==> a felhasználó aktuálisan fennmaradó idejének beállítása, példa" #~ msgid "==> set time limits per all allowed days, example" #~ msgstr "==> időkorlátok beállítása az engedélyezett napokra, példa" #~ msgid "" #~ "==> set allowed hours per specified day or ALL for every day, example" #~ msgstr "" #~ "==> meghatározott napra vagy MINDENKINEK az összes napra engedélyezett " #~ "órák beállítása, példa" #~ msgid "==> get user configuration from the server, example" #~ msgstr "==> felhasználói konfiguráció betöltése a szerverről, példa" #~ msgid "Excluded session types list is not correct and can not be set" #~ msgstr "" #~ "Nem megfelelő a kizárt munkamenetek típuslistája és nem lehet beállítani" #~ msgid "Control sessions types list is not correct and can not be set" #~ msgstr "" #~ "Nem megfelelő a vezérlő munkamenet típuslistája és nem lehet beállítani" #~ msgid "Excluded user list is not correct and can not be set" #~ msgstr "" #~ "A kizárt felhasználók listáját nem adták át és nem lehet feldolgozni" #, python-format #~ msgid "Final warning time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "A utolsó figyelmeztetés \"%%s\" időpontja nem megfelelő és nem lehet " #~ "beállítani" #, python-format #~ msgid "Termination time \"%%s\" is not correct and can not be set" #~ msgstr "A kilépés \"%%s\" időpontja nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "Track inactive \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "A(z) \"%%s\" inaktivitás figyelése nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "Log level \"%%s\" is not correct and can not be set" #~ msgstr "A \"%%s\" naplózás szintje nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "Poll time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "A lekérdezés \"%%s\" időpontja nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "Save time \"%%s\" is not correct and can not be set" #~ msgstr "A tárolás \"%%s\" időpontja nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "User's \"%%s\" allowed hours are not correct and can not be set" #~ msgstr "" #~ "A \"%%s\" felhasználó számára engedélyezett órák nem megfelelőek és nem " #~ "lehet beállítani" #, python-format #~ msgid "User's \"%%s\" day limits list is not correct and can not be set" #~ msgstr "" #~ "A \"%%s\" felhasználó napi korlátozáslistája nem megfelelő és nem lehet " #~ "beállítani" #, python-format #~ msgid "User's \"%%s\" day list is not correct and can not be set" #~ msgstr "" #~ "A \"%%s\" felhasználó naplistája nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "User's \"%%s\" monthly allowance is not correct and can not be set" #~ msgstr "" #~ "A \"%%s\" felhasználó havi korlátja nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "User's \"%%s\" set time limit is not correct and can not be set" #~ msgstr "" #~ "A \"%%s\" felhasználó időkorlátja nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "User's \"%%s\" weekly allowance is not correct and can not be set" #~ msgstr "" #~ "A \"%%s\" felhasználó heti korlátja nem megfelelő és nem lehet beállítani" #, python-format #~ msgid "User's \"%%s\" track inactive flag is not correct and can not be set" #~ msgstr "" #~ "A \"%%s\" felhasználó inaktivitást figyelő kapcsolója nem megfelelő és " #~ "nem lehet beállítani" #~ msgid "Please select a hour interval to remove" #~ msgstr "Kérjük, válasszon egy eltávolítandó óra-időközt" #~ msgid "Interval start can not be the same as end" #~ msgstr "Az időköz kezdete nem lehet azonos a befejezésével" #~ msgid "Interval start or end duplicates existing interval" #~ msgstr "Az időköz kezdete vagy befejezése megkettőz egy már létező időközt" #~ msgid "Interval end conflicts with existing one" #~ msgstr "Az időköz befejezése ütközik egy már létezővel" #~ msgid "Interval start conflicts with existing one" #~ msgstr "Az időköz kezdete ütközik egy már létezővel" #~ msgid "Interval overlaps with existing one" #~ msgstr "Az időköz átfedésben vagy egy már létezővel" #~ msgid "please-enter-translator-credits" #~ msgstr "rolkovit+ubuntu@gmail.com" #~ msgid "" #~ "This is Timekpr-nExT configuration app. It allows you to configure time " #~ "for your users as well as the Timekpr-nExT parameters.\n" #~ "\n" #~ "To use this application, you either have to execute it as superuser or " #~ "have to be part of the timekpr group.\n" #~ "Please note that the \"Timekpr-nExT Configuration\" is available in " #~ "superuser (administrator) mode only!\n" #~ "\n" #~ "Please configure carefully: do not lock yourself out!" #~ msgstr "" #~ "Ez a Timekpr-nExT konfigurációs app. Beállíthatjuk vele a felhasználóink " #~ "idejét, valamint a Timekpr-nExT paramétereket.\n" #~ "\n" #~ "Az app futtatása superuser-ként vagy a timekpr csoport tagjaként " #~ "lehetséges.\n" #~ "A \"Timekpr-nExT konfiguráció\" csak superuser (adminisztrátor) " #~ "üzemmódban lehetséges.\n" #~ "\n" #~ "A konfiguráció során legyünk óvatosak, nehogy kizárjuk magunkat!" #~ msgid "" #~ "This allows you to change time for today as well as inactive session " #~ "tracking" #~ msgstr "" #~ "Ezzel tudjuk a mai nap idejét megváltoztatni illetve az inaktív " #~ "munkamenet figyelését beállítani" #~ msgid "Time spent for this week (saved stated, not real-time)" #~ msgstr "A héten felhasznált idő (mentett állapot, nem valós idejű)" #~ msgid "Subtract specified amount (penalty)" #~ msgstr "Megadott mennyiség levonása (büntetés)" #~ msgid "Add specified amount (reward)" #~ msgstr "Megadott mennyiség hozzáadása (jutalom)" #~ msgid "" #~ "Select whether time for inactive sessions are counted. If this is " #~ "unchecked, time spent in console (not terminal) and while screen is " #~ "locked is NOT taken into account (this very much varies from DE to DE)" #~ msgstr "" #~ "Válasszuk ki, hogy az inaktív munkamenetek ideje számít-e. Ha nincsen " #~ "kiválasztva, akkor a zárolt képernyő alatt a konzolban (nem egy " #~ "terminálban) töltött idő nem lesz figyelembe véve (ez asztali " #~ "környezetenként nagy mértékben eltérhet)" #~ msgid "Set exacly specified limit" #~ msgstr "Pontosan megadott időkorlát beállítása" #~ msgid "" #~ "Lists day of the week and additional information about the day's limit, " #~ "please enable / disable days for the user" #~ msgstr "" #~ "A hét napjainak listája és információ a napi időkorlátokról, felhasználó " #~ "napjainak engedélyezése / tiltása" #~ msgid "" #~ "Set specified hours and minutes for particular day at user's disposal (do " #~ "not forget to hit the button)" #~ msgstr "" #~ "A felhasználó rendelkezésére álló idő megadása órában és percben egy " #~ "adott napra (ne felejtsük el az nyomógombbal igazolni)" #~ msgid "Set the amount of hours to limit available time for particular day" #~ msgstr "Adott nap engedélyezett idejének megadása órában" #~ msgid "Specify day's limit" #~ msgstr "Napi időkorlát meghatározása" #~ msgid "" #~ "Add specified hour interval to the list (do not forget to hit th e " #~ "button)" #~ msgstr "" #~ "A megadott óra időintervallum hozzáadása a listához (igazolni kell az " #~ " felülettel)" #~ msgid "" #~ "Hour intervals per day available to user.\n" #~ "Please note that if day ends at 24th hour and next day starts at 0, user " #~ "can work continuously past midnight.\n" #~ "Please note that multiple intervals cannot be configured within the same " #~ "hour. An interval can start or end or contain a specific hour, but not " #~ "more than once (this is by design, not a bug)" #~ msgstr "" #~ "Felhasználónak rendelkezésére álló napi óra időkeret.\n" #~ "Megjegyzés: ha egy nap a 24. órában véget és a következő nap a 0. órával " #~ "megkezdődik, akkor a felhasználható idő átnyúlik az éjfélen.\n" #~ "Megjegyzés: egy órán belül nem lehet több intervallumot beállítani. " #~ "Kizárólag egy időintervallum eleje és vége lehet ugyanazon az órában (ez " #~ "szándékolt, nem hiba)" #~ msgid "" #~ "Remove selected interval from the list (do not forget to hit the " #~ "button)" #~ msgstr "" #~ "A kiválasztott időintervallum eltávolítása a listából (igazolni kell az " #~ " felülettel)" #~ msgid "Specify END hour of the allowed hour interval" #~ msgstr "Az engedélyezett óra időintervallum befejező órájának meghatározása" #~ msgid "Specify END minute of the allowed hour interval" #~ msgstr "Az engedélyezett óra időintervallum befejező percének meghatározása" #~ msgid "This allows You to set up weekly & monthly limits" #~ msgstr "A heti és havi időkorlátokat lehet beállítani" #~ msgid "Month limit amount (minutes part)" #~ msgstr "Havi időkorlát (percek)" #~ msgid "Month limit amount (days part)" #~ msgstr "Havi időkorlát (napok)" #~ msgid "Month limit amount (hours part)" #~ msgstr "Havi időkorlát (órák)" #~ msgid "Week limit amount (hours part)" #~ msgstr "Heti időkorlát (órák)" #~ msgid "Week limit amount (minutes part)" #~ msgstr "Heti időkorlát (percek)" #~ msgid "Week limit amount (days part)" #~ msgstr "Heti időkorlát (napok)" #~ msgid "" #~ "Timekpr-nExT log level. Please do not change this unless asked (you " #~ "likely won't find anything pretty in the log files)\n" #~ "1 - standard, 2 - debug, 3 - extra debug" #~ msgstr "" #~ "A Timekpr-nExT naplózási szinje. Csak kérés esetén változtassuk " #~ "(valószínűleg semmi hasznos nem található a naplófájlokban)\n" #~ "1 - standard, 2 - debug, 3 - extra debug" #~ msgid "This specifies the time interval at which actual user state is saved" #~ msgstr "Meghatározza a tényleges felhasználói állapot mentésének időközét" #~ msgid "" #~ "Amount of seconds before terminating user sessions. After this is " #~ "reached, user will be terminated, nothing can be done to prevent it.\n" #~ "Adding time does not help in this case. Do that before reaching this " #~ "point..." #~ msgstr "" #~ "A felhasználói munkamenet lezárásáig hátrelévő másodpercek. Innentől a " #~ "felhasználó kizárását már nem lehet megakadályozni.\n" #~ "Ebben az esetben idő hozzáadása már nem segít. Ezt ezelőtt az időpont " #~ "előtt kell megtenni..." #~ msgid "Add user to the exclusion list" #~ msgstr "Felhasználó hozzáadása a kizárási listához" #~ msgid "" #~ "List of users excluded from tracking.\n" #~ "Please specify actual usernames, not real names here (e.g please specify " #~ "jsmith, not John Smith)" #~ msgstr "" #~ "Felügyelet alól kizárt felhasználók.\n" #~ "Valós felhasználóneveket kell megadni, nem való neveket (pl. kovacsj, nem " #~ "Kovács János)" #~ msgid "Remove excluded session type from the list" #~ msgstr "Kizárt munkamenet típusának eltávolítása a listából" #~ msgid "Add excluded session type to the list" #~ msgstr "Kizárt munkamenet típusának hozzáadása a listához" #~ msgid "Remove user from the exclusion list" #~ msgstr "Felhasználó eltávolítása a kizárási listáról" #~ msgid "Continous time left to You which may span to more than a current day" #~ msgstr "" #~ "A megszakítások nélkül rendelkezésre álló idő, mely akár a következő " #~ "napra is áthúzódhat" #~ msgid "Continous time left:" #~ msgstr "Megszakítások nélkül rendelkezésre álló idő:" #~ msgid "This shows time intervals that are available for Your use" #~ msgstr "Rendelkezésre álló időintervallumok" #~ msgid "Time spent for this month" #~ msgstr "Ebben a hónapban felhasznált idő" #~ msgid "Time limit for week available to You" #~ msgstr "Rendelkezésre álló heti időkorlát" #~ msgid "" #~ "Specify whether to show notification when limit configurations or " #~ "allowance changes" #~ msgstr "" #~ "Annak megjelenítését állíthatjuk be, hogy korlátozások beállításai vagy " #~ "engedélyezések megváltoztak" #~ msgid "Time limit for month available to You" #~ msgstr "Rendelkezésre álló havi időkorlát" #~ msgid "" #~ "This sets logging level (please do not change this unless You know what " #~ "You're doing)" #~ msgstr "" #~ "Beállítja a naplózási szintet (ne állítsuk, hacsak nem tudjuk, pontosan " #~ "mit is csinálunk)" #~ msgid "" #~ "Specify whether to show seconds in notification area (some DE, like KDE5, " #~ "do not support text besides notification icons)" #~ msgstr "" #~ "Másodpercek értesítési sávban történő megjelenítésének beállítása (egyes " #~ "asztali környezetek, mint a KDES nem támogatják az értesítési ikonok " #~ "melletti szöveget)" #~ msgid "TIme spent for this week" #~ msgstr "Ezen a héten felhasznált idő" #, python-format #~ msgid "" #~ "Feature \"%%s\", which is used to detect idle time, can not be enabled!\n" #~ "Idle / inactive time might not be accounted when screen is locked!" #~ msgstr "" #~ "A tétlen idő észlelésére szolgáló \"%%s\" szolgáltatás nem " #~ "engedélyezhető!\n" #~ "Lehet, hogy a tétlen / inaktív időt nem veszik figyelembe, amikor a " #~ "képernyő le van zárva!" #~ msgid "" #~ "Specify session polling time granularity (at which interval user sessions " #~ "and activity are polled).\n" #~ "3 -5 seconds are optimal, don't change this if unsure." #~ msgstr "" #~ "A munkamenet lekérdezésének időköze (amilyen időközönként a felhasználói " #~ "munkamenetet és az aktivitási állapotokat lekérdezzük)\n" #~ "3-5 másodperc az optimális, ne változtassuk, ha nem vagyunk biztosak." #~ msgid "" #~ "Select whether to use speech notifications (if not available, this will " #~ "be greyed out). If usage of speech is very much needed, please install " #~ "python3-espeak package" #~ msgstr "" #~ "Beszédértesítések használatának beállítása (kiszürkítve, ha nem " #~ "elérhető). A működéshez a python3-espeak csomagnak telepítve kell lennie" #~ msgid "Hide tray icon is not passed" #~ msgstr "A tálca elrejtése ikon nem került átadásra" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct" #~ msgstr "A \"%%s\" tálcaikon elrejtése nem megfelelő" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct and can not be set" #~ msgstr "A \"%%s\" tálcaikon elrejtése nem megfelelő, és nem állítható be" #, python-format #~ msgid "User's \"%%s\" hide tray icon flag is not correct and can not be set" #~ msgstr "" #~ "A felhasználó \"%%s\" elrejtõ tálcájának ikonja nem megfelelõ, és nem " #~ "állítható be" #~ msgid "" #~ "Continuous time left to user which may span to more than a current day " #~ "(realtime, available when user is logged in)" #~ msgstr "" #~ "A felhasználó számára fenntartott folyamatos idő, amely meghaladhatja az " #~ "aktuális napot (valós idő, elérhető, amikor a felhasználó be van " #~ "jelentkezve)" #~ msgid "" #~ "Select whether to show padlock icon and notifications to user.\n" #~ "Please note that this will disable showing all information and " #~ "notifications to the user!" #~ msgstr "" #~ "Válassza ki, hogy megjelenjen-e a lakat ikon és az értesítések a " #~ "felhasználó számára.\n" #~ "Felhívjuk figyelmét, hogy ez letiltja az összes információ és értesítés " #~ "megjelenítését a felhasználó számára!" timekpr-next/resource/locale/cs/000775 001750 001750 00000000000 13705523357 020702 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/cs/LC_MESSAGES/000775 001750 001750 00000000000 14017261747 022466 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/cs/LC_MESSAGES/timekpr.mo000664 001750 001750 00000062422 14017261747 024504 0ustar00bezvfedubezvfedu000000 000000 \7xy$*0HE*%k$D84: M(n$ $7+M)y*'Y ct.   #3%W*}<# $+7 cp t$6%E*k<!3 )J\'9  F*g* 1 =(N w* 0B Zh<N%( (N w  0  % -!A!)^!!&!6!! " "%"0D"u"" s###!#U#"$#*$N$!l$$%$7$$+%2H%4{%7%%4&67&5n&7&;&7'6P'2''C'(%(9(L( ](j(~(D(*())+)?)U)i)|)3)@)*2*.O* ~*)****)+'*+R+l+Bo+#+5+* ,7,T,m,},,I,H,S7-"--%-$-.*.=.<Z.+.=.*/$,/6Q/#///'//0A40.v0-0?0,16@1Hw151/1A&2.h2,2>2+3/3 83B3^3363(,4U43t4<484G5f5 i5u5y5"}5555Wk88%:(:(:K;R;@k;M;";6<T<3'=2[=K=P= +>6>+N>)z>">(>>?"?2?D?&W?)~?,?2?@a@ @/@6@ @A A%A!7A#YA!}A-A1AFA)FBpBB3B BB B#BC%C8C*MC2xCGC0CE$D/jDDD-OEC}E'E*EFF94FnF FF:FF4F 'G.1G`GiG6}GG'G<G!,HNH$gHH?HLH7I8UII&I;I J-(J)VJJ(JJ'J8J1KMKeK$vK9KKK LLL&M^5M MMM#MM$ N;2NnN'N)N+ND OPO=iO=OFO1,P?^P=PDP;!Q]QK{QQQQR*R?RZRJtR4R2R'SBSZSoSS?S@S*T?HT6T T TTUU&9U(`UUU:U)U> V2HV{VVVVVhVVVW_W) X7X/TX(XXX&XFY6OYKY5Y*ZA3Z)uZ0Z1Z.[_1[=[7[N\7V\?\T\>#];b]P]E]75^Lm^6^^_%_B__:`@R``,`?`>aHVaaaa a*aabb[dgw'9;F=2Z.7jX bd|v4+iythL D8zG%$I*S]c`HJV[\(q:n)oWQRK~>f1AY @T0 P"m-se<O& rk{ a/U!NBE^3#5?uMCp6x},_l%(n)s minute%(n)s minutes%(n)s second%(n)s seconds%(n)s second left%(n)s seconds left%(n)s user in total:%(n)s users in total:---=== NOTICE ===---==> get saved user list from the server, example==> get user configuration and time information from the server, example==> print help, example==> set allowed days for the user, example==> set time left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set time limit per month, example==> set time limit per week, example==> set whether to hide tray icon and prevent notifications, example==> set whether to track inactive user sessions, exampleAboutAbout Timekpr-nExTAdd a user to the exclusion listAdd an excluded session type to the listAdd specified time (reward)Add tracked session type to the listAdditional configurationAdditional configuration optionsAdditional limitsAdditional optionsAdditional statisticsAdditional time for user has been processedAllowed days for user have been processedAllowed hours for user have been processedApply all Timekpr-nExT settings at onceApply daily limitsBrief information about time spent and everything related to time management for this dayClose the windowCommand FAILED: access deniedCommand FAILED: communication was not acceptedConfigurationConfiguration retrievedConnectedConnecting...Continuous time left:Control Timekpr-nExT SettingsControl Timekpr-nExT tracking itemsControl sessions types are not passedControl sessions types list is not correctControl sessions types list is not correct and cannot be setCritical notification timeout (sec)Current effective usernameCurrent statisticsDaily limit configuration for all week daysDaily limitsDayDays & LimitsEduards Bezverhijs (Translations fine-tuning by JP Lord ) (English fine-tuning by Phil Hudson )EnabledExcluded SessionsExcluded UsersExcluded session types are not passedExcluded session types list is not correctExcluded session types list is not correct and cannot be setExcluded user list is not correctExcluded user list is not correct and cannot be setExcluded user list is not passedFailed to connectFeature "%%s", which is used to detect idle time, cannot be enabled! Idle / inactive time might not be accounted when screen is locked!Final warning time "%%s" is not correctFinal warning time "%%s" is not correct and cannot be setFinal warning time is not passedFormat: FromHide icon and notifications:Hide tray icon for user has been processedHour intervalsIcon, isn't it?Info & TodayInternal connection error, please check log filesInterval removedInterval start cannot be the same as endIntervalsKeep control of computer usageLimitLimits & ConfigurationList of usernames registered on the systemLog levelLog level "%%s" is not correctLog level "%%s" is not correct and cannot be setLog level is not passedLogging levelNotes, read carefully ;)Notification timeout (sec)PARAMETER PARSE ERROR (please check parameter validity): %%sPlease reopen the application if you are superuser and Timekpr-nExT is runningPlease select a day to set the limitsPlease select an hour interval to removePoll intervalPoll time "%%s" is not correctPoll time "%%s" is not correct and cannot be setPoll time is not passedRemove a user from the exclusion listRemove an excluded session type from the listRemove excluded session typeRemove tracked session type from the listRestoreRestore configuration from saved stateRestriction / lockout type for user has been processedRestriction / lockout type:Save all changesSave timeSave time "%%s" is not correctSave time "%%s" is not correct and cannot be setSave time is not passedSelect whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Session typeShow all notificationsShow limit changesShow seconds in notification areaSpecify whether to show a notification when limit configurations or allowance changesStartedStatus of Timekpr-nExT admin clientStatus of Timekpr-nExT clientSubtract specified time (penalty)Termination timeTermination time "%%s" is not correctTermination time "%%s" is not correct and cannot be setTermination time is not passedThat interval overlaps with an existing oneThat interval's end conflicts with an existing oneThat interval's start conflicts with an existing oneThat interval's start or end duplicates an existing oneThe command is incorrect:The number of hours to be adjusted for today's limitThe number of minutes to be adjusted for today's limitThe usage of Timekpr-nExT admin client is as follows:There is a problem communicating to Timekpr-nExT (%%s)!There is a problem connecting to Timekpr-nExT daemon (%%s)!These are the days and limits that are available to youTime allowance has changed, please note new time left!Time available today (saved stated, not real-time)Time inactive (actual):Time inactive this session or after Timekpr-nExT has been restartedTime inactive:Time left (actual):Time left (today):Time left today:Time left...Time limit (month):Time limit (week):Time limit configuration has changed, please note new configuration!Time limit for this month available to youTime limit for this week available to youTime spent (month):Time spent (session):Time spent (today):Time spent (week):Time spent this monthTime spent this month (saved stated, not real-time)Time spent this session or after Timekpr-nExT has been restartedTime spent this weekTime spent this week (saved stated, not real-time)Time spent today (saved stated, not real-time)Timekpr-nExTTimekpr-nExT Administration ConfigurationTimekpr-nExT ConfigurationTimekpr-nExT administrationTimekpr-nExT clientTimekpr-nExT configuration has been savedTimekpr-nExT interface is not yet readyTimekpr-nExT notificationToTotal time available left today in a row, up to the end of the dayTrack inactive "%%s" is not correctTrack inactive "%%s" is not correct and cannot be setTrack inactive for user has been processedTrack inactive is not passedTrack inactive sessions:Track inactive:Tracked SessionsUNEXPECTED ERROR: %%sUnexpected ERROR getting user list. Please inspect Timekpr-nExT log filesUnexpected ERROR updating control. Please inspect Timekpr-nExT log filesUnexpected ERROR while loading configuration. Please inspect Timekpr-nExT log filesUse sound "bell" for notificationsUse speech notificationsUser "%%s" configuration is not foundUser "%%s" control file is not foundUser "%%s" is not foundUser ConfigurationUser configuration retrievedUser's "%%s" allowed hours are not correct and cannot be setUser's "%%s" day limits list is not correctUser's "%%s" day limits list is not correct and cannot be setUser's "%%s" day limits list is not passedUser's "%%s" day list is not correctUser's "%%s" day list is not correct and cannot be setUser's "%%s" day list is not passedUser's "%%s" day number must be between 1 and 7User's "%%s" day number must be presentUser's "%%s" hide tray icon flag is not correctUser's "%%s" hide tray icon flag is not correct and cannot be setUser's "%%s" hide tray icon flag is not passedUser's "%%s" monthly allowance is not correctUser's "%%s" monthly allowance is not correct and cannot be setUser's "%%s" monthly allowance is not passedUser's "%%s" restriction / lockout type is not correctUser's "%%s" restriction / lockout type is not correct and cannot be setUser's "%%s" restriction / lockout type is not passedUser's "%%s" track inactive flag is not correctUser's "%%s" track inactive flag is not correct and cannot be setUser's "%%s" track inactive flag is not passedUser's "%%s" weekly allowance is not correctUser's "%%s" weekly allowance is not correct and cannot be setUser's "%%s" weekly allowance is not passedUsernameUsername:Users related configurationWARNING: Timekpr-nExT administration utility was asked to run in GUI mode, but no displays are available, thus running in CLI...Wakeup hour interval:Weekly and monthly limits for user have been processedYou have %(n)s hourYou have %(n)s hoursYour time is not limited todayYour time is up, you will be forcibly logged out inYour time is up, your computer will be forcibly suspended inYour time is up, your session will be forcibly locked inhours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)hrlock screenminn/anumeric time values are in secondsshutdown computerterminate sessionstimekpr-nextThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . In Debian, see file /usr/share/common-licenses/GPL-3weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, format: 1-7)Project-Id-Version: timekpr-next Report-Msgid-Bugs-To: Ludek NOVAK PO-Revision-Date: 2021-03-01 22:14+0200 Last-Translator: Eduards Bezverhijs Language-Team: čeština <> Language: cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; X-Launchpad-Export-Date: 2020-05-13 06:32+0000 X-Generator: Poedit 2.4.1 %(n)s minuta%(n)s minuty%(n)s minut%(n)s sekunda%(n)s sekundy%(n)s sekund%(n)s sekunda%(n)s sekundy%(n)s sekundCelkem %(n)s uživatel:Celkem %(n)s uživatelé:Celkem %(n)s uživatelů:---=== OZNÁMENÍ ===---==> získat uložený seznam uživatelů ze serveru, například==> získat konfiguraci uživatele a časové informace ze serveru, příklad==> tiskni nápovědu, například==> nastavit povolené dny pro uživatele, například==> nastavený čas zbývající pro uživatele v aktuálním časovém okamžiku: "+" (přidat čas), "-" (odečíst čas), "=" (nastavit přesný čas, který je k dispozici), příklad (přidat jednu hodinu)==> nastavit časový limit za měsíc, například==> nastavit týdenní omezení času, například==> nastavit, zda skrýt ikonu panelu a zabránit upozornění, například==> nastavit, zda se mají sledovat neaktivní uživatelské relace, napříkladO aplikaciO aplikaci Timekpr-nExTPřidat uživatele do seznamu vyloučenýchPřidat vyloučený typ relace do seznamuPřidat zadanou částku (odměna)Přidat sledovaný typ relace do seznamuDalší konfiguraceDalší možnosti konfiguraceOstatní limityDalší možnostiDalší statistikyByl zpracován další čas uživateleByly zpracovány povolené dny uživateleByly zpracovány povolené hodiny uživatelePoužít najednou všechna nastavení Timekpr-nExTPoužít denní limityStručné informace o využitém času a všem souvisejícím s řízením času pro dnešní denZavřít oknoPříkaz byl NEÚSPĚŠNÝ: přístup zamítnutPříkaz byl NEÚSPĚŠNÝ: komunikace nebyla přijataNastaveníNastavení byla načtenaPřipojenoPřipojování…Zbývající nepřetržitý čas:Nastavení ovládání Timekpr-nExTOvládáné položky Timekpr-nExTTypy kontrolních relací nejsou předáványSeznam typů kontrolních relací není správnýSeznam typů kontrolních relací není správný a nelze jej nastavitČasový limit kritického oznámení (s)Aktuální uživatelské jménoAktuální statistikyNastavení denního limitu pro každý den v týdnuDenní limityDenLimity dnůLudek NOVAK PovolenoVyloučené relaceVyjmutí uživateléVyloučené typy relací se nepředávajíSeznam vyloučených typů relací není správnýSeznam vyloučených typů relací není správný a nelze jej nastavitSeznam vyloučených uživatelů není správnýSeznam vyloučených uživatelů není správný a nelze jej nastavitSeznam vyloučených uživatelů není předánPřipojení se nezdařiloFunkci "%%s", která se používá k detekci nečinnosti, nelze aktivovat! Když je obrazovka uzamčena, nemusí se počítat doba nečinnosti/neaktivity!Čas poslední výstrahy "%%s"není správnýČas poslední výstrahy "%%s" není správný a nelze jej nastavitČas poslední výstrahy není předánFormát: OdSkrýt ikonu a upozornění:Ikona skrytí zásobníku pro uživatele byla zpracovánaHodinové intervalyIkona, že?Aktuální informaceInterní chyba připojení, zkontrolujte soubory protokoluInterval odstraněnZačátek intervalu nemůže být stejný jako konecIntervalyMějte kontrolu nad používáním počítačeOmezeníLimity a nastaveníSeznam uživatelských jmen registrovaných v systémuÚroveň protokoluÚroveň protokolu "%%s"není správnáÚroveň protokolu "%%s"není správná a nelze jí nastavitÚroveň protokolu není aktivníÚroveň protokolováníPozorně si přečtěte poznámky ;)Časový limit oznámení (s)CHYBA ROZBORU PARAMETRŮ (zkontrolujte platnost parametru): %%sProsím znovu otevřete aplikaci pokud jste superuser a běží Timekpr-nExTVyberte den a nastavte limityVyberte prosím časový interval, který chcete odebratInterval dotazováníSčítání času "%%s"není správnéSčítání času "%%s"není správné a nelze jej nastavitSčítání času není aktivníOdstranit uživatele ze seznamu vyloučenýchOdebrat vyloučený typ relace ze seznamuOdebrat vyloučený typ relaceOdebrat sledovaný typ relace ze seznamuObnovitObnovit konfiguraci z uloženého stavuTyp omezení / blokování pro uživatele byl zpracovánTyp omezení / blokování:Uložit všechny změnyUšetřený časUšetřený čas"%%s"není správněUšetřený čas"%%s"není správně a nelze jej nastavitUšetřený čas není aktivníVyberte, zda se má počítat čas pro neaktivní relace. Pokud toto není zaškrtnuto, NEBUDE brána v úvahu doba použití v konzoli (nikoli v terminálu) a při uzamčené obrazovce (toto se velmi liší DE od DE)Typ relaceZobrazit všechna oznámeníZobrazit změny limituZobrazit sekundy v oznamovací oblastiUrčete, zda se mají zobrazit oznámení, když se změní konfigurace limitů nebo povoleníSpuštěnoStav správce Timekpr-nExTStav klienta Timekpr-nExTOdečíst zadanou částku (pokuta)Čas do odhlášeníČas ukončení "%%s"není správnýČas ukončení "%%s" není správný a nelze jej nastavitČas ukončení není předánInterval se překrývá s existujícímKonflikty konce intervalu s existujícímKonflikty startu intervalu se stávajícímZačátek nebo konec intervalu je shodný s existujícím intervalemPříkaz je nesprávný:Množství hodin, které je třeba upravit pro dnešní limitMnožství minut, které je třeba upravit pro dnešní limitPoužití administrátorského klienta Timekpr-nExT je následující:Při komunikaci s Timekpr-nExT (%%s) je problém!Došlo k problému s připojením k démonu Timekpr-nExT (%%s)!Toto jsou limity jednotlivých dnů, které máte k dispoziciČasový limit se změnil, upozorňujeme na nový zbývající čas!Čas k dispozici dnes (uložený, nikoli v reálném čase)Čas neaktivní (skutečný):Čas neaktivní využitý touto relací nebo od restartování Timekpr-nExTNeaktivní čas:Zbývající čas (skutečný):Zbývající čas (dnes):Čas zbývající dnes:Zbývající čas...Časový limit za měsíc:Časový limit za týden:Nastavení časového limitu se změnilo, mějte na paměti nové hodnoty!Měsíční časový limit. který máte k dispoziciTýdenní časový limit, který máte k dispoziciČas využitý za měsíc:Čas využitý relací:Čas využitý dnes:Čas využitý za týden:Čas využitý v tomto měsíciČas využitý tento měsíc (uložený, nikoliv reálný čas)Čas využitý touto relací nebo od restartování Timekpr-nExTČas využitý v tomto týdnuČas svyužitý tento týden (uložený, nikoliv reálný čas)Čas využitý dnes (uložený, nikoliv reálný čas)Timekpr-nExTNastavení programu Timekpr-nExTNastavení Timekpr-nExTSpráva Timekpr-nExTKlientská část Timekpr-nExTByla uložena konfigurace Timekpr-nExTRozhraní Timekpr-nExT není připravenoOznámení Timekpr-nExTDoCelkový dnešní čas, který je k dispozici do konce dneStopa není aktivní "%%s"není správnéStopa není aktivní "%%s"není správné a nelze jej nastavitNeaktivní sledování uživatele bylo zpracovánoStopa není aktivníNastavit neaktivní relace:Sledovat neaktivní:Sledované relaceNEOČEKÁVANÁ CHYBA: %%sNeočekávaná CHYBA při získávání seznamu uživatelů. Zkontrolujte soubory protokolu Timekpr-nExTNeočekávaná CHYBA kontroly aktualizace. Zkontrolujte soubory protokolu Timekpr-nExTNeočekávaná CHYBA při načítání konfigurace. Zkontrolujte soubory protokolu Timekpr-nExTK upozornění použijte zvukový signálPoužít hlasová oznámeníUživatelská konfigurace "%%s" nebyla nalezenaUživatelský soubor "%%s" nebyl nalezenUživatel "%%s" nebyl nalezenNastavení uživateleUživatelská nastavení byla načtenaPovolené hodiny uživatele "%%s" nejsou správné a nelze je nastavitSeznam denních limitů uživatele %%s není správnýSeznam denních limitů uživatele %%s není správný a nelze jej nastavitSeznam denních limitů uživatele %%s není předánSeznam dnů uživatele %%s není správnýSeznam dnů uživatele "%%s" není správný a nelze jej nastavitSeznam dnů uživatele %%s není předánČíslo dne uživatele %%s musí být mezi 1 a 7Číslo dne uživatele %%s musí být k dispoziciPříznak skrytí panelu "%%s" není správnýPříznak skrytí ikony „%%s“ v zásobníku uživatele není správný a nelze jej nastavitPříznak "%%s" skrytí zásobníku uživatele není předánMěsíční příspěvek uživatele %%s není správnýMěsíční příspěvek uživatele "%%s" není správný a nelze jej nastavitMěsíční příspěvek uživatele %%s není schválenTyp omezení / blokování uživatele „%%s“ není správnýTyp omezení / blokování uživatele „%%s“ není správný a nelze jej nastavitTyp omezení / blokování uživatele „%%s“ není předánPříznak neaktivní stopy "%%s" uživatele není správnýPříznak neaktivní stopy "%%s" uživatele není správný a nelze jej nastavitNeaktivní příznak neaktivní stopy "%%s" uživatele není předánTýdenní příspěvek uživatele "%%s" není správnýTýdenní příspěvek uživatele "%%s" není správný a nelze jej nastavitTýdenní příspěvek uživatele "%%s" není předánUživatelské jménoUživatelské jméno:Nastavení související s uživateliVAROVÁNÍ: Administrační nástroj Timekpr-nExT byl požádán o spuštění v grafickém režimu, ale nejsou k dispozici žádné displeje, takže běží v textovém režimu ...Interval hodin pro probuzení:Byly zpracovány týdenní a měsíční limity uživateleZbývá %(n)s hodinaZbývájí %(n)s hodinyZbývá %(n)s hodinDnes není čas omezenVáš čas vypršel, začalo odhlášováníVáš čas vypršel, váš počítač bude nyní nuceně uspánVáš čas vypršel, vaše relace bude nyní nuceně uzamčenahodiny jsou očíslovány podle ISO 8601 (tj. hodiny 24h, formát: 0-23)huzamknutí obrazovkyminnení známočíselné hodnoty času jsou v sekundáchVypnout počítačukončit relaceTento program je svobodný software: můžete jej dále šířit a/nebo upravovat v souladu s podmínkami GNU General Public License zveřejněné nadací Free Software Foundation, buď verzí 3 licence, nebo (podle vaší volby) jakoukoli novější verzí. Tento program je distribuován v naději, že bude užitečný, ale BEZ JAKÉKOLI ZÁRUKY; bez předpokládané záruky PRODEJNOSTI nebo VHODNOSTI PRO URČITÝ ÚČEL. Další podrobnosti naleznete v GNU General Public License. Spolu s tímto programem byste měli obdržet kopii GNU General Public License. Pokud ne, navštivte http://www.gnu.org/licenses/. V Debianu viz soubor /usr/share/common-license/GPL-3pracovní dny jsou očíslovány podle ISO 8601 (tj. první den je pondělí, formát: 1-7)timekpr-next/resource/locale/cs/LC_MESSAGES/timekpr.po000664 001750 001750 00000347563 14017261747 024523 0ustar00bezvfedubezvfedu000000 000000 # Czech translation for timekpr-next # Copyright (c) 2019 Rosetta Contributors and Canonical Ltd 2019 # This file is distributed under the same license as the timekpr-next package. # FIRST AUTHOR , 2019. # Ludek NOVAK , 2020. # msgid "" msgstr "" "Project-Id-Version: timekpr-next\n" "Report-Msgid-Bugs-To: Ludek NOVAK \n" "POT-Creation-Date: 2021-03-01 22:11+0200\n" "PO-Revision-Date: 2021-03-01 22:14+0200\n" "Last-Translator: Eduards Bezverhijs \n" "Language-Team: čeština <>\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2020-05-13 06:32+0000\n" "X-Generator: Poedit 2.4.1\n" #: common/constants/messages.py:31 msgid "==> print help, example" msgstr "==> tiskni nápovědu, například" #: common/constants/messages.py:32 msgid "==> get saved user list from the server, example" msgstr "==> získat uložený seznam uživatelů ze serveru, například" #: common/constants/messages.py:33 msgid "" "==> get user configuration and time information from the server, example" msgstr "" "==> získat konfiguraci uživatele a časové informace ze serveru, příklad" #: common/constants/messages.py:34 msgid "==> set allowed days for the user, example" msgstr "==> nastavit povolené dny pro uživatele, například" #. TRANSLATORS: please DO NOT translate the keyword "ALL" #: common/constants/messages.py:36 #, fuzzy #| msgid "" #| "==> set allowed hours for the specified day, or \"ALL\" for every day, " #| "optionally specify start and end minutes in brackets, example" msgid "" "==> set allowed hours for the specified day, or \"ALL\" for every day, " "optionally specify start and end minutes in brackets like this [x-y], " "additionally specify ! in front of hour if it doesn't have to be accounted " "(free time for user), example" msgstr "" "==> nastavit povolené hodiny pro zadaný den nebo „ALL“ pro každý den, " "volitelně zadat počáteční a koncové minuty v závorkách, například" #: common/constants/messages.py:37 #, fuzzy #| msgid "" #| "==> set time limits for all allowed days, the total must not exceed the " #| "allowed per-day count, example" msgid "" "==> set time limits for all allowed days, the number of values must not " "exceed the allowed days for the user, example" msgstr "" "==> nastavit časové limity pro všechny povolené dny, celkový součet nesmí " "překročit povolený počet dní, například" #: common/constants/messages.py:38 msgid "==> set time limit per week, example" msgstr "==> nastavit týdenní omezení času, například" #: common/constants/messages.py:39 msgid "==> set time limit per month, example" msgstr "==> nastavit časový limit za měsíc, například" #: common/constants/messages.py:40 msgid "==> set whether to track inactive user sessions, example" msgstr "" "==> nastavit, zda se mají sledovat neaktivní uživatelské relace, například" #: common/constants/messages.py:41 msgid "==> set whether to hide tray icon and prevent notifications, example" msgstr "==> nastavit, zda skrýt ikonu panelu a zabránit upozornění, například" #. TRANSLATORS: please DO NOT translate the keywords: "lock", "suspend", "suspendwake", "terminate", "shutdown" #: common/constants/messages.py:43 #, fuzzy #| msgid "" #| "==> set restriction / lockout type (\"lock\", \"suspend\", \"suspendwake" #| "\", \"terminate\", \"shutdown\"), examples" msgid "" "==> set restriction / lockout type (\"lock\" - lock session, \"suspend\" - " "suspend the computer, \"suspendwake\" - suspend and wake up, \"terminate\" - " "terminate sessions, \"shutdown\" - shutdown the computer), examples" msgstr "" "==> nastavit typ omezení / blokování (\"lock\", \"suspend\", \"suspendwake" "\", \"terminate\", \"shutdown\"), například" #: common/constants/messages.py:44 msgid "" "==> set time left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> nastavený čas zbývající pro uživatele v aktuálním časovém okamžiku: \"+" "\" (přidat čas), \"-\" (odečíst čas), \"=\" (nastavit přesný čas, který je k " "dispozici), příklad (přidat jednu hodinu)" #: common/constants/messages.py:45 #, fuzzy #| msgid "==> set allowed days for the user, example" msgid "==> set whether PlayTime is enabled for the user, example" msgstr "==> nastavit povolené dny pro uživatele, například" #: common/constants/messages.py:46 #, fuzzy #| msgid "==> set whether to hide tray icon and prevent notifications, example" msgid "" "==> set whether PlayTime must be accounted instead of normal activity, " "example" msgstr "==> nastavit, zda skrýt ikonu panelu a zabránit upozornění, například" #: common/constants/messages.py:47 msgid "" "==> set whether PlayTime activities are allowed during unaccounted (\"∞\") " "intervals, example" msgstr "" #: common/constants/messages.py:48 #, fuzzy #| msgid "==> set allowed days for the user, example" msgid "==> set allowed days for PlayTime activities, example" msgstr "==> nastavit povolené dny pro uživatele, například" #: common/constants/messages.py:49 #, fuzzy #| msgid "" #| "==> set time limits for all allowed days, the total must not exceed the " #| "allowed per-day count, example" msgid "" "==> set PlayTime limits for all allowed days, the number of values must not " "exceed the allowed PlayTime allowed days for the user, example" msgstr "" "==> nastavit časové limity pro všechny povolené dny, celkový součet nesmí " "překročit povolený počet dní, například" #: common/constants/messages.py:50 msgid "" "==> set PlayTime activity process masks, for which the time is accounted, " "example" msgstr "" #: common/constants/messages.py:51 #, fuzzy #| msgid "" #| "==> set time left for the user at the current moment of time: \"+\" (add " #| "time), \"-\" (subtract time), \"=\" (set exact time available), example " #| "(add one hour)" msgid "" "==> set PlayTime left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> nastavený čas zbývající pro uživatele v aktuálním časovém okamžiku: \"+" "\" (přidat čas), \"-\" (odečíst čas), \"=\" (nastavit přesný čas, který je k " "dispozici), příklad (přidat jednu hodinu)" #: common/constants/messages.py:54 msgid "Control sessions types are not passed" msgstr "Typy kontrolních relací nejsou předávány" #: common/constants/messages.py:55 msgid "Control sessions types list is not correct" msgstr "Seznam typů kontrolních relací není správný" #: common/constants/messages.py:56 msgid "Control sessions types list is not correct and cannot be set" msgstr "Seznam typů kontrolních relací není správný a nelze jej nastavit" #: common/constants/messages.py:57 msgid "Excluded session types are not passed" msgstr "Vyloučené typy relací se nepředávají" #: common/constants/messages.py:58 msgid "Excluded session types list is not correct" msgstr "Seznam vyloučených typů relací není správný" #: common/constants/messages.py:59 msgid "Excluded session types list is not correct and cannot be set" msgstr "Seznam vyloučených typů relací není správný a nelze jej nastavit" #: common/constants/messages.py:60 msgid "Excluded user list is not passed" msgstr "Seznam vyloučených uživatelů není předán" #: common/constants/messages.py:61 msgid "Excluded user list is not correct" msgstr "Seznam vyloučených uživatelů není správný" #: common/constants/messages.py:62 msgid "Excluded user list is not correct and cannot be set" msgstr "Seznam vyloučených uživatelů není správný a nelze jej nastavit" #: common/constants/messages.py:63 msgid "Final warning time is not passed" msgstr "Čas poslední výstrahy není předán" #: common/constants/messages.py:64 #, python-format msgid "Final warning time \"%%s\" is not correct" msgstr "Čas poslední výstrahy \"%%s\"není správný" #: common/constants/messages.py:65 #, python-format msgid "Final warning time \"%%s\" is not correct and cannot be set" msgstr "Čas poslední výstrahy \"%%s\" není správný a nelze jej nastavit" #: common/constants/messages.py:66 #, fuzzy #| msgid "Final warning time is not passed" msgid "Final notification time is not passed" msgstr "Čas poslední výstrahy není předán" #: common/constants/messages.py:67 #, fuzzy, python-format #| msgid "Final warning time \"%%s\" is not correct" msgid "Final notification time \"%%s\" is not correct" msgstr "Čas poslední výstrahy \"%%s\"není správný" #: common/constants/messages.py:68 #, fuzzy, python-format #| msgid "Final warning time \"%%s\" is not correct and cannot be set" msgid "Final notification time \"%%s\" is not correct and cannot be set" msgstr "Čas poslední výstrahy \"%%s\" není správný a nelze jej nastavit" #: common/constants/messages.py:69 msgid "Termination time is not passed" msgstr "Čas ukončení není předán" #: common/constants/messages.py:70 #, python-format msgid "Termination time \"%%s\" is not correct" msgstr "Čas ukončení \"%%s\"není správný" #: common/constants/messages.py:71 #, python-format msgid "Termination time \"%%s\" is not correct and cannot be set" msgstr "Čas ukončení \"%%s\" není správný a nelze jej nastavit" #: common/constants/messages.py:72 msgid "Track inactive is not passed" msgstr "Stopa není aktivní" #: common/constants/messages.py:73 #, python-format msgid "Track inactive \"%%s\" is not correct" msgstr "Stopa není aktivní \"%%s\"není správné" #: common/constants/messages.py:74 #, python-format msgid "Track inactive \"%%s\" is not correct and cannot be set" msgstr "Stopa není aktivní \"%%s\"není správné a nelze jej nastavit" #: common/constants/messages.py:75 msgid "Log level is not passed" msgstr "Úroveň protokolu není aktivní" #: common/constants/messages.py:76 #, python-format msgid "Log level \"%%s\" is not correct" msgstr "Úroveň protokolu \"%%s\"není správná" #: common/constants/messages.py:77 #, python-format msgid "Log level \"%%s\" is not correct and cannot be set" msgstr "Úroveň protokolu \"%%s\"není správná a nelze jí nastavit" #: common/constants/messages.py:78 msgid "Poll time is not passed" msgstr "Sčítání času není aktivní" #: common/constants/messages.py:79 #, python-format msgid "Poll time \"%%s\" is not correct" msgstr "Sčítání času \"%%s\"není správné" #: common/constants/messages.py:80 #, python-format msgid "Poll time \"%%s\" is not correct and cannot be set" msgstr "Sčítání času \"%%s\"není správné a nelze jej nastavit" #: common/constants/messages.py:81 msgid "Save time is not passed" msgstr "Ušetřený čas není aktivní" #: common/constants/messages.py:82 #, python-format msgid "Save time \"%%s\" is not correct" msgstr "Ušetřený čas\"%%s\"není správně" #: common/constants/messages.py:83 #, python-format msgid "Save time \"%%s\" is not correct and cannot be set" msgstr "Ušetřený čas\"%%s\"není správně a nelze jej nastavit" #: common/constants/messages.py:84 #, fuzzy #| msgid "Poll time is not passed" msgid "PlayTime flag is not passed" msgstr "Sčítání času není aktivní" #: common/constants/messages.py:85 #, fuzzy, python-format #| msgid "Poll time \"%%s\" is not correct" msgid "PlayTime flag \"%%s\" is not correct" msgstr "Sčítání času \"%%s\"není správné" #: common/constants/messages.py:86 #, fuzzy, python-format #| msgid "Poll time \"%%s\" is not correct and cannot be set" msgid "PlayTime flag \"%%s\" is not correct and cannot be set" msgstr "Sčítání času \"%%s\"není správné a nelze jej nastavit" #: common/constants/messages.py:87 msgid "PlayTime enhanced activity monitor flag is not passed" msgstr "" #: common/constants/messages.py:88 #, fuzzy, python-format #| msgid "Track inactive \"%%s\" is not correct" msgid "PlayTime enhanced activity monitor flag \"%%s\" is not correct" msgstr "Stopa není aktivní \"%%s\"není správné" #: common/constants/messages.py:89 #, fuzzy, python-format #| msgid "Track inactive \"%%s\" is not correct and cannot be set" msgid "" "PlayTime enhanced activity monitor flag \"%%s\" is not correct and cannot be " "set" msgstr "Stopa není aktivní \"%%s\"není správné a nelze jej nastavit" #: common/constants/messages.py:92 #, python-format msgid "User's \"%%s\" day number must be present" msgstr "Číslo dne uživatele %%s musí být k dispozici" #: common/constants/messages.py:93 #, python-format msgid "User's \"%%s\" day number must be between 1 and 7" msgstr "Číslo dne uživatele %%s musí být mezi 1 a 7" #: common/constants/messages.py:94 #, python-format msgid "User's \"%%s\" allowed hours are not correct and cannot be set" msgstr "Povolené hodiny uživatele \"%%s\" nejsou správné a nelze je nastavit" #: common/constants/messages.py:95 #, python-format msgid "User's \"%%s\" day list is not passed" msgstr "Seznam dnů uživatele %%s není předán" #: common/constants/messages.py:96 #, python-format msgid "User's \"%%s\" day list is not correct" msgstr "Seznam dnů uživatele %%s není správný" #: common/constants/messages.py:97 #, python-format msgid "User's \"%%s\" day list is not correct and cannot be set" msgstr "Seznam dnů uživatele \"%%s\" není správný a nelze jej nastavit" #: common/constants/messages.py:98 #, python-format msgid "User's \"%%s\" day limits list is not passed" msgstr "Seznam denních limitů uživatele %%s není předán" #: common/constants/messages.py:99 #, python-format msgid "User's \"%%s\" day limits list is not correct" msgstr "Seznam denních limitů uživatele %%s není správný" #: common/constants/messages.py:100 #, python-format msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgstr "Seznam denních limitů uživatele %%s není správný a nelze jej nastavit" #: common/constants/messages.py:101 #, fuzzy, python-format #| msgid "User's \"%%s\" set time operation can be one of these: -+=" msgid "User's \"%%s\" time operation can be one of these: - + =" msgstr "" "Operace nastaveného času uživatele %%s může být jedna z těchto operací: -+=" #: common/constants/messages.py:102 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct" msgid "User's \"%%s\" time limit is not correct" msgstr "Nastavený časový limit uživatele %%s není správný" #: common/constants/messages.py:103 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct and cannot be set" msgid "User's \"%%s\" time limit is not correct and cannot be set" msgstr "" "Nastavený časový limit uživatele \"%%s\" není správný a nelze jej nastavit" #: common/constants/messages.py:104 #, python-format msgid "User's \"%%s\" monthly allowance is not passed" msgstr "Měsíční příspěvek uživatele %%s není schválen" #: common/constants/messages.py:105 #, python-format msgid "User's \"%%s\" monthly allowance is not correct" msgstr "Měsíční příspěvek uživatele %%s není správný" #: common/constants/messages.py:106 #, python-format msgid "User's \"%%s\" monthly allowance is not correct and cannot be set" msgstr "Měsíční příspěvek uživatele \"%%s\" není správný a nelze jej nastavit" #: common/constants/messages.py:107 #, python-format msgid "User's \"%%s\" track inactive flag is not passed" msgstr "Neaktivní příznak neaktivní stopy \"%%s\" uživatele není předán" #: common/constants/messages.py:108 #, python-format msgid "User's \"%%s\" track inactive flag is not correct" msgstr "Příznak neaktivní stopy \"%%s\" uživatele není správný" #: common/constants/messages.py:109 #, python-format msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgstr "" "Příznak neaktivní stopy \"%%s\" uživatele není správný a nelze jej nastavit" #: common/constants/messages.py:110 #, python-format msgid "User's \"%%s\" hide tray icon flag is not passed" msgstr "Příznak \"%%s\" skrytí zásobníku uživatele není předán" #: common/constants/messages.py:111 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct" msgstr "Příznak skrytí panelu \"%%s\" není správný" #: common/constants/messages.py:112 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct and cannot be set" msgstr "" "Příznak skrytí ikony „%%s“ v zásobníku uživatele není správný a nelze jej " "nastavit" #: common/constants/messages.py:113 #, python-format msgid "User's \"%%s\" restriction / lockout type is not passed" msgstr "Typ omezení / blokování uživatele „%%s“ není předán" #: common/constants/messages.py:114 #, python-format msgid "User's \"%%s\" restriction / lockout type is not correct" msgstr "Typ omezení / blokování uživatele „%%s“ není správný" #: common/constants/messages.py:115 #, python-format msgid "" "User's \"%%s\" restriction / lockout type is not correct and cannot be set" msgstr "" "Typ omezení / blokování uživatele „%%s“ není správný a nelze jej nastavit" #: common/constants/messages.py:116 #, python-format msgid "User's \"%%s\" weekly allowance is not passed" msgstr "Týdenní příspěvek uživatele \"%%s\" není předán" #: common/constants/messages.py:117 #, python-format msgid "User's \"%%s\" weekly allowance is not correct" msgstr "Týdenní příspěvek uživatele \"%%s\" není správný" #: common/constants/messages.py:118 #, python-format msgid "User's \"%%s\" weekly allowance is not correct and cannot be set" msgstr "Týdenní příspěvek uživatele \"%%s\" není správný a nelze jej nastavit" #: common/constants/messages.py:119 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not passed" msgid "User's \"%%s\" PlayTime enable flag is not passed" msgstr "Neaktivní příznak neaktivní stopy \"%%s\" uživatele není předán" #: common/constants/messages.py:120 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct" msgid "User's \"%%s\" PlayTime enable flag is not correct" msgstr "Příznak neaktivní stopy \"%%s\" uživatele není správný" #: common/constants/messages.py:121 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgid "User's \"%%s\" PlayTime enable flag is not correct and cannot be set" msgstr "" "Příznak neaktivní stopy \"%%s\" uživatele není správný a nelze jej nastavit" #: common/constants/messages.py:122 #, fuzzy, python-format #| msgid "User's \"%%s\" hide tray icon flag is not passed" msgid "User's \"%%s\" PlayTime override flag is not passed" msgstr "Příznak \"%%s\" skrytí zásobníku uživatele není předán" #: common/constants/messages.py:123 #, fuzzy, python-format #| msgid "User's \"%%s\" hide tray icon flag is not correct" msgid "User's \"%%s\" PlayTime override flag is not correct" msgstr "Příznak skrytí panelu \"%%s\" není správný" #: common/constants/messages.py:124 #, fuzzy, python-format #| msgid "User's \"%%s\" hide tray icon flag is not correct and cannot be set" msgid "User's \"%%s\" PlayTime override flag is not correct and cannot be set" msgstr "" "Příznak skrytí ikony „%%s“ v zásobníku uživatele není správný a nelze jej " "nastavit" #: common/constants/messages.py:125 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not passed" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "passed" msgstr "Neaktivní příznak neaktivní stopy \"%%s\" uživatele není předán" #: common/constants/messages.py:126 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct" msgstr "Příznak neaktivní stopy \"%%s\" uživatele není správný" #: common/constants/messages.py:127 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct and cannot be set" msgstr "" "Příznak neaktivní stopy \"%%s\" uživatele není správný a nelze jej nastavit" #: common/constants/messages.py:128 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not passed" msgid "User's \"%%s\" PlayTime day list is not passed" msgstr "Seznam dnů uživatele %%s není předán" #: common/constants/messages.py:129 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not correct" msgid "User's \"%%s\" PlayTime day list is not correct" msgstr "Seznam dnů uživatele %%s není správný" #: common/constants/messages.py:130 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not correct and cannot be set" msgid "User's \"%%s\" PlayTime day list is not correct and cannot be set" msgstr "Seznam dnů uživatele \"%%s\" není správný a nelze jej nastavit" #: common/constants/messages.py:131 common/constants/messages.py:134 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not passed" msgid "User's \"%%s\" PlayTime day limits list is not passed" msgstr "Seznam denních limitů uživatele %%s není předán" #: common/constants/messages.py:132 common/constants/messages.py:135 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not correct" msgid "User's \"%%s\" PlayTime day limits list is not correct" msgstr "Seznam denních limitů uživatele %%s není správný" #: common/constants/messages.py:133 common/constants/messages.py:136 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgid "" "User's \"%%s\" PlayTime day limits list is not correct and cannot be set" msgstr "Seznam denních limitů uživatele %%s není správný a nelze jej nastavit" #: common/constants/messages.py:137 #, fuzzy, python-format #| msgid "User's \"%%s\" set time operation can be one of these: -+=" msgid "User's \"%%s\" PlayTime operation can be one of these: - + =" msgstr "" "Operace nastaveného času uživatele %%s může být jedna z těchto operací: -+=" #: common/constants/messages.py:138 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct" msgid "User's \"%%s\" set PlayTime limit is not correct" msgstr "Nastavený časový limit uživatele %%s není správný" #: common/constants/messages.py:139 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct and cannot be set" msgid "User's \"%%s\" PlayTime time limit is not correct and cannot be set" msgstr "" "Nastavený časový limit uživatele \"%%s\" není správný a nelze jej nastavit" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:143 msgid "" "Unexpected ERROR while loading configuration. Please inspect Timekpr-nExT " "log files" msgstr "" "Neočekávaná CHYBA při načítání konfigurace. Zkontrolujte soubory protokolu " "Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:145 #, fuzzy #| msgid "" #| "Unexpected ERROR getting confguration. Please inspect Timekpr-nExT log " #| "files" msgid "" "Unexpected ERROR getting configuration. Please inspect Timekpr-nExT log files" msgstr "" "Neočekávaná CHYBA při získání konfigurace. Zkontrolujte soubory protokolu " "Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:147 #, fuzzy #| msgid "" #| "Unexpected ERROR getting user confguration. Please inspect Timekpr-nExT " #| "log files" msgid "" "Unexpected ERROR getting user configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "Neočekávaná CHYBA při získávání uživatelského spojení. Zkontrolujte soubory " "protokolu Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:149 msgid "" "Unexpected ERROR getting user list. Please inspect Timekpr-nExT log files" msgstr "" "Neočekávaná CHYBA při získávání seznamu uživatelů. Zkontrolujte soubory " "protokolu Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:151 #, fuzzy #| msgid "" #| "Unexpected ERROR updating confguration. Please inspect Timekpr-nExT log " #| "files" msgid "" "Unexpected ERROR updating configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "Neočekávaná CHYBA aktualizace konfigurace. Zkontrolujte soubory protokolu " "Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:153 msgid "" "Unexpected ERROR updating control. Please inspect Timekpr-nExT log files" msgstr "" "Neočekávaná CHYBA kontroly aktualizace. Zkontrolujte soubory protokolu " "Timekpr-nExT" #: common/constants/messages.py:154 #, python-format msgid "User \"%%s\" configuration is not found" msgstr "Uživatelská konfigurace \"%%s\" nebyla nalezena" #: common/constants/messages.py:155 #, python-format msgid "User \"%%s\" control file is not found" msgstr "Uživatelský soubor \"%%s\" nebyl nalezen" #: common/constants/messages.py:156 #, python-format msgid "User \"%%s\" is not found" msgstr "Uživatel \"%%s\" nebyl nalezen" #: common/constants/messages.py:159 msgid "Connected" msgstr "Připojeno" #: common/constants/messages.py:160 msgid "Connecting..." msgstr "Připojování…" #: common/constants/messages.py:161 msgid "Failed to connect" msgstr "Připojení se nezdařilo" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:163 msgid "" "Please reopen the application if you are superuser and Timekpr-nExT is " "running" msgstr "" "Prosím znovu otevřete aplikaci pokud jste superuser a běží Timekpr-nExT" #: common/constants/messages.py:164 msgid "Started" msgstr "Spuštěno" #: common/constants/messages.py:165 msgid "User configuration retrieved" msgstr "Uživatelská nastavení byla načtena" #: common/constants/messages.py:166 msgid "Configuration retrieved" msgstr "Nastavení byla načtena" #: common/constants/messages.py:167 msgid "Track inactive for user has been processed" msgstr "Neaktivní sledování uživatele bylo zpracováno" #: common/constants/messages.py:168 msgid "Hide tray icon for user has been processed" msgstr "Ikona skrytí zásobníku pro uživatele byla zpracována" #: common/constants/messages.py:169 msgid "Restriction / lockout type for user has been processed" msgstr "Typ omezení / blokování pro uživatele byl zpracován" #: common/constants/messages.py:170 msgid "Additional time for user has been processed" msgstr "Byl zpracován další čas uživatele" #: common/constants/messages.py:171 #, fuzzy #| msgid "Additional time for user has been processed" msgid "Additional PlayTime for user has been processed" msgstr "Byl zpracován další čas uživatele" #: common/constants/messages.py:172 msgid "Weekly and monthly limits for user have been processed" msgstr "Byly zpracovány týdenní a měsíční limity uživatele" #: common/constants/messages.py:173 msgid "Allowed days for user have been processed" msgstr "Byly zpracovány povolené dny uživatele" #: common/constants/messages.py:174 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "Day time limits for user have been processed" msgstr "Byly zpracovány časové limity dnů uživatele" #: common/constants/messages.py:175 msgid "Allowed hours for user have been processed" msgstr "Byly zpracovány povolené hodiny uživatele" #: common/constants/messages.py:176 msgid "Timekpr-nExT configuration has been saved" msgstr "Byla uložena konfigurace Timekpr-nExT" #: common/constants/messages.py:177 #, fuzzy #| msgid "==> set time limit per week, example" msgid "User time limits have been saved" msgstr "==> nastavit týdenní omezení času, například" #: common/constants/messages.py:178 #, fuzzy #| msgid "Time limit for the week is enabled" msgid "User PlayTime limits have been saved" msgstr "Povolit týdenní časový limit" #: common/constants/messages.py:179 #, fuzzy #| msgid "Additional time for user has been processed" msgid "User additional options have been saved" msgstr "Byl zpracován další čas uživatele" #: common/constants/messages.py:180 #, fuzzy #| msgid "Additional time for user has been processed" msgid "Enable PlayTime for the user has been processed" msgstr "Byl zpracován další čas uživatele" #: common/constants/messages.py:181 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime override flag for the user has been processed" msgstr "Byly zpracovány časové limity dnů uživatele" #: common/constants/messages.py:182 #, fuzzy #| msgid "Track inactive for user has been processed" msgid "" "PlayTime allowed during unaccounted intervals flag for the user has been " "processed" msgstr "Neaktivní sledování uživatele bylo zpracováno" #: common/constants/messages.py:183 #, fuzzy #| msgid "Allowed days for user have been processed" msgid "PlayTime allowed days for user have been processed" msgstr "Byly zpracovány povolené dny uživatele" #: common/constants/messages.py:184 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime day limits for user have been processed" msgstr "Byly zpracovány časové limity dnů uživatele" #: common/constants/messages.py:185 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime activities for user have been processed" msgstr "Byly zpracovány časové limity dnů uživatele" #: common/constants/messages.py:186 msgid "Please select a day to set the limits" msgstr "Vyberte den a nastavte limity" #: common/constants/messages.py:187 msgid "That interval overlaps with an existing one" msgstr "Interval se překrývá s existujícím" #: common/constants/messages.py:188 msgid "That interval's start conflicts with an existing one" msgstr "Konflikty startu intervalu se stávajícím" #: common/constants/messages.py:189 msgid "That interval's end conflicts with an existing one" msgstr "Konflikty konce intervalu s existujícím" #: common/constants/messages.py:190 msgid "That interval's start or end duplicates an existing one" msgstr "Začátek nebo konec intervalu je shodný s existujícím intervalem" #: common/constants/messages.py:191 msgid "Interval start cannot be the same as end" msgstr "Začátek intervalu nemůže být stejný jako konec" #: common/constants/messages.py:192 #, fuzzy #| msgid "Interval start cannot be the same as end" msgid "Interval's start cannot be later than end" msgstr "Začátek intervalu nemůže být stejný jako konec" #: common/constants/messages.py:193 msgid "Please select an hour interval to remove" msgstr "Vyberte prosím časový interval, který chcete odebrat" #: common/constants/messages.py:194 msgid "Interval removed" msgstr "Interval odstraněn" #: common/constants/messages.py:195 msgid "Timekpr-nExT interface is not yet ready" msgstr "Rozhraní Timekpr-nExT není připraveno" #: common/constants/messages.py:198 msgid "" "WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, " "but no displays are available, thus running in CLI..." msgstr "" "VAROVÁNÍ: Administrační nástroj Timekpr-nExT byl požádán o spuštění v " "grafickém režimu, ale nejsou k dispozici žádné displeje, takže běží v " "textovém režimu ..." #: common/constants/messages.py:199 msgid "The command is incorrect:" msgstr "Příkaz je nesprávný:" #: common/constants/messages.py:200 msgid "The usage of Timekpr-nExT admin client is as follows:" msgstr "Použití administrátorského klienta Timekpr-nExT je následující:" #: common/constants/messages.py:201 msgid "---=== NOTICE ===---" msgstr "---=== OZNÁMENÍ ===---" #: common/constants/messages.py:202 msgid "numeric time values are in seconds" msgstr "číselné hodnoty času jsou v sekundách" #: common/constants/messages.py:203 msgid "" "weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, " "format: 1-7)" msgstr "" "pracovní dny jsou očíslovány podle ISO 8601 (tj. první den je pondělí, " "formát: 1-7)" #: common/constants/messages.py:204 msgid "hours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)" msgstr "hodiny jsou očíslovány podle ISO 8601 (tj. hodiny 24h, formát: 0-23)" #: common/constants/messages.py:206 #, python-format msgid "%(n)s user in total:" msgid_plural "%(n)s users in total:" msgstr[0] "Celkem %(n)s uživatel:" msgstr[1] "Celkem %(n)s uživatelé:" msgstr[2] "Celkem %(n)s uživatelů:" #: common/constants/messages.py:207 #, fuzzy, python-format #| msgid "Config for %s:" msgid "Configuration for user %s:" msgstr "Nastavení pro %s:" #: common/constants/messages.py:210 msgid "Time left..." msgstr "Zbývající čas..." #: common/constants/messages.py:211 msgid "Limits & Configuration" msgstr "Limity a nastavení" #: common/constants/messages.py:212 msgid "About" msgstr "O aplikaci" #: common/constants/messages.py:215 resource/client/forms/about.glade:17 msgid "Keep control of computer usage" msgstr "Mějte kontrolu nad používáním počítače" #: common/constants/messages.py:216 msgid "Day" msgstr "Den" #: common/constants/messages.py:217 msgid "Enabled" msgstr "Povoleno" #: common/constants/messages.py:218 common/constants/messages.py:224 msgid "Limit" msgstr "Omezení" #: common/constants/messages.py:219 msgid "From" msgstr "Od" #: common/constants/messages.py:220 #, fuzzy #| msgid "from" msgid "from..." msgstr "od" #: common/constants/messages.py:221 msgid "To" msgstr "Do" #: common/constants/messages.py:222 msgid "to..." msgstr "" #: common/constants/messages.py:223 msgid "Period" msgstr "" #: common/constants/messages.py:225 msgid "Weekly" msgstr "" #: common/constants/messages.py:226 msgid "Monthly" msgstr "" #: common/constants/messages.py:227 common/constants/messages.py:229 msgid "Session type" msgstr "Typ relace" #: common/constants/messages.py:228 common/constants/messages.py:230 #, fuzzy #| msgid "Session type" msgid "session type..." msgstr "Typ relace" #: common/constants/messages.py:231 msgid "Username" msgstr "Uživatelské jméno" #: common/constants/messages.py:232 #, fuzzy #| msgid "Username" msgid "username..." msgstr "Uživatelské jméno" #: common/constants/messages.py:233 msgid "Process mask" msgstr "" #: common/constants/messages.py:234 msgid "executable mask..." msgstr "" #: common/constants/messages.py:235 msgid "Process description" msgstr "" #: common/constants/messages.py:236 msgid "process description..." msgstr "" #: common/constants/messages.py:237 msgid "Time" msgstr "" #: common/constants/messages.py:238 msgid "time..." msgstr "" #: common/constants/messages.py:239 msgid "Importance" msgstr "" #: common/constants/messages.py:240 msgid "importance..." msgstr "" #: common/constants/messages.py:243 msgid "Timekpr-nExT notification" msgstr "Oznámení Timekpr-nExT" #: common/constants/messages.py:244 #, fuzzy #| msgid "Timekpr-nExT notification" msgid "Timekpr-nExT PlayTime notification" msgstr "Oznámení Timekpr-nExT" #: common/constants/messages.py:245 msgid "Your time is not limited today" msgstr "Dnes není čas omezen" #: common/constants/messages.py:246 msgid "Time allowance has changed, please note new time left!" msgstr "Časový limit se změnil, upozorňujeme na nový zbývající čas!" #: common/constants/messages.py:247 msgid "Time limit configuration has changed, please note new configuration!" msgstr "Nastavení časového limitu se změnilo, mějte na paměti nové hodnoty!" #: common/constants/messages.py:248 #, python-format msgid "There is a problem connecting to Timekpr-nExT daemon (%%s)!" msgstr "Došlo k problému s připojením k démonu Timekpr-nExT (%%s)!" #: common/constants/messages.py:249 #, python-format msgid "There is a problem communicating to Timekpr-nExT (%%s)!" msgstr "Při komunikaci s Timekpr-nExT (%%s) je problém!" #: common/constants/messages.py:250 #, fuzzy, python-format #| msgid "Icon inititalization error (%%s)!" msgid "Icon initialization error (%%s)!" msgstr "Chyba inicializace ikony (%%s)!" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:252 msgid "Your time is up, you will be forcibly logged out in" msgstr "Váš čas vypršel, začalo odhlášování" #. TRANSLATORS: this is a part of message "Your time is up, your computer will be forcibly shutdown in %s seconds", please translate accordingly #: common/constants/messages.py:254 #, fuzzy #| msgid "Your time is up, your computer will be forcily shutdown in" msgid "Your time is up, your computer will be forcibly shutdown in" msgstr "Váš čas vypršel, počítač bude vynuceně vypnut" #. TRANSLATORS: this is a part of message "Your time is up, your session will be forcibly locked in %s seconds", please translate accordingly #: common/constants/messages.py:256 msgid "Your time is up, your session will be forcibly locked in" msgstr "Váš čas vypršel, vaše relace bude nyní nuceně uzamčena" #. TRANSLATORS: this is a part of message ", Your computer will be forcibly suspended in %s seconds", please translate accordingly #: common/constants/messages.py:258 msgid "Your time is up, your computer will be forcibly suspended in" msgstr "Váš čas vypršel, váš počítač bude nyní nuceně uspán" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:260 #, python-format msgid "%(n)s second" msgid_plural "%(n)s seconds" msgstr[0] "%(n)s sekunda" msgstr[1] "%(n)s sekundy" msgstr[2] "%(n)s sekund" #: common/constants/messages.py:261 msgid "Internal connection error, please check log files" msgstr "Interní chyba připojení, zkontrolujte soubory protokolu" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:263 #, python-format msgid "You have %(n)s hour" msgid_plural "You have %(n)s hours" msgstr[0] "Zbývá %(n)s hodina" msgstr[1] "Zbývájí %(n)s hodiny" msgstr[2] "Zbývá %(n)s hodin" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:265 #, python-format msgid "%(n)s minute" msgid_plural "%(n)s minutes" msgstr[0] "%(n)s minuta" msgstr[1] "%(n)s minuty" msgstr[2] "%(n)s minut" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) of PlayTime left" please translate accordingly #: common/constants/messages.py:267 common/constants/messages.py:269 #, python-format msgid "%(n)s second left" msgid_plural "%(n)s seconds left" msgstr[0] "%(n)s sekunda" msgstr[1] "%(n)s sekundy" msgstr[2] "%(n)s sekund" #: common/constants/messages.py:269 #, fuzzy, python-format #| msgid "%(n)s second left" #| msgid_plural "%(n)s seconds left" msgid "%(n)s second of PlayTime left" msgid_plural "%(n)s seconds of PlayTime left" msgstr[0] "%(n)s sekunda" msgstr[1] "%(n)s sekundy" msgstr[2] "%(n)s sekund" #: common/constants/messages.py:270 #, python-format msgid "" "Feature \"%%s\", which is used to detect idle time, cannot be enabled!\n" "Idle / inactive time might not be accounted when screen is locked!" msgstr "" "Funkci \"%%s\", která se používá k detekci nečinnosti, nelze aktivovat!\n" "Když je obrazovka uzamčena, nemusí se počítat doba nečinnosti/neaktivity!" #: common/constants/messages.py:273 #, python-format msgid "UNEXPECTED ERROR: %%s" msgstr "NEOČEKÁVANÁ CHYBA: %%s" #: common/constants/messages.py:274 #, python-format msgid "PARAMETER PARSE ERROR (please check parameter validity): %%s" msgstr "CHYBA ROZBORU PARAMETRŮ (zkontrolujte platnost parametru): %%s" #: common/constants/messages.py:275 msgid "Command FAILED: access denied" msgstr "Příkaz byl NEÚSPĚŠNÝ: přístup zamítnut" #: common/constants/messages.py:276 msgid "Command FAILED: communication was not accepted" msgstr "Příkaz byl NEÚSPĚŠNÝ: komunikace nebyla přijata" #: common/constants/messages.py:277 msgid "n/a" msgstr "není známo" #: resource/client/forms/about.glade:7 msgid "About Timekpr-nExT" msgstr "O aplikaci Timekpr-nExT" #: resource/client/forms/about.glade:16 msgid "Copyright (c) 2018-2021 Eduards Bezverhijs" msgstr "" #: resource/client/forms/about.glade:19 msgid "Timekpr-nExT" msgstr "Timekpr-nExT" #. Please enter GPL3 licence text in your language #: resource/client/forms/about.glade:20 msgctxt "timekpr-next" msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details.\n" "\n" "You should have received a copy of the GNU General Public License along with " "this program. If not, see . In Debian, see " "file /usr/share/common-licenses/GPL-3" msgstr "" "Tento program je svobodný software: můžete jej dále šířit a/nebo upravovat v " "souladu s podmínkami GNU General Public License zveřejněné nadací Free " "Software Foundation, buď verzí 3 licence, nebo (podle vaší volby) jakoukoli " "novější verzí.\n" "\n" "Tento program je distribuován v naději, že bude užitečný, ale BEZ JAKÉKOLI " "ZÁRUKY; bez předpokládané záruky PRODEJNOSTI nebo VHODNOSTI PRO URČITÝ ÚČEL. " "Další podrobnosti naleznete v GNU General Public License.\n" "\n" "Spolu s tímto programem byste měli obdržet kopii GNU General Public License. " "Pokud ne, navštivte http://www.gnu.org/licenses/. V Debianu viz soubor /usr/" "share/common-license/GPL-3" #. Please fill in translator credits, each person in new line in format: name.surname@mail.xy, name@mail.xy, nick@mail.xy or so... #: resource/client/forms/about.glade:26 msgid "" "Eduards Bezverhijs \n" "(Translations fine-tuning by JP Lord )\n" "(English fine-tuning by Phil Hudson )" msgstr "Ludek NOVAK " #: resource/client/forms/admin.glade:155 msgid "Remove excluded session type" msgstr "Odebrat vyloučený typ relace" #: resource/client/forms/admin.glade:385 msgid "Timekpr-nExT administration" msgstr "Správa Timekpr-nExT" #: resource/client/forms/admin.glade:403 resource/client/forms/admin.glade:409 #: resource/client/forms/client.glade:261 msgid "Icon, isn't it?" msgstr "Ikona, že?" #: resource/client/forms/admin.glade:432 msgid "Notes, read carefully ;)" msgstr "Pozorně si přečtěte poznámky ;)" #: resource/client/forms/admin.glade:435 #, fuzzy #| msgid "" #| "This is the configuration app for Timekpr-nExT. It allows you to set time " #| "limits for your individual users as well as general Timekpr-nExT " #| "options.\n" #| "\n" #| "To use this application, you either have to execute it as superuser or " #| "have to be part of the timekpr group.\n" #| "Please note that the \"Timekpr-nExT Configuration\" is available in " #| "superuser (administrator) mode only!\n" #| "\n" #| "Please configure carefully: do not lock yourself out!" msgid "" "This is the configuration app for Timekpr-nExT. It allows you to set time " "limits for your individual users as well as general Timekpr-nExT options.\n" "To use this application, you either have to execute it as superuser or have " "to be part of the timekpr group.\n" "Please note that the \"Timekpr-nExT Configuration\" is available in " "superuser (administrator) mode only!\n" "\n" "Please configure carefully: do not lock yourself out!" msgstr "" "Toto je konfigurační aplikace Timekpr-nExT. Umožňuje nakonfigurovat čas pro " "vaše uživatele a také parametry Timekpr-nExT.\n" "\n" "Chcete-li použít tuto aplikaci, musíte ji buď spustit jako superuživatel, " "nebo musíte být součástí skupiny timekpr. Uvědomte si prosím, že „Nastavení " "Timekpr-nExT\" je k dispozici pouze v režimu superuživatele (správce)!\n" "\n" "Prosím buďte opatrní, nezablokujte se!" #: resource/client/forms/admin.glade:465 resource/client/forms/admin.glade:3016 msgid "Users related configuration" msgstr "Nastavení související s uživateli" #: resource/client/forms/admin.glade:476 resource/client/forms/client.glade:298 msgid "Username:" msgstr "Uživatelské jméno:" #: resource/client/forms/admin.glade:504 resource/client/forms/admin.glade:516 msgid "List of usernames registered on the system" msgstr "Seznam uživatelských jmen registrovaných v systému" #: resource/client/forms/admin.glade:530 msgid "Restore" msgstr "Obnovit" #: resource/client/forms/admin.glade:535 msgid "Restore configuration from saved state" msgstr "Obnovit konfiguraci z uloženého stavu" #: resource/client/forms/admin.glade:586 #, fuzzy #| msgid "This shows information about time left / spent" msgid "Information about time left / spent" msgstr "Informace o zbývajícím / stráveném čase" #: resource/client/forms/admin.glade:610 #, fuzzy msgid "" "Continuous time left. May span more than the current day (realtime, " "available when user is logged in)" msgstr "" "Nepřetržitý čas zbývající uživateli, který může trvat déle než aktuální den " "(reálný čas, k dispozici po přihlášení uživatele)" #: resource/client/forms/admin.glade:612 msgid "Time left (actual):" msgstr "Zbývající čas (skutečný):" #: resource/client/forms/admin.glade:626 resource/client/forms/admin.glade:657 #: resource/client/forms/admin.glade:688 resource/client/forms/admin.glade:732 #: resource/client/forms/admin.glade:763 resource/client/forms/admin.glade:794 #: resource/client/forms/client.glade:411 #: resource/client/forms/client.glade:425 #: resource/client/forms/client.glade:456 #: resource/client/forms/client.glade:502 #: resource/client/forms/client.glade:728 #: resource/client/forms/client.glade:786 #: resource/client/forms/client.glade:857 #: resource/client/forms/client.glade:885 #: resource/client/forms/client.glade:985 #: resource/client/forms/client.glade:1011 msgid "Format: " msgstr "Formát: " #: resource/client/forms/admin.glade:641 #, fuzzy msgid "" "How long the user was inactive since last login (realtime, available when " "user is logged in)" msgstr "" "Jak dlouho byl uživatel od posledního přihlášení neaktivní (v reálném čase, " "k dispozici při přihlášení uživatele)" #: resource/client/forms/admin.glade:643 msgid "Time inactive (actual):" msgstr "Čas neaktivní (skutečný):" #: resource/client/forms/admin.glade:672 msgid "Time available today (saved stated, not real-time)" msgstr "Čas k dispozici dnes (uložený, nikoli v reálném čase)" #: resource/client/forms/admin.glade:674 msgid "Time left (today):" msgstr "Zbývající čas (dnes):" #: resource/client/forms/admin.glade:716 msgid "Time spent today (saved stated, not real-time)" msgstr "Čas využitý dnes (uložený, nikoliv reálný čas)" #: resource/client/forms/admin.glade:718 msgid "Time spent (today):" msgstr "Čas využitý dnes:" #: resource/client/forms/admin.glade:747 msgid "Time spent this week (saved stated, not real-time)" msgstr "Čas svyužitý tento týden (uložený, nikoliv reálný čas)" #: resource/client/forms/admin.glade:749 resource/client/forms/client.glade:717 msgid "Time spent (week):" msgstr "Čas využitý za týden:" #: resource/client/forms/admin.glade:777 msgid "Time spent this month (saved stated, not real-time)" msgstr "Čas využitý tento měsíc (uložený, nikoliv reálný čas)" #: resource/client/forms/admin.glade:779 resource/client/forms/client.glade:744 msgid "Time spent (month):" msgstr "Čas využitý za měsíc:" #: resource/client/forms/admin.glade:861 msgid "Allowance adjustments" msgstr "" #: resource/client/forms/admin.glade:885 #, fuzzy #| msgid "Set day's time limit" msgid "today's time" msgstr "Nastavit denní limit" #: resource/client/forms/admin.glade:889 msgid "Choose this to adjust user's time allowance for today" msgstr "" #: resource/client/forms/admin.glade:901 msgid "PlayTime" msgstr "" #: resource/client/forms/admin.glade:905 msgid "Choose this to adjust user's PlayTime allowance for today" msgstr "" #: resource/client/forms/admin.glade:934 msgid "hr" msgstr "h" #: resource/client/forms/admin.glade:945 msgid "The number of minutes to be adjusted for today's limit" msgstr "Množství minut, které je třeba upravit pro dnešní limit" #: resource/client/forms/admin.glade:961 msgid "The number of hours to be adjusted for today's limit" msgstr "Množství hodin, které je třeba upravit pro dnešní limit" #: resource/client/forms/admin.glade:977 msgid "min" msgstr "min" #: resource/client/forms/admin.glade:1004 msgid "Add specified time (reward)" msgstr "Přidat zadanou částku (odměna)" #: resource/client/forms/admin.glade:1020 msgid "Subtract specified time (penalty)" msgstr "Odečíst zadanou částku (pokuta)" #: resource/client/forms/admin.glade:1036 #, fuzzy #| msgid "Set this specific limit" msgid "Set this specific time limit" msgstr "Nastavit přesně stanovený limit" #: resource/client/forms/admin.glade:1101 msgid "Information about PlayTime" msgstr "" #: resource/client/forms/admin.glade:1134 #, fuzzy #| msgid "" #| "How long user was inactive since last login (realtime, available when " #| "user is logged in)" msgid "" "Actual PlayTime available today (realtime, available when user is logged in)" msgstr "" "Jak dlouho byl uživatel od posledního přihlášení neaktivní (v reálném čase, " "k dispozici při přihlášení uživatele)" #: resource/client/forms/admin.glade:1136 #, fuzzy #| msgid "Time left (actual):" msgid "PlayTime left (actual):" msgstr "Zbývající čas (skutečný):" #: resource/client/forms/admin.glade:1150 #: resource/client/forms/admin.glade:1181 #: resource/client/forms/admin.glade:1269 #, fuzzy #| msgid "Format: " msgid "Format: " msgstr "Formát: " #: resource/client/forms/admin.glade:1165 #, fuzzy #| msgid "Time available today (saved stated, not real-time)" msgid "PlayTime available today (saved stated, not real-time)" msgstr "Čas k dispozici dnes (uložený, nikoli v reálném čase)" #: resource/client/forms/admin.glade:1167 #, fuzzy #| msgid "Time left (today):" msgid "PlayTime left (today):" msgstr "Zbývající čas (dnes):" #: resource/client/forms/admin.glade:1196 #: resource/client/forms/admin.glade:1212 #, fuzzy #| msgid "" #| "How long user was inactive since last login (realtime, available when " #| "user is logged in)" msgid "" "Active PlayTime activity count (realtime, available when user is logged in)" msgstr "" "Jak dlouho byl uživatel od posledního přihlášení neaktivní (v reálném čase, " "k dispozici při přihlášení uživatele)" #: resource/client/forms/admin.glade:1198 #, fuzzy #| msgid "Time inactive (actual):" msgid "Running activities (actual):" msgstr "Čas neaktivní (skutečný):" #: resource/client/forms/admin.glade:1253 #, fuzzy #| msgid "Time spent today (saved stated, not real-time)" msgid "PlayTime spent today (saved stated, not real-time)" msgstr "Čas využitý dnes (uložený, nikoliv reálný čas)" #: resource/client/forms/admin.glade:1255 #, fuzzy #| msgid "Time spent (today):" msgid "PlayTime spent (today):" msgstr "Čas využitý dnes:" #: resource/client/forms/admin.glade:1306 msgid "" "Brief information about time spent and everything related to time management " "for this day" msgstr "" "Stručné informace o využitém času a všem souvisejícím s řízením času pro " "dnešní den" #: resource/client/forms/admin.glade:1307 msgid "Info & Today" msgstr "Aktuální informace" #: resource/client/forms/admin.glade:1348 #, fuzzy #| msgid "This allows you to change time limits for today" msgid "This lets you configure time limits." msgstr "Zde můžete upravit časové limity pro dnešní den" #: resource/client/forms/admin.glade:1350 #, fuzzy #| msgid "Weekly & Monthly limits" msgid "Week day limits" msgstr "Týdenní a měsíční limity" #. This is meant for very short (e.g. one letter) abbreviation of hours #: resource/client/forms/admin.glade:1370 #: resource/client/forms/admin.glade:1865 #: resource/client/forms/admin.glade:2265 #, fuzzy #| msgid "hr" msgid "h" msgstr "h" #: resource/client/forms/admin.glade:1374 #: resource/client/forms/admin.glade:2269 #, fuzzy #| msgid "The amount of hours to be adjusted for today's limit" msgid "Choose hours to be adjusted for selected days." msgstr "Množství hodin, které je třeba upravit pro dnešní limit" #. This is meant for very short (e.g. one letter) abbreviation of minutes #: resource/client/forms/admin.glade:1386 #: resource/client/forms/admin.glade:1881 #: resource/client/forms/admin.glade:2281 msgid "m" msgstr "" #: resource/client/forms/admin.glade:1390 #: resource/client/forms/admin.glade:2285 #, fuzzy #| msgid "The amount of minutes to be adjusted for today's limit" msgid "Choose minutes to be adjusted for selected days." msgstr "Množství minut, které je třeba upravit pro dnešní limit" #: resource/client/forms/admin.glade:1410 msgid "" "Increase daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:1427 msgid "" "Decrease daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:1474 #, fuzzy #| msgid "" #| "Lists day of the week and additional information about the day's limit. " #| "Please enable / disable days for the user." msgid "" "Lists day of the week and additional information about the day's limit.\n" "\n" "Please enable / disable days for the user." msgstr "" "Seznam dnů v týdnu s informací o denním limitu, povolené/zakázané dny " "uživatele." #: resource/client/forms/admin.glade:1550 #, fuzzy #| msgid "" #| "Hour intervals per day available to this user.\n" #| "Please note that if the day's limit ends at 24:00 and the next day's " #| "limit starts at 00:00, then the user can work continuously past " #| "midnight.\n" #| "Please note that multiple intervals cannot be configured within the same " #| "hour. An interval can start or end or contain a specific hour, but not " #| "more than once. This is by design, not a bug." msgid "" "Hour intervals for selected day available to the user.\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead.\n" "\n" "Please note that if the day's limit ends at 24:00 and the next day's limit " "starts at 00:00, then the user can work continuously past midnight.\n" "\n" "Please note that multiple intervals cannot be configured within the same " "hour.\n" "An interval can start or end or contain a specific hour, but not more than " "once. This is by design, not a bug.\n" "\n" msgstr "" "Uživatel má k dispozici předepsané intervaly hodin za den.\n" "Uvědomte si prosím, že den končí ve 24:00 a další den začíná v 0:00 hodin. " "Proto může uživatel pracovat nepřetržitě i po půlnoci.\n" "Také vezměte na vědomí, že v jedné hodině nelze nakonfigurovat více " "intervalů. Interval může začínat nebo končit v určité hodině. Případně může " "obsahovat určitou hodinu, ale ne více než jednou což je to záměr, nikoli " "chyba." #: resource/client/forms/admin.glade:1581 msgid "Hour intervals" msgstr "Hodinové intervaly" #: resource/client/forms/admin.glade:1603 msgid "" "Create a new time interval that will be available to the user.\n" "\n" "After creating the interval, please edit its start and end times directly in " "interval list." msgstr "" #: resource/client/forms/admin.glade:1620 msgid "Delete the selected time interval from the available list of intervals." msgstr "" #: resource/client/forms/admin.glade:1688 #, fuzzy #| msgid "Hour intervals" msgid "enter hour intervals" msgstr "Hodinové intervaly" #: resource/client/forms/admin.glade:1742 msgid "verify" msgstr "" #: resource/client/forms/admin.glade:1746 msgid "" "Verify configured time intervals. This is a mandatory step to ensure that " "intervals are correct.\n" "\n" "Intervals which have problems will be highlighted." msgstr "" #: resource/client/forms/admin.glade:1821 #, fuzzy #| msgid "Weekly & Monthly limits" msgid "Weekly and monthly limits" msgstr "Týdenní a měsíční limity" #. This is meant for very short (e.g. one letter) abbreviation of days #: resource/client/forms/admin.glade:1849 msgid "d" msgstr "" #: resource/client/forms/admin.glade:1853 msgid "Choose days to be adjusted for selected period." msgstr "" #: resource/client/forms/admin.glade:1869 #, fuzzy #| msgid "The amount of hours to be adjusted for today's limit" msgid "Choose hours to be adjusted for selected period." msgstr "Množství hodin, které je třeba upravit pro dnešní limit" #: resource/client/forms/admin.glade:1885 #, fuzzy #| msgid "The amount of minutes to be adjusted for today's limit" msgid "Choose minutes to be adjusted for selected period." msgstr "Množství minut, které je třeba upravit pro dnešní limit" #: resource/client/forms/admin.glade:1913 msgid "" "Increase weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" #: resource/client/forms/admin.glade:1927 msgid "" "Decrease weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" #: resource/client/forms/admin.glade:1976 msgid "" "Weekly and monthly limits for the user.\n" "\n" "These limits are applied to user together with the rest of limit " "configuration." msgstr "" #: resource/client/forms/admin.glade:2016 msgid "Apply daily limits" msgstr "Použít denní limity" #: resource/client/forms/admin.glade:2021 #, fuzzy #| msgid "Apply all changes made in this page" msgid "Apply limit all changes made in this page" msgstr "Použít všechny změny provedené na této stránce" #: resource/client/forms/admin.glade:2042 msgid "Daily limit configuration for all week days" msgstr "Nastavení denního limitu pro každý den v týdnu" #: resource/client/forms/admin.glade:2043 #, fuzzy #| msgid "Limits & Configuration" msgid "Limit configuration" msgstr "Limity a nastavení" #: resource/client/forms/admin.glade:2064 msgid "Settings for PlayTime activities" msgstr "" #: resource/client/forms/admin.glade:2084 msgid "PlayTime options" msgstr "" #: resource/client/forms/admin.glade:2108 #: resource/client/forms/admin.glade:2147 msgid "Enable PlayTime for selected user" msgstr "" #: resource/client/forms/admin.glade:2110 msgid "Enable PlayTime:" msgstr "" #: resource/client/forms/admin.glade:2124 #: resource/client/forms/admin.glade:2161 msgid "" "Enable PlayTime override for selected user.\n" "\n" "This setting overrides time accounting in a way that time is accounted only " "when at least one of the applications on the PlayTime activity list are " "running!\n" "\n" "This affects only time accounting, intervals are still fully enforced!\n" "\n" "If no processes are running, time is accounted as idle thus effectively it's " "free time for user!" msgstr "" #: resource/client/forms/admin.glade:2132 msgid "Enable PlayTime override:" msgstr "" #: resource/client/forms/admin.glade:2180 #: resource/client/forms/admin.glade:2201 msgid "" "Allow PlayTime activities during unaccounted (\"∞\") time intervals for " "selected user.\n" "\n" "This setting allows the user to use applications configured in his PlayTime " "activity list during time intervals which are marked as unaccounted (\"∞" "\").\n" "\n" "If this setting is enabled, the use of activities will not be accounted " "towards PlayTime limits, otherwise applications in PlayTime activity list " "will be terminated as soon as they are started during unaccounted (\"∞\") " "time intervals." msgstr "" #: resource/client/forms/admin.glade:2186 msgid "Allowed during \"∞\" intervals:" msgstr "" #: resource/client/forms/admin.glade:2245 #, fuzzy #| msgid "This allows you to change time limits for today" msgid "This lets you configure PlayTime limits." msgstr "Zde můžete upravit časové limity pro dnešní den" #: resource/client/forms/admin.glade:2247 #: resource/client/forms/client.glade:1253 #, fuzzy #| msgid "Daily limits" msgid "PlayTime limits" msgstr "Denní limity" #: resource/client/forms/admin.glade:2305 msgid "" "Increase daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:2322 msgid "" "Decrease daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:2374 #, fuzzy #| msgid "" #| "Lists day of the week and additional information about the day's limit. " #| "Please enable / disable days for the user." msgid "" "Lists day of the week and additional information about the day's PlayTime " "limit.\n" "\n" "Please enable / disable days for the user and set time allowance for " "PlayTime activities." msgstr "" "Seznam dnů v týdnu s informací o denním limitu, povolené/zakázané dny " "uživatele." #: resource/client/forms/admin.glade:2423 #, fuzzy #| msgid "Time inactive:" msgid "PlayTime activities" msgstr "Neaktivní čas:" #: resource/client/forms/admin.glade:2445 msgid "" "Add new PlayTime activity.\n" "\n" "Please specify activity mask and user friendly description in the activity " "list directly." msgstr "" #: resource/client/forms/admin.glade:2462 msgid "Remove selected entry from PlayTime activities." msgstr "" #: resource/client/forms/admin.glade:2506 msgid "" "Please specify a list of full process (executable) names without path as " "case sensitive strings to be monitored in the system.\n" "\n" "It's possible to specify RegExp masks for processes too, but please be very " "careful about them as misusing this setting may lead to killing unwanted " "processes for the user!\n" "\n" "NOTE: RegExp is an expert setting!" msgstr "" #: resource/client/forms/admin.glade:2546 #, fuzzy #| msgid "Users related configuration" msgid "Apply PlayTime configuration" msgstr "Nastavení související s uživateli" #: resource/client/forms/admin.glade:2550 msgid "Apply PlayTime limits and configuration changes on this page" msgstr "" #: resource/client/forms/admin.glade:2569 #, fuzzy #| msgid "Timekpr-nExT Configuration" msgid "PlayTime configuration" msgstr "Nastavení Timekpr-nExT" #: resource/client/forms/admin.glade:2594 msgid "Additional configuration options" msgstr "Další možnosti konfigurace" #: resource/client/forms/admin.glade:2629 #: resource/client/forms/admin.glade:2652 #, fuzzy #| msgid "" #| "Select whether inactive session time is counted. If this is unchecked, " #| "time spent in console (not terminal emulator) login sessions and while " #| "the screen is locked is NOT taken into account. This varies among desktop " #| "environments." msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account. This " "varies among desktop environments." msgstr "" "Vyberte, zda se má počítat čas pro neaktivní relace. Pokud toto není " "zaškrtnuto, NEBUDE brána v úvahu doba použití v konzoli (nikoli v terminálu) " "a při uzamčené obrazovce (toto se velmi liší DE od DE)" #: resource/client/forms/admin.glade:2633 msgid "Track inactive sessions:" msgstr "Nastavit neaktivní relace:" #: resource/client/forms/admin.glade:2669 #: resource/client/forms/admin.glade:2692 #, fuzzy #| msgid "" #| "Select whether to show Timekpr-next's padlock icon and notifications to " #| "the user.\n" #| "Please note that unchecking this will disable showing all information and " #| "notifications to the user!" msgid "" "Select whether to show Timekpr-next's padlock icon and notifications to the " "user.\n" "\n" "Please note that unchecking this will disable showing all information and " "notifications to the user!" msgstr "" "Vyberte, zda se má uživateli zobrazit ikona visacího zámku a upozornění " "Timekpr-next.\n" "Pamatujte, že odškrtnutím této možnosti zakážete zobrazování všech informací " "a upozornění uživateli!" #: resource/client/forms/admin.glade:2673 msgid "Hide icon and notifications:" msgstr "Skrýt ikonu a upozornění:" #: resource/client/forms/admin.glade:2744 #, fuzzy #| msgid "" #| "Select a restriction / lockout type for the user.\n" #| "NOTE: please be very careful, think ahead and read every options " #| "description when changing this setting from default value!" msgid "" "Select a restriction / lockout type for the user.\n" "\n" "NOTE: please be very careful, think ahead and read every options description " "when changing this setting from default value!" msgstr "" "Vyberte pro uživatele typ omezení / blokování.\n" "POZNÁMKA: buďte velmi opatrní, myslete dopředu a při změně tohoto nastavení " "z výchozí hodnoty si přečtěte popis všech možností!" #: resource/client/forms/admin.glade:2748 msgid "Restriction / lockout type:" msgstr "Typ omezení / blokování:" #: resource/client/forms/admin.glade:2770 msgid "terminate sessions" msgstr "ukončit relace" #: resource/client/forms/admin.glade:2774 #, fuzzy #| msgid "" #| "When time ends, user sessions will be terminated.\n" #| "This option is a restriction!\n" #| "This is the default option and most likely is the one you need!" msgid "" "When time ends, user sessions will be terminated.\n" "\n" "This option is a restriction!\n" "\n" "This is the default option and most likely is the one you need!" msgstr "" "Po uplynutí času budou relace uživatelů ukončeny.\n" "Tato možnost je omezení!\n" "Toto je výchozí možnost a nejpravděpodobněji ta, kterou potřebujete!" #: resource/client/forms/admin.glade:2792 msgid "shutdown computer" msgstr "Vypnout počítač" #: resource/client/forms/admin.glade:2796 #, fuzzy #| msgid "" #| "When time ends, computer will be shut down.\n" #| "This option is a restriction!\n" #| "Please evaluate whether you need this type of restriction!" msgid "" "When time ends, computer will be shut down.\n" "\n" "This option is a restriction!\n" "\n" "Please evaluate whether you need this type of restriction!" msgstr "" "Po uplynutí času bude počítač vypnut.\n" "Tato možnost je omezení!\n" "Vyhodnoťte, zda tento typ omezení potřebujete!" #: resource/client/forms/admin.glade:2814 #, fuzzy msgid "suspend computer" msgstr "pozastavit počítač" #: resource/client/forms/admin.glade:2818 #, fuzzy msgid "" "When time ends, computer will be suspended (put to sleep).\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Po uplynutí času bude počítač pozastaven (uspán).\n" "Tato možnost není omezením a je vhodnější pro účely sebeovládání.\n" "Když se probudíte, když ještě nezbývá čas, obrazovka počítače se uzamkne a " "po nějaké době se znovu uspí." #: resource/client/forms/admin.glade:2836 #, fuzzy msgid "suspend / wakeup computer" msgstr "pozastavit / probudit počítač" #: resource/client/forms/admin.glade:2840 #, fuzzy msgid "" "When time ends, computer will be suspended (put to sleep) and will be woken " "up at start of next available time interval for the user.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Po uplynutí času bude počítač pozastaven (uspán) a probuden na začátku " "dalšího dostupného časového intervalu pro uživatele.\n" "Tato možnost není omezením a je vhodnější pro účely sebeovládání.\n" "Když se probudíte, když ještě nezbývá čas, obrazovka počítače se uzamkne a " "po nějaké době se znovu uspí." #: resource/client/forms/admin.glade:2858 msgid "lock screen" msgstr "uzamknutí obrazovky" #: resource/client/forms/admin.glade:2862 #, fuzzy #| msgid "" #| "When time ends, computer screen will be locked.\n" #| "This option is not a restriction and is more suited for self control " #| "purposes." msgid "" "When time ends, computer screen will be locked.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes." msgstr "" "Po uplynutí času bude obrazovka počítače uzamčena.\n" "Tato možnost není omezením a je vhodnější pro účely ovládání relace." #: resource/client/forms/admin.glade:2893 #, fuzzy msgid "" "Select a time interval when computer can be woken up automatically.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Vyberte časový interval, kdy lze počítač automaticky probudit.\n" "Upozorňujeme, že tato možnost je účinná, pouze pokud je probuzení pomocí " "hodin RealTime podporováno a povoleno v systému BIOS / UEFI!" #: resource/client/forms/admin.glade:2897 msgid "Wakeup hour interval:" msgstr "Interval hodin pro probuzení:" #: resource/client/forms/admin.glade:2909 #, fuzzy msgid "" "Enter start hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Zadejte hodinu zahájení funkce automatického probuzení.\n" "Upozorňujeme, že tato možnost je účinná, pouze pokud je probuzení pomocí " "hodin RealTime podporováno a povoleno v systému BIOS / UEFI!" #: resource/client/forms/admin.glade:2928 #, fuzzy msgid "" "Enter end hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Zadejte konečnou hodinu pro funkci automatického probuzení.\n" "Upozorňujeme, že tato možnost je účinná, pouze pokud je probuzení pomocí " "hodin RealTime podporováno a povoleno v systému BIOS / UEFI!" #: resource/client/forms/admin.glade:2966 #, fuzzy #| msgid "Configuration" msgid "Apply configuration" msgstr "Nastavení" #: resource/client/forms/admin.glade:2970 #, fuzzy #| msgid "Additional configuration options" msgid "Apply additional configuration changes on this page" msgstr "Další možnosti konfigurace" #: resource/client/forms/admin.glade:2989 msgid "Additional configuration" msgstr "Další konfigurace" #: resource/client/forms/admin.glade:2990 #: resource/client/forms/admin.glade:3661 msgid "Additional options" msgstr "Další možnosti" #: resource/client/forms/admin.glade:3017 msgid "User Configuration" msgstr "Nastavení uživatele" #: resource/client/forms/admin.glade:3027 #, fuzzy #| msgid "Timekpr-nExT Configuration" msgid "Timekpr-nExT related configuration" msgstr "Nastavení Timekpr-nExT" #: resource/client/forms/admin.glade:3054 msgid "Control Timekpr-nExT Settings" msgstr "Nastavení ovládání Timekpr-nExT" #: resource/client/forms/admin.glade:3081 #: resource/client/forms/admin.glade:3233 #, fuzzy #| msgid "" #| "Timekpr-nExT log level. Please do not change this unless asked. You " #| "likely won't find anything pretty in the log files.\n" #| "1 - standard, 2 - debug, 3 - extra debug" msgid "" "Timekpr-nExT log level.\n" "\n" "Please do not change this unless you have to. You likely won't find anything " "pretty in the log files.\n" "\n" "Values are: 1 - standard, 2 - debug, 3 - extra debug" msgstr "" "Úroveň protokolu Timekpr-nExT. Neměňte to, pokud to nebude požadováno " "(pravděpodobně v souborech protokolu nenajdete nic hezkého)\n" "1 - standard, 2 - ladit, 3 - ladit podrobněji" #: resource/client/forms/admin.glade:3101 #: resource/client/forms/admin.glade:3149 #, fuzzy #| msgid "" #| "Specify session polling time granularity (how often user sessions and " #| "activity are checked).\n" #| "3 - 5 seconds are optimal, don't change this if unsure." msgid "" "Session polling time granularity which specifies how often user sessions and " "activity are checked and accounted.\n" "\n" "3 - 5 seconds are optimal, don't change this if unsure." msgstr "" "Určit četnost mezi dotazováním relace (v jakém intervalu se budou dotazovat " "uživatelské relace a aktivity).\n" "Nejlepší nastavení je 3 - 5 sekund, neměňte nastavení pokud si nejste jisti." #: resource/client/forms/admin.glade:3105 msgid "Poll interval" msgstr "Interval dotazování" #: resource/client/forms/admin.glade:3117 #: resource/client/forms/admin.glade:3220 #, fuzzy #| msgid "" #| "Specify the time in seconds when Timekpr-nExT starts continuous real-time " #| "countdown before terminating the session" msgid "" "Specify the time in seconds when Timekpr-nExT starts continuous real-time " "countdown before enforcing a restriction / lockout to user's sessions." msgstr "" "Určete čas v sekundách, kdy Timekpr-nExT zahájí nepřetržité odpočítávání v " "reálném čase před ukončením relace" #: resource/client/forms/admin.glade:3133 #: resource/client/forms/admin.glade:3183 msgid "" "This specifies the rate in seconds at which actual user state is saved to " "disk.\n" "\n" "To improve performance and still have great accuracy, Timekpr-nExT accounts " "time in memory at \"Poll interval\" frequency, this setting defines a " "frequency at which user state is saved to disk for permanent storage." msgstr "" #: resource/client/forms/admin.glade:3137 msgid "Save time" msgstr "Ušetřený čas" #: resource/client/forms/admin.glade:3167 #: resource/client/forms/admin.glade:3202 msgid "" "Number of seconds left for user before enforcing a configured restriction / " "lockout to his sessions.\n" "\n" "After this is reached and user is still active, the user's sessions will be " "handled according to specified restriction / lockout, and almost nothing can " "be done to prevent it." msgstr "" #: resource/client/forms/admin.glade:3171 msgid "Termination time" msgstr "Čas do odhlášení" #: resource/client/forms/admin.glade:3222 #, fuzzy #| msgid "Termination time" msgid "Countdown time" msgstr "Čas do odhlášení" #: resource/client/forms/admin.glade:3239 msgid "Log level" msgstr "Úroveň protokolu" #: resource/client/forms/admin.glade:3250 #: resource/client/forms/admin.glade:3266 msgid "" "Number of seconds left for user's available time before sending a final " "critical notification that time is about to run out.\n" "\n" "NOTE: the rest of the notification times are configurable per user by user " "in client application!" msgstr "" #: resource/client/forms/admin.glade:3254 #, fuzzy #| msgid "Show all notifications" msgid "Final notification" msgstr "Zobrazit všechna oznámení" #: resource/client/forms/admin.glade:3308 msgid "Control Timekpr-nExT tracking items" msgstr "Ovládáné položky Timekpr-nExT" #: resource/client/forms/admin.glade:3341 msgid "Tracked Sessions" msgstr "Sledované relace" #: resource/client/forms/admin.glade:3364 msgid "Add tracked session type to the list" msgstr "Přidat sledovaný typ relace do seznamu" #: resource/client/forms/admin.glade:3379 msgid "Remove tracked session type from the list" msgstr "Odebrat sledovaný typ relace ze seznamu" #: resource/client/forms/admin.glade:3408 #, fuzzy #| msgid "" #| "List of session types to be tracked.\n" #| "Please, do not change or experiment with this unless you actually (not " #| "wishfully) know what you are doing." msgid "" "List of session types to be tracked.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Seznam typů relací, které mají být sledovány.\n" "Prosím, neměňte ani s tím neexperimentujte, pokud skutečně nevíte, co děláte." #: resource/client/forms/admin.glade:3442 msgid "Excluded Sessions" msgstr "Vyloučené relace" #: resource/client/forms/admin.glade:3465 msgid "Add an excluded session type to the list" msgstr "Přidat vyloučený typ relace do seznamu" #: resource/client/forms/admin.glade:3480 msgid "Remove an excluded session type from the list" msgstr "Odebrat vyloučený typ relace ze seznamu" #: resource/client/forms/admin.glade:3509 #, fuzzy #| msgid "" #| "List of sessions to be excluded from tracking.\n" #| "Please, do not change or experiment with this unless you actually (not " #| "wishfully) know what you are doing." msgid "" "List of sessions to be excluded from tracking.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Seznam relací, které mají být ze sledování vyloučeny.\n" "Prosím, neměňte ani s tím neexperimentujte, pokud skutečně nevíte, co děláte." #: resource/client/forms/admin.glade:3543 msgid "Excluded Users" msgstr "Vyjmutí uživatelé" #: resource/client/forms/admin.glade:3566 msgid "Add a user to the exclusion list" msgstr "Přidat uživatele do seznamu vyloučených" #: resource/client/forms/admin.glade:3581 msgid "Remove a user from the exclusion list" msgstr "Odstranit uživatele ze seznamu vyloučených" #: resource/client/forms/admin.glade:3610 #, fuzzy #| msgid "" #| "List of users excluded from tracking.\n" #| "Please specify actual usernames, not real names here. For example, " #| "\"jsmith\", not \"John Smith\"." msgid "" "List of users excluded from tracking.\n" "\n" "Please specify actual usernames, not real names here. For example, \"jsmith" "\", not \"John Smith\"." msgstr "" "Seznam uživatelů vyloučených ze sledování.\n" "Zde prosím zadejte uživatelská jména, nikoli skutečná jména \n" "(např. uveďte \"novakj\", ne \"Jan Novák\")" #: resource/client/forms/admin.glade:3688 #: resource/client/forms/admin.glade:3707 #: resource/client/forms/admin.glade:3743 msgid "" "This setting controls whether PlayTime functionality is enabled.\n" "\n" "This is a PlayTime master switch, if it's turned off, it's turned off for " "everyone regardless of individual settings!" msgstr "" #: resource/client/forms/admin.glade:3692 msgid "PlayTime enabled:" msgstr "" #: resource/client/forms/admin.glade:3722 msgid "" "This setting controls whether PlayTime activity monitor will use process " "command line, including arguments, for monitoring processes (by default only " "uses the process name).\n" "\n" "When this setting is enabled Timekpr-nExT will perform a match against full " "command line up to 512 characters enabling enhanced process monitoring " "capabilities.\n" "\n" "Please be careful and double check your RegExp patterns in each individual " "user's PlayTime activity masks!" msgstr "" #: resource/client/forms/admin.glade:3728 msgid "Enhanced activity monitor:" msgstr "" #: resource/client/forms/admin.glade:3777 #, fuzzy #| msgid "Apply Timekpr-nExT setings" msgid "Apply Timekpr-nExT settings" msgstr "Použít nastavení Timekpr-nExT" #: resource/client/forms/admin.glade:3782 msgid "Apply all Timekpr-nExT settings at once" msgstr "Použít najednou všechna nastavení Timekpr-nExT" #: resource/client/forms/admin.glade:3802 msgid "Timekpr-nExT Administration Configuration" msgstr "Nastavení programu Timekpr-nExT" #: resource/client/forms/admin.glade:3803 msgid "Timekpr-nExT Configuration" msgstr "Nastavení Timekpr-nExT" #: resource/client/forms/admin.glade:3832 #: resource/client/forms/admin.glade:3849 msgid "Status of Timekpr-nExT admin client" msgstr "Stav správce Timekpr-nExT" #. This is one of the notification priorities #: resource/client/forms/client.glade:27 #, fuzzy #| msgid "Configuration" msgid "Information" msgstr "Nastavení" #. This is one of the notification priorities #: resource/client/forms/client.glade:31 #, fuzzy #| msgid "Warning time" msgid "Warning" msgstr "Čas varování" #. This is one of the notification priorities #: resource/client/forms/client.glade:35 msgid "Severe" msgstr "" #. This is one of the notification priorities #: resource/client/forms/client.glade:39 msgid "Critical" msgstr "" #: resource/client/forms/client.glade:133 msgid "Timekpr-nExT client" msgstr "Klientská část Timekpr-nExT" #: resource/client/forms/client.glade:164 msgid "Status of Timekpr-nExT client" msgstr "Stav klienta Timekpr-nExT" #: resource/client/forms/client.glade:196 msgid "Save all changes" msgstr "Uložit všechny změny" #: resource/client/forms/client.glade:213 msgid "Close the window" msgstr "Zavřít okno" #: resource/client/forms/client.glade:297 #: resource/client/forms/client.glade:314 msgid "Current effective username" msgstr "Aktuální uživatelské jméno" #: resource/client/forms/client.glade:371 msgid "Current statistics" msgstr "Aktuální statistiky" #: resource/client/forms/client.glade:396 msgid "Time spent this session or after Timekpr-nExT has been restarted" msgstr "Čas využitý touto relací nebo od restartování Timekpr-nExT" #: resource/client/forms/client.glade:398 msgid "Time spent (session):" msgstr "Čas využitý relací:" #: resource/client/forms/client.glade:441 msgid "Time inactive this session or after Timekpr-nExT has been restarted" msgstr "Čas neaktivní využitý touto relací nebo od restartování Timekpr-nExT" #: resource/client/forms/client.glade:443 msgid "Time inactive:" msgstr "Neaktivní čas:" #: resource/client/forms/client.glade:469 #, fuzzy msgid "Continuous time left to you. May span more than the current day." msgstr "Zbývající nepřetržitý čas, jeho délka může být delší než aktuální den." #: resource/client/forms/client.glade:471 msgid "Continuous time left:" msgstr "Zbývající nepřetržitý čas:" #: resource/client/forms/client.glade:487 msgid "Total time available left today in a row, up to the end of the day" msgstr "Celkový dnešní čas, který je k dispozici do konce dne" #: resource/client/forms/client.glade:489 #: resource/client/forms/client.glade:974 msgid "Time left today:" msgstr "Čas zbývající dnes:" #: resource/client/forms/client.glade:548 msgid "These are the days and limits that are available to you" msgstr "Toto jsou limity jednotlivých dnů, které máte k dispozici" #: resource/client/forms/client.glade:573 #: resource/client/forms/client.glade:1171 msgid "Days & Limits" msgstr "Limity dnů" #: resource/client/forms/client.glade:609 msgid "" "This shows the time intervals that are available for use.\n" "\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead." msgstr "" #: resource/client/forms/client.glade:634 msgid "Intervals" msgstr "Intervaly" #: resource/client/forms/client.glade:663 msgid "Daily limits" msgstr "Denní limity" #: resource/client/forms/client.glade:691 msgid "Additional statistics" msgstr "Další statistiky" #: resource/client/forms/client.glade:715 msgid "Time spent this week" msgstr "Čas využitý v tomto týdnu" #: resource/client/forms/client.glade:742 msgid "Time spent this month" msgstr "Čas využitý v tomto měsíci" #: resource/client/forms/client.glade:755 #, fuzzy #| msgid "" #| "Select whether inactive session time is counted. If this is unchecked, " #| "time spent in console (not terminal emulator) login sessions and while " #| "the screen is locked is NOT taken into account. This varies among desktop " #| "environments." msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account.\n" "This varies among desktop environments." msgstr "" "Vyberte, zda se má počítat čas pro neaktivní relace. Pokud toto není " "zaškrtnuto, NEBUDE brána v úvahu doba použití v konzoli (nikoli v terminálu) " "a při uzamčené obrazovce (toto se velmi liší DE od DE)" #: resource/client/forms/client.glade:760 msgid "Track inactive:" msgstr "Sledovat neaktivní:" #: resource/client/forms/client.glade:773 msgid "" "Select whether inactive session time is counted. If this is unchecked, time " "spent in console (not terminal emulator) login sessions and while the screen " "is locked is NOT taken into account. This varies among desktop environments." msgstr "" "Vyberte, zda se má počítat čas pro neaktivní relace. Pokud toto není " "zaškrtnuto, NEBUDE brána v úvahu doba použití v konzoli (nikoli v terminálu) " "a při uzamčené obrazovce (toto se velmi liší DE od DE)" #: resource/client/forms/client.glade:820 #: resource/client/forms/client.glade:918 msgid "Additional limits" msgstr "Ostatní limity" #: resource/client/forms/client.glade:844 msgid "Time limit for this week available to you" msgstr "Týdenní časový limit, který máte k dispozici" #: resource/client/forms/client.glade:846 msgid "Time limit (week):" msgstr "Časový limit za týden:" #: resource/client/forms/client.glade:872 msgid "Time limit for this month available to you" msgstr "Měsíční časový limit. který máte k dispozici" #: resource/client/forms/client.glade:874 msgid "Time limit (month):" msgstr "Časový limit za měsíc:" #: resource/client/forms/client.glade:948 #, fuzzy #| msgid "Current statistics" msgid "Current PlayTime statistics" msgstr "Aktuální statistiky" #: resource/client/forms/client.glade:972 msgid "Total PlayTime available left today" msgstr "" #: resource/client/forms/client.glade:998 #, fuzzy #| msgid "Time spent (today):" msgid "Total PlayTime spent today" msgstr "Čas využitý dnes:" #: resource/client/forms/client.glade:1000 #, fuzzy #| msgid "Time spent (today):" msgid "Time spent today:" msgstr "Čas využitý dnes:" #: resource/client/forms/client.glade:1027 #: resource/client/forms/client.glade:1042 msgid "" "This option overrides the default time accounting.\n" "\n" "If it's checked, the time is accounted only when activities in \"Activity / " "application list\" are running, the rest of the time is considered idle." msgstr "" #: resource/client/forms/client.glade:1046 #, fuzzy #| msgid "Time limit (week):" msgid "Time limit override:" msgstr "Časový limit za týden:" #: resource/client/forms/client.glade:1060 #: resource/client/forms/client.glade:1073 msgid "Number of currently active PlayTime activities" msgstr "" #: resource/client/forms/client.glade:1062 msgid "Running activities:" msgstr "" #: resource/client/forms/client.glade:1086 #: resource/client/forms/client.glade:1106 msgid "" "Allow activities during unaccounted (\"∞\") time intervals.\n" "\n" "This setting allows to use applications listed in \"Activity / application " "list\" during time intervals which are marked as unaccounted (\"∞\"), if the " "setting is not enabled, none of activities are allowed to run!" msgstr "" #: resource/client/forms/client.glade:1090 msgid "Allowed during \"∞\":" msgstr "" #: resource/client/forms/client.glade:1148 #, fuzzy #| msgid "These are days and limits that available to You" msgid "" "These are days and limits that available to you as part of PlayTime activity " "restrictions" msgstr "Toto jsou limity jednotlivých dnů, které máte k dispozici" #: resource/client/forms/client.glade:1205 msgid "" "This shows activities / applications which are part of PlayTime restrictions" msgstr "" #: resource/client/forms/client.glade:1228 msgid "Activity / application list" msgstr "" #: resource/client/forms/client.glade:1292 msgid "" "Configuration for personalized notifications about available time.\n" "\n" "Please configure notifications as you see fit. However, please keep in mind " "that there will be two types of notifications that cannot be personalized: a " "final warning some time before time ends and a countdown notifications when " "time is about to end.\n" "\n" "The configuration \"Time\" value indicates a value of time left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" #: resource/client/forms/client.glade:1324 #, fuzzy #| msgid "Additional configuration" msgid "Notification configuration" msgstr "Další konfigurace" #: resource/client/forms/client.glade:1346 #, fuzzy #| msgid "Add tracked session type to the list" msgid "Add new notification threshold to the list" msgstr "Přidat sledovaný typ relace do seznamu" #: resource/client/forms/client.glade:1361 #, fuzzy #| msgid "Remove tracked session type from the list" msgid "Remove notification threshold from the list" msgstr "Odebrat sledovaný typ relace ze seznamu" #: resource/client/forms/client.glade:1410 msgid "" "Configuration for personalized notifications about available PlayTime.\n" "\n" "Please configure notifications as you see fit.\n" "\n" "The configuration \"Time\" value indicates a value of PlayTime left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" #: resource/client/forms/client.glade:1442 #, fuzzy #| msgid "Timekpr-nExT Administration Configuration" msgid "PlayTime notification configuration" msgstr "Nastavení programu Timekpr-nExT" #: resource/client/forms/client.glade:1464 msgid "Add new PlayTime notification threshold to the list" msgstr "" #: resource/client/forms/client.glade:1479 #, fuzzy #| msgid "Remove tracked session type from the list" msgid "Remove PlayTime notification threshold from the list" msgstr "Odebrat sledovaný typ relace ze seznamu" #: resource/client/forms/client.glade:1538 #, fuzzy #| msgid "Show all notifications" msgid "Notifications" msgstr "Zobrazit všechna oznámení" #: resource/client/forms/client.glade:1562 #, fuzzy #| msgid "" #| "Select whether to use speech notifications, if available. You may be able " #| "to make speech notifications available by installing package \"python3-" #| "espeak\"." msgid "" "Select whether to use speech notifications, if available.\n" "\n" "You may be able to make speech notifications available by installing package " "\"python3-espeak\"." msgstr "" "Vyberte, zda se mají používat hlasová oznámení (nejsou-li k dispozici, bude " "volba šedá). Pokud potřebujete použít hlasová oznámení, nainstalujte prosím " "balíček \"python3-espeak\"." #: resource/client/forms/client.glade:1572 msgid "Use speech notifications" msgstr "Použít hlasová oznámení" #: resource/client/forms/client.glade:1591 #: resource/client/forms/client.glade:1613 #, fuzzy #| msgid "" #| "This sets the logging level. Please do not change this unless you know " #| "what you're doing." msgid "" "This sets the logging level.\n" "\n" "Please do not change this unless you know what you're doing." msgstr "" "Zde nastavíte úroveň protokolování (prosím pokud nevíte co děláte, neměňte " "nastavení)" #: resource/client/forms/client.glade:1617 msgid "Logging level" msgstr "Úroveň protokolování" #: resource/client/forms/client.glade:1639 msgid "" "Specify whether to show a notification when limit configurations or " "allowance changes" msgstr "" "Určete, zda se mají zobrazit oznámení, když se změní konfigurace limitů nebo " "povolení" #: resource/client/forms/client.glade:1647 msgid "Show limit changes" msgstr "Zobrazit změny limitu" #: resource/client/forms/client.glade:1663 #, fuzzy #| msgid "" #| "Specify whether to show all notifications. If unchecked, then only " #| "important ones are shown" msgid "" "Specify whether to show all notifications.\n" "\n" "If unchecked, then only important ones are shown." msgstr "" "Určete, zda se mají zobrazit všechna oznámení. Pokud není zaškrtnuto, " "zobrazí se pouze důležité" #: resource/client/forms/client.glade:1673 msgid "Show all notifications" msgstr "Zobrazit všechna oznámení" #: resource/client/forms/client.glade:1689 #, fuzzy #| msgid "" #| "Specify whether to show seconds in notification area. Some desktop " #| "environments, like KDE5, do not support text besides notification icons." msgid "" "Specify whether to show seconds in notification area.\n" "\n" "Some desktop environments, like KDE5, do not support text besides " "notification icons." msgstr "" "Určete, zda se mají zobrazovat sekundy v oznamovací oblasti (některé DE, " "například KDE5, nepodporují text kromě oznamovacích ikon)" #: resource/client/forms/client.glade:1699 msgid "Show seconds in notification area" msgstr "Zobrazit sekundy v oznamovací oblasti" #: resource/client/forms/client.glade:1718 #: resource/client/forms/client.glade:1742 #, fuzzy msgid "" "This sets how long a notification is shown for regular notifications about " "time left and configuration changes.\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed (not recommended for regular " "notifications).\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Tím se nastavuje, jak dlouho se bude zobrazovat oznámení pro upozornění na " "zbývající čas a změny konfigurace.\n" "Hodnota je zadána v sekundách, hodnota 0 znamená zobrazit, dokud není " "zrušena (nedoporučuje se pro běžné oznámení).\n" "Upozorňujeme, že prostředí, které používáte, může přepsat časový limit, což " "znamená, že toto nastavení nebude mít žádný vliv na oznámení." #: resource/client/forms/client.glade:1749 msgid "Notification timeout (sec)" msgstr "Časový limit oznámení (s)" #: resource/client/forms/client.glade:1774 #: resource/client/forms/client.glade:1799 #, fuzzy msgid "" "This sets how long a notification is shown for \"Critical\" notifications " "about time left (when the icon turns red).\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed.\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Toto nastavuje, jak dlouho se bude zobrazovat oznámení pro kritická oznámení " "o zbývajícím času (když ikona zčervená).\n" "Hodnota je zadána v sekundách, hodnota 0 znamená zobrazit, dokud není " "odmítnuta.\n" "Upozorňujeme, že prostředí, které používáte, může přepsat časový limit, což " "znamená, že toto nastavení nebude mít žádný vliv na oznámení." #: resource/client/forms/client.glade:1806 msgid "Critical notification timeout (sec)" msgstr "Časový limit kritického oznámení (s)" #: resource/client/forms/client.glade:1828 #, fuzzy msgid "" "Select whether to use sound \"bell\" (short notification sound) to announce " "a new notification from Timekpr-nExT.\n" "\n" "This works only for enabled notifications.\n" "\n" "If this setting is not editable, your environment does not advertise sound " "notification support." msgstr "" "Vyberte, zda chcete použít zvukové „pípnutí“ (krátký zvukový signál) k " "označení nového oznámení od Timekpr-nExT. Toto funguje pouze pro aktivovaná " "oznámení.\n" "Pokud nastavení nelze upravovat, vaše prostředí neinvertuje podporu " "zvukového upozornění." #: resource/client/forms/client.glade:1840 msgid "Use sound \"bell\" for notifications" msgstr "K upozornění použijte zvukový signál" #: resource/client/forms/client.glade:1860 msgid "Configuration" msgstr "Nastavení" #, fuzzy #~| msgid "" #~| "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~| "Super tester: Rinalds Dobelis\n" #~| "Beta tester: SanskritFritz" #~ msgid "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Main test (ex): Rinalds Dobelis\n" #~ "Beta test: SanskritFritz" #~ msgstr "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Super tester: Rinalds Dobelis\n" #~ "Beta tester: SanskritFritz" #~ msgid "00:00:00:00" #~ msgstr "00:00:00:00" #~ msgid "Amount:" #~ msgstr "Úroveň:" #~ msgid "Add" #~ msgstr "Přidat" #~ msgid "Subtract" #~ msgstr "Odečíst" #~ msgid "Set" #~ msgstr "Zadat" #~ msgid "Configure time limits for week days" #~ msgstr "Nastavit časové limity pro dny v týdnu" #~ msgid "Set the number of hours to limit available time for particular day" #~ msgstr "" #~ "Nastavte počet hodin, abyste omezili čas, který je k dispozici pro " #~ "konkrétní den" #~ msgid "" #~ "Set hours and minutes at this user's disposal for this particular day. " #~ "Don't forget to hit the button!" #~ msgstr "" #~ "Nastavit určené hodiny a minuty pro konkrétní den, které má uživatel k " #~ "dispozici (nezapomeňte stisknout tlačítko )" #~ msgid "Manage intervals for the day" #~ msgstr "Stanovit intervaly pro daný den" #~ msgid "Specify START minute of the allowed hour interval" #~ msgstr "Určete minutu ZAČÁTKU povoleného časového intervalu" #~ msgid "Specify START hour of the allowed hour interval" #~ msgstr "Určete hodinu ZAČÁTKU povoleného časového intervalu" #~ msgid "to" #~ msgstr "do" #~ msgid "Remove" #~ msgstr "Odebrat" #~ msgid "" #~ "Remove selected interval from the list. Do not forget to hit the " #~ "button!" #~ msgstr "" #~ "Odstranit vybraný interval ze seznamu (nezapomeňte stisknout tlačítko " #~ ")" #~ msgid "" #~ "Add specified hour interval to the list. Do not forget to hit the " #~ "button!" #~ msgstr "" #~ "Přidat zadaný hodinový interval do seznamu (nezapomeňte stisknout " #~ "tlačítko )" #~ msgid "Specify the END hour of the allowed hour interval" #~ msgstr "Určete hodinu KONCE povoleného časového intervalu" #~ msgid "Specify the END minute of the allowed hour interval" #~ msgstr "Určete minutu KONCE povoleného časového intervalu" #~ msgid "Time limit for the month" #~ msgstr "Měsíční časový limit" #~ msgid "Time limit (month)" #~ msgstr "Časový limit za měsíc:" #~ msgid "Time limit for the month is enabled" #~ msgstr "Povolit měsíční časový limit" #~ msgid "Time limit for the week" #~ msgstr "Týdenní časový limit" #~ msgid "Time limit (week)" #~ msgstr "Časový limit za týden" #~ msgid "day" #~ msgstr "den" #~ msgid "Week limit (days part)" #~ msgstr "Rozsah týdenního limitu (výběr dnů)" #~ msgid "Week limit (hours part)" #~ msgstr "Rozsah týdeního limitu (výběr hodin)" #~ msgid "Week limit (minutes part)" #~ msgstr "Rozsah týdeního limitu (výběr minut)" #~ msgid "Month limit (days part)" #~ msgstr "Rozsah měsíčního limitu (výběr dnů)" #~ msgid "Month limit (hours part)" #~ msgstr "Rozsah měsíčního limitu (výběr hodin)" #~ msgid "Month limit (minutes part)" #~ msgstr "Rozsah měsíčního limitu (výběr minut)" #~ msgid "This allows you to set up weekly and monthly limits" #~ msgstr "Zde můžete nastavit týdenní a měsíční limity" #~ msgid "Apply" #~ msgstr "Použít" #~ msgid "Apply weekly and monthly limits" #~ msgstr "Použt týdenní a měsíční limity" #~ msgid "Weekly and monthly limit configuration" #~ msgstr "Nastavení týdenních a měsíčních limitů" #~ msgid "Set track inactive sessions" #~ msgstr "Nastavit neaktivní relace" #~ msgid "Set preference for showing icon to user" #~ msgstr "Nastavit předvolbu zobrazování ikony uživateli" #~ msgid "Set restriction / lockout type" #~ msgstr "Nastavit typ omezení / blokování" #~ msgid "This specifies the frequency with which actual user state is saved" #~ msgstr "Určete časový interval, ve kterém je uložen skutečný stav uživatele" #~ msgid "" #~ "Number of seconds before terminating user sessions. After this is " #~ "reached, the user's session will be terminated / locked, and nothing can " #~ "be done to prevent it.\n" #~ "Adding time does not help in this case. Do that before reaching this " #~ "point..." #~ msgstr "" #~ "Počet sekund od ukončení po odhlášení uživatelské relace. Po dosažení " #~ "časového limitu začne odpočet, následně bude činnost uživatele ukončena, " #~ "odhlášení nelze zabránit.\n" #~ "Přidání času v tomto případě nepomůže. Čas přidejte před dosažením tohoto " #~ "bodu ..." #~ msgid "Enter session type to be tracked" #~ msgstr "Zadejte typ relace, kterou chcete sledovat" #~ msgid "Enter session type to be excluded from tracking" #~ msgstr "Zadejte typ relace, která má být ze sledování vyloučena" #~ msgid "Enter username to be excluded from tracking" #~ msgstr "Zadejte uživatelské jméno, které má být ze sledování vyloučeno" #~ msgid "This shows the time periods that are available for your use" #~ msgstr "Zobrazit časové intervaly, které jsou k dispozici pro použití" #~ msgid "" #~ "Specify whether to show seconds in notification area (some DE, like KDE5, " #~ "do not support text besides notification icons)" #~ msgstr "" #~ "Určete, zda se mají zobrazovat sekundy v oznamovací oblasti (některé DE, " #~ "například KDE5, nepodporují text kromě oznamovacích ikon)" #~ msgid "Control sessions types list is not correct and can not be set" #~ msgstr "Seznam typů kontrolních relací není správný a nelze jej nastavit" #~ msgid "Excluded session types list is not correct and can not be set" #~ msgstr "Seznam vyloučených typů relací není správný a nelze jej nastavit" #~ msgid "Excluded user list is not correct and can not be set" #~ msgstr "Seznam vyloučených uživatelů není správný a nelze jej nastavit" #, python-format #~ msgid "Final warning time \"%%s\" is not correct and can not be set" #~ msgstr "Čas poslední výstrahy \"%%s\" není správný a nelze jej nastavit" #~ msgid "" #~ "Select whether to use speech notifications (if not available, this will " #~ "be greyed out). If usage of speech is very much needed, please install " #~ "python3-espeak package" #~ msgstr "" #~ "Vyberte, zda se mají používat hlasová oznámení (nejsou-li k dispozici, " #~ "bude volba šedá). Pokud potřebujete použít hlasová oznámení, nainstalujte " #~ "prosím balíček python3-espeak" #~ msgid "" #~ "Specify whether to show notification when limit configurations or " #~ "allowance changes" #~ msgstr "" #~ "Určete, zda se mají zobrazit oznámení, když se změní konfigurace limitů " #~ "nebo povolení" #~ msgid "Time limit for month available to You" #~ msgstr "Měsíční časový limit. který máte k dispozici" #~ msgid "Time limit for week available to You" #~ msgstr "Týdenní časový limit, který máte k dispozici" #, python-format #~ msgid "Termination time \"%%s\" is not correct and can not be set" #~ msgstr "Čas ukončení \"%%s\" není správný a nelze jej nastavit" #, python-format #~ msgid "Track inactive \"%%s\" is not correct and can not be set" #~ msgstr "Stopa není aktivní \"%%s\"není správné a nelze jej nastavit" #~ msgid "Specify END minute of the allowed hour interval" #~ msgstr "Určete minutu KONCE povoleného časového intervalu" #~ msgid "Specify END hour of the allowed hour interval" #~ msgstr "Určete hodinu KONCE povoleného časového intervalu" #~ msgid "This allows You to set up weekly & monthly limits" #~ msgstr "Zde můžete nastavit týdenní a měsíční limity" #~ msgid "Month limit amount (minutes part)" #~ msgstr "Rozsah měsíčního limitu (výběr minut)" #~ msgid "Month limit amount (days part)" #~ msgstr "Rozsah měsíčního limitu (výběr dnů)" #~ msgid "Month limit amount (hours part)" #~ msgstr "Rozsah měsíčního limitu (výběr hodin)" #~ msgid "Week limit amount (hours part)" #~ msgstr "Rozsah týdeního limitu (výběr hodin)" #~ msgid "Week limit amount (minutes part)" #~ msgstr "Rozsah týdeního limitu (výběr minut)" #~ msgid "Week limit amount (days part)" #~ msgstr "Rozsah týdenního limitu (výběr dnů)" #~ msgid "==> get user configuration from the server, example" #~ msgstr "==> získat konfiguraci uživatele ze serveru, například" #~ msgid "==> set time limits per all allowed days, example" #~ msgstr "==> nastavit omezení času pro všechny povolené dny, například" #, python-format #~ msgid "Poll time \"%%s\" is not correct and can not be set" #~ msgstr "Sčítání času \"%%s\"není správné a nelze jej nastavit" #, python-format #~ msgid "Save time \"%%s\" is not correct and can not be set" #~ msgstr "Ušetřený čas\"%%s\"není správně a nelze jej nastavit" #~ msgid "please-enter-translator-credits" #~ msgstr "Luděk Novák " #~ msgid "Remove user from the exclusion list" #~ msgstr "Odstranit uživatele ze seznamu vyloučených" #~ msgid "Add user to the exclusion list" #~ msgstr "Přidat uživatele do seznamu vyloučených" #~ msgid "Remove excluded session type from the list" #~ msgstr "Odebrat vyloučený typ relace ze seznamu" #~ msgid "Add excluded session type to the list" #~ msgstr "Přidat vyloučený typ relace do seznamu" #~ msgid "This specifies the time interval at which actual user state is saved" #~ msgstr "Určete časový interval, ve kterém je uložen skutečný stav uživatele" #, python-format #~ msgid "User's \"%%s\" allowed hours are not correct and can not be set" #~ msgstr "" #~ "Povolené hodiny uživatele \"%%s\" nejsou správné a nelze je nastavit" #, python-format #~ msgid "User's \"%%s\" day limits list is not correct and can not be set" #~ msgstr "" #~ "Seznam denních limitů uživatele %%s není správný a nelze jej nastavit" #, python-format #~ msgid "User's \"%%s\" day list is not correct and can not be set" #~ msgstr "Seznam dnů uživatele \"%%s\" není správný a nelze jej nastavit" #, python-format #~ msgid "User's \"%%s\" monthly allowance is not correct and can not be set" #~ msgstr "" #~ "Měsíční příspěvek uživatele \"%%s\" není správný a nelze jej nastavit" #, python-format #~ msgid "User's \"%%s\" set time limit is not correct and can not be set" #~ msgstr "" #~ "Nastavený časový limit uživatele \"%%s\" není správný a nelze jej nastavit" #, python-format #~ msgid "User's \"%%s\" track inactive flag is not correct and can not be set" #~ msgstr "" #~ "Příznak neaktivní stopy \"%%s\" uživatele není správný a nelze jej " #~ "nastavit" #, python-format #~ msgid "User's \"%%s\" weekly allowance is not correct and can not be set" #~ msgstr "" #~ "Týdenní příspěvek uživatele \"%%s\" není správný a nelze jej nastavit" #~ msgid "Please select a hour interval to remove" #~ msgstr "Vyberte prosím časový interval, který chcete odebrat" #~ msgid "Set the amount of hours to limit available time for particular day" #~ msgstr "" #~ "Nastavte počet hodin, abyste omezili čas, který je k dispozici pro " #~ "konkrétní den" #~ msgid "Add specified amount (reward)" #~ msgstr "Přidat zadanou částku (odměna)" #~ msgid "Subtract specified amount (penalty)" #~ msgstr "Odečíst zadanou částku (pokuta)" #, python-format #~ msgid "Log level \"%%s\" is not correct and can not be set" #~ msgstr "Úroveň protokolu \"%%s\"není správná a nelze jí nastavit" #~ msgid "Interval overlaps with existing one" #~ msgstr "Interval se překrývá s existujícím" #~ msgid "Interval start conflicts with existing one" #~ msgstr "Konflikty startu intervalu se stávajícím" #~ msgid "Interval end conflicts with existing one" #~ msgstr "Konflikty konce intervalu s existujícím" #~ msgid "Interval start or end duplicates existing interval" #~ msgstr "Začátek nebo konec intervalu je shodný s existujícím intervalem" #~ msgid "Interval start can not be the same as end" #~ msgstr "Začátek intervalu nemůže být stejný jako konec" #, python-format #~ msgid "" #~ "Feature \"%%s\", which is used to detect idle time, can not be enabled!\n" #~ "Idle / inactive time might not be accounted when screen is locked!" #~ msgstr "" #~ "Funkci \"%%s\", která se používá k detekci nečinnosti, nelze aktivovat!\n" #~ "Když je obrazovka uzamčena, nemusí se počítat doba nečinnosti/neaktivity!" #~ msgid "" #~ "This is Timekpr-nExT configuration app. It allows you to configure time " #~ "for your users as well as the Timekpr-nExT parameters.\n" #~ "\n" #~ "To use this application, you either have to execute it as superuser or " #~ "have to be part of the timekpr group.\n" #~ "Please note that the \"Timekpr-nExT Configuration\" is available in " #~ "superuser (administrator) mode only!\n" #~ "\n" #~ "Please configure carefully: do not lock yourself out!" #~ msgstr "" #~ "Toto je konfigurační aplikace Timekpr-nExT. Umožňuje nakonfigurovat čas " #~ "pro vaše uživatele a také parametry Timekpr-nExT.\n" #~ "\n" #~ "Chcete-li použít tuto aplikaci, musíte ji buď spustit jako superuživatel, " #~ "nebo musíte být součástí skupiny timekpr. Uvědomte si prosím, že " #~ "„Nastavení Timekpr-nExT\" je k dispozici pouze v režimu superuživatele " #~ "(správce)!\n" #~ "\n" #~ "Prosím buďte opatrní, nezablokujte se!" #~ msgid "Time spent for this week (saved stated, not real-time)" #~ msgstr "Čas svyužitý tento týden (uložený, nikoliv reálný čas)" #~ msgid "" #~ "This allows you to change time for today as well as inactive session " #~ "tracking" #~ msgstr "Umožnit změnu času pro aktivní i neaktivní sledované relace" #~ msgid "Set exacly specified limit" #~ msgstr "Nastavit přesně stanovený limit" #~ msgid "" #~ "Select whether time for inactive sessions are counted. If this is " #~ "unchecked, time spent in console (not terminal) and while screen is " #~ "locked is NOT taken into account (this very much varies from DE to DE)" #~ msgstr "" #~ "Vyberte, zda se má počítat čas pro neaktivní relace. Pokud toto není " #~ "zaškrtnuto, NEBUDE brána v úvahu doba použití v konzoli (nikoli v " #~ "terminálu) a při uzamčené obrazovce (toto se velmi liší DE od DE)" #~ msgid "" #~ "Lists day of the week and additional information about the day's limit, " #~ "please enable / disable days for the user" #~ msgstr "" #~ "Seznam dnů v týdnu s informací o denním limitu, povolené/zakázané dny " #~ "uživatele" #~ msgid "Specify day's limit" #~ msgstr "Nastavit denní limit" #~ msgid "" #~ "Set specified hours and minutes for particular day at user's disposal (do " #~ "not forget to hit the button)" #~ msgstr "" #~ "Nastavit určené hodiny a minuty pro konkrétní den, které má uživatel k " #~ "dispozici (nezapomeňte stisknout tlačítko )" #~ msgid "" #~ "Hour intervals per day available to user.\n" #~ "Please note that if day ends at 24th hour and next day starts at 0, user " #~ "can work continuously past midnight.\n" #~ "Please note that multiple intervals cannot be configured within the same " #~ "hour. An interval can start or end or contain a specific hour, but not " #~ "more than once (this is by design, not a bug)" #~ msgstr "" #~ "Uživatel má k dispozici předepsané intervaly hodin za den.\n" #~ "Uvědomte si prosím, že den končí ve 24:00 a další den začíná v 0:00 " #~ "hodin. Proto může uživatel pracovat nepřetržitě i po půlnoci.\n" #~ "Také vezměte na vědomí, že v jedné hodině nelze nakonfigurovat více " #~ "intervalů. Interval může začínat nebo končit v určité hodině. Případně " #~ "může obsahovat určitou hodinu, ale ne více než jednou což je to záměr, " #~ "nikoli chyba." #~ msgid "" #~ "Remove selected interval from the list (do not forget to hit the " #~ "button)" #~ msgstr "" #~ "Odstranit vybraný interval ze seznamu (nezapomeňte stisknout tlačítko " #~ ")" #~ msgid "" #~ "Add specified hour interval to the list (do not forget to hit th e " #~ "button)" #~ msgstr "" #~ "Přidat zadaný hodinový interval do seznamu (nezapomeňte stisknout " #~ "tlačítko )" #~ msgid "" #~ "Timekpr-nExT log level. Please do not change this unless asked (you " #~ "likely won't find anything pretty in the log files)\n" #~ "1 - standard, 2 - debug, 3 - extra debug" #~ msgstr "" #~ "Úroveň protokolu Timekpr-nExT. Neměňte to, pokud to nebude požadováno " #~ "(pravděpodobně v souborech protokolu nenajdete nic hezkého)\n" #~ "1 - standard, 2 - ladit, 3 - ladit podrobněji" #~ msgid "" #~ "Specify session polling time granularity (at which interval user sessions " #~ "and activity are polled).\n" #~ "3 -5 seconds are optimal, don't change this if unsure." #~ msgstr "" #~ "Určit četnost mezi dotazováním relace (v jakém intervalu se budou " #~ "dotazovat uživatelské relace a aktivity).\n" #~ "Nejlepší nastavení je 3 - 5 sekund, neměňte nastavení pokud si nejste " #~ "jisti." #~ msgid "" #~ "Amount of seconds before terminating user sessions. After this is " #~ "reached, user will be terminated, nothing can be done to prevent it.\n" #~ "Adding time does not help in this case. Do that before reaching this " #~ "point..." #~ msgstr "" #~ "Počet sekund od ukončení po odhlášení uživatelské relace. Po dosažení " #~ "časového limitu začne odpočet, následně bude činnost uživatele ukončena, " #~ "odhlášení nelze zabránit.\n" #~ "Přidání času v tomto případě nepomůže. Čas přidejte před dosažením tohoto " #~ "bodu ..." #~ msgid "" #~ "List of users excluded from tracking.\n" #~ "Please specify actual usernames, not real names here (e.g please specify " #~ "jsmith, not John Smith)" #~ msgstr "" #~ "Seznam uživatelů vyloučených ze sledování.\n" #~ "Zde prosím zadejte uživatelská jména, nikoli skutečná jména \n" #~ "(např. uveďte novakj, ne Jan Novák)" #~ msgid "This shows time intervals that are available for Your use" #~ msgstr "Zobrazit časové intervaly, které jsou k dispozici pro použití" #~ msgid "TIme spent for this week" #~ msgstr "Čas využitý v tomto týdnu" #~ msgid "Time spent for this month" #~ msgstr "Čas využitý v tomto měsíci" #~ msgid "" #~ "This sets logging level (please do not change this unless You know what " #~ "You're doing)" #~ msgstr "" #~ "Zde nastavíte úroveň protokolování (prosím pokud nevíte co děláte, " #~ "neměňte nastavení)" #~ msgid "" #~ "==> set allowed hours per specified day or ALL for every day, example" #~ msgstr "" #~ "==> nastavit povolené hodiny na určený den nebo pro VŠECHNY dny, například" #~ msgid "" #~ "==> set time left for the user at current moment, example (add one hour)" #~ msgstr "" #~ "==> nastavit čas zbývající pro uživatele v aktuálním okamžiku, například " #~ "(přidat jednu hodinu)" #~ msgid "Continous time left to You which may span to more than a current day" #~ msgstr "" #~ "Zbývající nevyčerpaný čas, jeho délka může být delší než aktuální den" #~ msgid "Continous time left:" #~ msgstr "Zbývající nevyčerpaný čas:" #~ msgid "Hide tray icon is not passed" #~ msgstr "Ikona skrýt zásobník není předána" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct" #~ msgstr "Ikona skrytí panelu \"%%s\" není správná" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct and can not be set" #~ msgstr "Ikona skrytí panelu \"%%s\" není správná a nelze ji nastavit" #, python-format #~ msgid "User's \"%%s\" hide tray icon flag is not correct and can not be set" #~ msgstr "Příznak skrytí zásobníku \"%%s\" není správný a nelze jej nastavit" #~ msgid "" #~ "Continuous time left to user which may span to more than a current day " #~ "(realtime, available when user is logged in)" #~ msgstr "" #~ "Nepřetržitý čas zbývající uživateli, který může trvat déle než aktuální " #~ "den (reálný čas, k dispozici po přihlášení uživatele)" #~ msgid "" #~ "Select whether to show padlock icon and notifications to user.\n" #~ "Please note that this will disable showing all information and " #~ "notifications to the user!" #~ msgstr "" #~ "Vyberte, zda se má uživateli zobrazit ikona zámku a upozornění.\n" #~ "Upozorňujeme, že tím zakážete zobrazování všech informací a oznámení " #~ "uživateli!" timekpr-next/resource/locale/it/000775 001750 001750 00000000000 13476006650 020706 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/it/LC_MESSAGES/000775 001750 001750 00000000000 14017261747 022475 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/it/LC_MESSAGES/timekpr.mo000664 001750 001750 00000220467 14017261747 024520 0ustar00bezvfedubezvfedu000000 000000  Q$$ %$'%<L%*%%0%H%C&Q[&&K'5'* (7(+))%*$*u*]X+9+N+D?,8,,,K,"-L>- -(-u-3K.*..$././ 4/U/g/z/+//12)22 3*"3M3<j3333'3434)F4Yp4/4.40)50Z5259555.6?6.]6 66~9&=A= Y= c=@q=e=>.>#L>%p>*><>*>)?8??#?@@8@+K@ w@@,@ @@iAs BGBB!aC/CsC'EAEREZEuEFFF%F*G<9G!vG3G GGGH,H>H%I',I9TI I*I#IIJ* JKJZJ\sL LL M MMsTN N NN#N1 ORO(cO)O OOOOOPP*wMwawtw wwwDw*w))xSxhx|xxxx3x@yDy2Yy.yy y)yz"zBz^z)rz'zzy{"{{#{{B{#;|5_|*||||}}M-}R{}I}N~Hg~S~"'%@$f$' NA`M4?Ft3-?,]0B/:.2iD1A<U+=*$'6L#/'ׅ/A/.q-?Ά,6;Hr5.& 8G6/A.),X>+ĉ 5KScjx64M;(G3f;<֐8LNcv~Gȑ ˑ ّ")9Kev7 = JVW]ė+A /N~=Tј&j@eB5>t7/ߝ3CxОGI^c:Th%oE(/ޡC0.1C<ụ3RSV5(Lu3èM!1@S@թ>hF7355Q7[@\$o=Ҭ, :CG[q).8X0:µV*TM!UwD>\lAP/A3*G ^'h^.?+N5zQ'C*&nu.J,/,K\('I8fu,q W  ,*6W== )(RYr1-\'H! j /81jL[A>kSCI!kXuRT/L)$#N r1L <A]Y8<2o**FU#<($/M#})51 3%>?d(DH!.t.b?(P&y&Ue q0 >,\)E" --<[=<5/8eEMR2h7&2/3qn&^=LC3LO^7.0,H`}DM$0MU= 38'T|2/&&"( KKl)E3("\&v}[\z6Ne$f8;#<1R4 0d pcJUfP>XZ=L0 h} K G2 Nz j M4 X T ?0 [p ? 5 QB 4 E ;SKo?5OP4A ]M@=4*P_I4c/49T;W  #< T_ y@+l?$d!2:T6DE QSmM* 4Pdy     l c\qKp$Bg';wo2t#\c 2GL~uD"{1x+Zt.E9Xsi a'_&K aS?0%R5 POkMC!bIgnIl8MR<_eY!Ti T>NrEf/J(97`36Q +sYN*y`|=SzA4VF#U }mAG/WrWnzm|4)]h [L*]BQ(j<^Z ;X5H137k,0vbf: H{"O?CdF=8~U6j->,DJ[$lq ):dw%}@Vou.ve @x^h&Py-p%(n)s minute%(n)s minutes%(n)s second%(n)s seconds%(n)s second left%(n)s seconds left%(n)s second of PlayTime left%(n)s seconds of PlayTime left%(n)s user in total:%(n)s users in total:---=== NOTICE ===---==> get saved user list from the server, example==> get user configuration and time information from the server, example==> print help, example==> set PlayTime activity process masks, for which the time is accounted, example==> set PlayTime left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set PlayTime limits for all allowed days, the number of values must not exceed the allowed PlayTime allowed days for the user, example==> set allowed days for PlayTime activities, example==> set allowed days for the user, example==> set allowed hours for the specified day, or "ALL" for every day, optionally specify start and end minutes in brackets like this [x-y], additionally specify ! in front of hour if it doesn't have to be accounted (free time for user), example==> set restriction / lockout type ("lock" - lock session, "suspend" - suspend the computer, "suspendwake" - suspend and wake up, "terminate" - terminate sessions, "shutdown" - shutdown the computer), examples==> set time left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set time limit per month, example==> set time limit per week, example==> set time limits for all allowed days, the number of values must not exceed the allowed days for the user, example==> set whether PlayTime activities are allowed during unaccounted ("∞") intervals, example==> set whether PlayTime is enabled for the user, example==> set whether PlayTime must be accounted instead of normal activity, example==> set whether to hide tray icon and prevent notifications, example==> set whether to track inactive user sessions, exampleAboutAbout Timekpr-nExTActive PlayTime activity count (realtime, available when user is logged in)Activity / application listActual PlayTime available today (realtime, available when user is logged in)Add a user to the exclusion listAdd an excluded session type to the listAdd new PlayTime activity. Please specify activity mask and user friendly description in the activity list directly.Add new PlayTime notification threshold to the listAdd new notification threshold to the listAdd specified time (reward)Add tracked session type to the listAdditional PlayTime for user has been processedAdditional configurationAdditional configuration optionsAdditional limitsAdditional optionsAdditional statisticsAdditional time for user has been processedAllow PlayTime activities during unaccounted ("∞") time intervals for selected user. This setting allows the user to use applications configured in his PlayTime activity list during time intervals which are marked as unaccounted ("∞"). If this setting is enabled, the use of activities will not be accounted towards PlayTime limits, otherwise applications in PlayTime activity list will be terminated as soon as they are started during unaccounted ("∞") time intervals.Allow activities during unaccounted ("∞") time intervals. This setting allows to use applications listed in "Activity / application list" during time intervals which are marked as unaccounted ("∞"), if the setting is not enabled, none of activities are allowed to run!Allowance adjustmentsAllowed days for user have been processedAllowed during "∞" intervals:Allowed during "∞":Allowed hours for user have been processedApply PlayTime configurationApply PlayTime limits and configuration changes on this pageApply Timekpr-nExT settingsApply additional configuration changes on this pageApply all Timekpr-nExT settings at onceApply configurationApply daily limitsApply limit all changes made in this pageBrief information about time spent and everything related to time management for this dayChoose days to be adjusted for selected period.Choose hours to be adjusted for selected days.Choose hours to be adjusted for selected period.Choose minutes to be adjusted for selected days.Choose minutes to be adjusted for selected period.Choose this to adjust user's PlayTime allowance for todayChoose this to adjust user's time allowance for todayClose the windowCommand FAILED: access deniedCommand FAILED: communication was not acceptedConfigurationConfiguration for personalized notifications about available PlayTime. Please configure notifications as you see fit. The configuration "Time" value indicates a value of PlayTime left when notification will be shown, the "Importance" option governs an icon colour and notification properties as follows. Information - a green icon and an informational notification will be shown Warning - a yellow icon and an informational notification will be shown Severe - a red icon and important notification will be shown Critical - a red icon and critical notification will be shown, this notification usually is shown over all open applications and stays open until dismissed, however this behaviour highly depends on Desktop Environment in useConfiguration for personalized notifications about available time. Please configure notifications as you see fit. However, please keep in mind that there will be two types of notifications that cannot be personalized: a final warning some time before time ends and a countdown notifications when time is about to end. The configuration "Time" value indicates a value of time left when notification will be shown, the "Importance" option governs an icon colour and notification properties as follows. Information - a green icon and an informational notification will be shown Warning - a yellow icon and an informational notification will be shown Severe - a red icon and important notification will be shown Critical - a red icon and critical notification will be shown, this notification usually is shown over all open applications and stays open until dismissed, however this behaviour highly depends on Desktop Environment in useConfiguration for user %s:Configuration retrievedConnectedConnecting...Continuous time left to you. May span more than the current day.Continuous time left. May span more than the current day (realtime, available when user is logged in)Continuous time left:Control Timekpr-nExT SettingsControl Timekpr-nExT tracking itemsControl sessions types are not passedControl sessions types list is not correctControl sessions types list is not correct and cannot be setCopyright (c) 2018-2021 Eduards BezverhijsCountdown timeCreate a new time interval that will be available to the user. After creating the interval, please edit its start and end times directly in interval list.CriticalCritical notification timeout (sec)Current PlayTime statisticsCurrent effective usernameCurrent statisticsDaily limit configuration for all week daysDaily limitsDayDay time limits for user have been processedDays & LimitsDecrease daily PlayTime allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Decrease daily time allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Decrease weekly or monthly time allowance by selected time unit (days or hours or minutes) for the selected period.Delete the selected time interval from the available list of intervals.Eduards Bezverhijs (Translations fine-tuning by JP Lord ) (English fine-tuning by Phil Hudson )Enable PlayTime for selected userEnable PlayTime for the user has been processedEnable PlayTime override for selected user. This setting overrides time accounting in a way that time is accounted only when at least one of the applications on the PlayTime activity list are running! This affects only time accounting, intervals are still fully enforced! If no processes are running, time is accounted as idle thus effectively it's free time for user!Enable PlayTime override:Enable PlayTime:EnabledEnhanced activity monitor:Enter end hour for the automatic wakeup function. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Enter start hour for the automatic wakeup function. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Excluded SessionsExcluded UsersExcluded session types are not passedExcluded session types list is not correctExcluded session types list is not correct and cannot be setExcluded user list is not correctExcluded user list is not correct and cannot be setExcluded user list is not passedFailed to connectFeature "%%s", which is used to detect idle time, cannot be enabled! Idle / inactive time might not be accounted when screen is locked!Final notificationFinal notification time "%%s" is not correctFinal notification time "%%s" is not correct and cannot be setFinal notification time is not passedFinal warning time "%%s" is not correctFinal warning time "%%s" is not correct and cannot be setFinal warning time is not passedFormat: Format: FromHide icon and notifications:Hide tray icon for user has been processedHour intervalsHour intervals for selected day available to the user. Option "∞" indicates that time spent during this interval will not be accounted towards the daily limit, it will be accounted as idle instead. Please note that if the day's limit ends at 24:00 and the next day's limit starts at 00:00, then the user can work continuously past midnight. Please note that multiple intervals cannot be configured within the same hour. An interval can start or end or contain a specific hour, but not more than once. This is by design, not a bug. How long the user was inactive since last login (realtime, available when user is logged in)Icon initialization error (%%s)!Icon, isn't it?ImportanceIncrease daily PlayTime allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Increase daily time allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Increase weekly or monthly time allowance by selected time unit (days or hours or minutes) for the selected period.Info & TodayInformationInformation about PlayTimeInformation about time left / spentInternal connection error, please check log filesInterval removedInterval start cannot be the same as endInterval's start cannot be later than endIntervalsKeep control of computer usageLimitLimit configurationLimits & ConfigurationList of session types to be tracked. Please, do not change or experiment with this unless you actually (not wishfully) know what you are doing.List of sessions to be excluded from tracking. Please, do not change or experiment with this unless you actually (not wishfully) know what you are doing.List of usernames registered on the systemList of users excluded from tracking. Please specify actual usernames, not real names here. For example, "jsmith", not "John Smith".Lists day of the week and additional information about the day's PlayTime limit. Please enable / disable days for the user and set time allowance for PlayTime activities.Lists day of the week and additional information about the day's limit. Please enable / disable days for the user.Log levelLog level "%%s" is not correctLog level "%%s" is not correct and cannot be setLog level is not passedLogging levelMonthlyNotes, read carefully ;)Notification configurationNotification timeout (sec)NotificationsNumber of currently active PlayTime activitiesNumber of seconds left for user before enforcing a configured restriction / lockout to his sessions. After this is reached and user is still active, the user's sessions will be handled according to specified restriction / lockout, and almost nothing can be done to prevent it.Number of seconds left for user's available time before sending a final critical notification that time is about to run out. NOTE: the rest of the notification times are configurable per user by user in client application!PARAMETER PARSE ERROR (please check parameter validity): %%sPeriodPlayTimePlayTime activitiesPlayTime activities for user have been processedPlayTime allowed days for user have been processedPlayTime allowed during unaccounted intervals flag for the user has been processedPlayTime available today (saved stated, not real-time)PlayTime configurationPlayTime day limits for user have been processedPlayTime enabled:PlayTime enhanced activity monitor flag "%%s" is not correctPlayTime enhanced activity monitor flag "%%s" is not correct and cannot be setPlayTime enhanced activity monitor flag is not passedPlayTime flag "%%s" is not correctPlayTime flag "%%s" is not correct and cannot be setPlayTime flag is not passedPlayTime left (actual):PlayTime left (today):PlayTime limitsPlayTime notification configurationPlayTime optionsPlayTime override flag for the user has been processedPlayTime spent (today):PlayTime spent today (saved stated, not real-time)Please reopen the application if you are superuser and Timekpr-nExT is runningPlease select a day to set the limitsPlease select an hour interval to removePlease specify a list of full process (executable) names without path as case sensitive strings to be monitored in the system. It's possible to specify RegExp masks for processes too, but please be very careful about them as misusing this setting may lead to killing unwanted processes for the user! NOTE: RegExp is an expert setting!Poll intervalPoll time "%%s" is not correctPoll time "%%s" is not correct and cannot be setPoll time is not passedProcess descriptionProcess maskRemove PlayTime notification threshold from the listRemove a user from the exclusion listRemove an excluded session type from the listRemove excluded session typeRemove notification threshold from the listRemove selected entry from PlayTime activities.Remove tracked session type from the listRestoreRestore configuration from saved stateRestriction / lockout type for user has been processedRestriction / lockout type:Running activities (actual):Running activities:Save all changesSave timeSave time "%%s" is not correctSave time "%%s" is not correct and cannot be setSave time is not passedSelect a restriction / lockout type for the user. NOTE: please be very careful, think ahead and read every options description when changing this setting from default value!Select a time interval when computer can be woken up automatically. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether to show Timekpr-next's padlock icon and notifications to the user. Please note that unchecking this will disable showing all information and notifications to the user!Select whether to use sound "bell" (short notification sound) to announce a new notification from Timekpr-nExT. This works only for enabled notifications. If this setting is not editable, your environment does not advertise sound notification support.Select whether to use speech notifications, if available. You may be able to make speech notifications available by installing package "python3-espeak".Session polling time granularity which specifies how often user sessions and activity are checked and accounted. 3 - 5 seconds are optimal, don't change this if unsure.Session typeSet this specific time limitSettings for PlayTime activitiesSevereShow all notificationsShow limit changesShow seconds in notification areaSpecify the time in seconds when Timekpr-nExT starts continuous real-time countdown before enforcing a restriction / lockout to user's sessions.Specify whether to show a notification when limit configurations or allowance changesSpecify whether to show all notifications. If unchecked, then only important ones are shown.Specify whether to show seconds in notification area. Some desktop environments, like KDE5, do not support text besides notification icons.StartedStatus of Timekpr-nExT admin clientStatus of Timekpr-nExT clientSubtract specified time (penalty)Termination timeTermination time "%%s" is not correctTermination time "%%s" is not correct and cannot be setTermination time is not passedThat interval overlaps with an existing oneThat interval's end conflicts with an existing oneThat interval's start conflicts with an existing oneThat interval's start or end duplicates an existing oneThe command is incorrect:The number of hours to be adjusted for today's limitThe number of minutes to be adjusted for today's limitThe usage of Timekpr-nExT admin client is as follows:There is a problem communicating to Timekpr-nExT (%%s)!There is a problem connecting to Timekpr-nExT daemon (%%s)!These are days and limits that available to you as part of PlayTime activity restrictionsThese are the days and limits that are available to youThis is the configuration app for Timekpr-nExT. It allows you to set time limits for your individual users as well as general Timekpr-nExT options. To use this application, you either have to execute it as superuser or have to be part of the timekpr group. Please note that the "Timekpr-nExT Configuration" is available in superuser (administrator) mode only! Please configure carefully: do not lock yourself out!This lets you configure PlayTime limits.This lets you configure time limits.This option overrides the default time accounting. If it's checked, the time is accounted only when activities in "Activity / application list" are running, the rest of the time is considered idle.This sets how long a notification is shown for "Critical" notifications about time left (when the icon turns red). The value is specified in seconds. A value of 0 means show until dismissed. Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification.This sets how long a notification is shown for regular notifications about time left and configuration changes. The value is specified in seconds. A value of 0 means show until dismissed (not recommended for regular notifications). Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification.This sets the logging level. Please do not change this unless you know what you're doing.This setting controls whether PlayTime activity monitor will use process command line, including arguments, for monitoring processes (by default only uses the process name). When this setting is enabled Timekpr-nExT will perform a match against full command line up to 512 characters enabling enhanced process monitoring capabilities. Please be careful and double check your RegExp patterns in each individual user's PlayTime activity masks!This setting controls whether PlayTime functionality is enabled. This is a PlayTime master switch, if it's turned off, it's turned off for everyone regardless of individual settings!This shows activities / applications which are part of PlayTime restrictionsThis shows the time intervals that are available for use. Option "∞" indicates that time spent during this interval will not be accounted towards the daily limit, it will be accounted as idle instead.This specifies the rate in seconds at which actual user state is saved to disk. To improve performance and still have great accuracy, Timekpr-nExT accounts time in memory at "Poll interval" frequency, this setting defines a frequency at which user state is saved to disk for permanent storage.TimeTime allowance has changed, please note new time left!Time available today (saved stated, not real-time)Time inactive (actual):Time inactive this session or after Timekpr-nExT has been restartedTime inactive:Time left (actual):Time left (today):Time left today:Time left...Time limit (month):Time limit (week):Time limit configuration has changed, please note new configuration!Time limit for this month available to youTime limit for this week available to youTime limit override:Time spent (month):Time spent (session):Time spent (today):Time spent (week):Time spent this monthTime spent this month (saved stated, not real-time)Time spent this session or after Timekpr-nExT has been restartedTime spent this weekTime spent this week (saved stated, not real-time)Time spent today (saved stated, not real-time)Time spent today:Timekpr-nExTTimekpr-nExT Administration ConfigurationTimekpr-nExT ConfigurationTimekpr-nExT PlayTime notificationTimekpr-nExT administrationTimekpr-nExT clientTimekpr-nExT configuration has been savedTimekpr-nExT interface is not yet readyTimekpr-nExT log level. Please do not change this unless you have to. You likely won't find anything pretty in the log files. Values are: 1 - standard, 2 - debug, 3 - extra debugTimekpr-nExT notificationTimekpr-nExT related configurationToTotal PlayTime available left todayTotal PlayTime spent todayTotal time available left today in a row, up to the end of the dayTrack inactive "%%s" is not correctTrack inactive "%%s" is not correct and cannot be setTrack inactive for user has been processedTrack inactive is not passedTrack inactive sessions:Track inactive:Tracked SessionsUNEXPECTED ERROR: %%sUnexpected ERROR getting configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR getting user configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR getting user list. Please inspect Timekpr-nExT log filesUnexpected ERROR updating configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR updating control. Please inspect Timekpr-nExT log filesUnexpected ERROR while loading configuration. Please inspect Timekpr-nExT log filesUse sound "bell" for notificationsUse speech notificationsUser "%%s" configuration is not foundUser "%%s" control file is not foundUser "%%s" is not foundUser ConfigurationUser PlayTime limits have been savedUser additional options have been savedUser configuration retrievedUser time limits have been savedUser's "%%s" PlayTime allowed during unaccounted intervals flag is not correctUser's "%%s" PlayTime allowed during unaccounted intervals flag is not correct and cannot be setUser's "%%s" PlayTime allowed during unaccounted intervals flag is not passedUser's "%%s" PlayTime day limits list is not correctUser's "%%s" PlayTime day limits list is not correct and cannot be setUser's "%%s" PlayTime day limits list is not passedUser's "%%s" PlayTime day list is not correctUser's "%%s" PlayTime day list is not correct and cannot be setUser's "%%s" PlayTime day list is not passedUser's "%%s" PlayTime enable flag is not correctUser's "%%s" PlayTime enable flag is not correct and cannot be setUser's "%%s" PlayTime enable flag is not passedUser's "%%s" PlayTime operation can be one of these: - + =User's "%%s" PlayTime override flag is not correctUser's "%%s" PlayTime override flag is not correct and cannot be setUser's "%%s" PlayTime override flag is not passedUser's "%%s" PlayTime time limit is not correct and cannot be setUser's "%%s" allowed hours are not correct and cannot be setUser's "%%s" day limits list is not correctUser's "%%s" day limits list is not correct and cannot be setUser's "%%s" day limits list is not passedUser's "%%s" day list is not correctUser's "%%s" day list is not correct and cannot be setUser's "%%s" day list is not passedUser's "%%s" day number must be between 1 and 7User's "%%s" day number must be presentUser's "%%s" hide tray icon flag is not correctUser's "%%s" hide tray icon flag is not correct and cannot be setUser's "%%s" hide tray icon flag is not passedUser's "%%s" monthly allowance is not correctUser's "%%s" monthly allowance is not correct and cannot be setUser's "%%s" monthly allowance is not passedUser's "%%s" restriction / lockout type is not correctUser's "%%s" restriction / lockout type is not correct and cannot be setUser's "%%s" restriction / lockout type is not passedUser's "%%s" set PlayTime limit is not correctUser's "%%s" time limit is not correctUser's "%%s" time limit is not correct and cannot be setUser's "%%s" time operation can be one of these: - + =User's "%%s" track inactive flag is not correctUser's "%%s" track inactive flag is not correct and cannot be setUser's "%%s" track inactive flag is not passedUser's "%%s" weekly allowance is not correctUser's "%%s" weekly allowance is not correct and cannot be setUser's "%%s" weekly allowance is not passedUsernameUsername:Users related configurationVerify configured time intervals. This is a mandatory step to ensure that intervals are correct. Intervals which have problems will be highlighted.WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, but no displays are available, thus running in CLI...Wakeup hour interval:WarningWeek day limitsWeeklyWeekly and monthly limitsWeekly and monthly limits for the user. These limits are applied to user together with the rest of limit configuration.Weekly and monthly limits for user have been processedWhen time ends, computer screen will be locked. This option is not a restriction and is more suited for self control purposes.When time ends, computer will be shut down. This option is a restriction! Please evaluate whether you need this type of restriction!When time ends, computer will be suspended (put to sleep) and will be woken up at start of next available time interval for the user. This option is not a restriction and is more suited for self control purposes. When woken up when there is still no time left, computer screen will be locked and put to sleep again after some time.When time ends, computer will be suspended (put to sleep). This option is not a restriction and is more suited for self control purposes. When woken up when there is still no time left, computer screen will be locked and put to sleep again after some time.When time ends, user sessions will be terminated. This option is a restriction! This is the default option and most likely is the one you need!You have %(n)s hourYou have %(n)s hoursYour time is not limited todayYour time is up, you will be forcibly logged out inYour time is up, your computer will be forcibly shutdown inYour time is up, your computer will be forcibly suspended inYour time is up, your session will be forcibly locked indenter hour intervalsexecutable mask...from...hhours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)hrimportance...lock screenmminn/anumeric time values are in secondsprocess description...session type...shutdown computersuspend / wakeup computersuspend computerterminate sessionstime...timekpr-nextThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . In Debian, see file /usr/share/common-licenses/GPL-3to...today's timeusername...verifyweekdays are numbered according to ISO 8601 (i.e. Monday is the first day, format: 1-7)Project-Id-Version: Timekpr nExT Report-Msgid-Bugs-To: PO-Revision-Date: 2021-03-01 22:18+0200 Last-Translator: albano Language-Team: Albano Battistella Language: it_IT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2021-02-01 12:48+0000 X-Generator: Poedit 2.4.1 X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __:1,2 %(n)s minuto%(n)s minuti%(n)s secondo%(n)s secondi%(n)s secondo rimasto%(n)s secondi rimasto%(n)s secondo di Gioco rimanente%(n)s secondi di Gioco rimanente%(n)s utente in totale:%(n)s utenti in totale:---=== AVVISO ===---==> ottieni l'elenco degli utenti salvati dal server, esempio==> richiama la configurazione utente e le informazioni sull'ora dal server, esempio==> stampa aiuto, esempio==> imposta le maschere del processo di attività di Gioco, per le quali si tiene conto del tempo, esempio==> imposta il Tempo di Gioco a sinistra per l'utente al momento attuale: "+" (aggiungi tempo), "-" (sottrai tempo), "=" (imposta il tempo esatto disponibile), esempio (aggiungi un'ora)==> imposta i limiti di Gioco per tutti i giorni consentiti, il numero di valori non deve superare i giorni di Gioco consentiti per l'utente, esempio==> imposta i giorni consentiti per le attività di Gioco, esempio==> imposta i giorni consentiti per l'utente, esempio==> imposta le ore consentite per il giorno specificato, o "ALL" per ogni giorno, opzionalmente specifica i minuti di inizio e di fine tra parentesi come questa [x-y], inoltre specifica! davanti all'ora se non deve essere contabilizzato (tempo libero per l'utente), esempio==> imposta il tipo di restrizione / blocco ("lock" - blocca, "suspend" - sospendi, "suspendwake" - sospendi riattivazione, "terminate" - termina, "shutdown" - arresta), esempi==> imposta il tempo rimasto per l'utente allo stato attuale: "+" (aggiungi ora), "-" (sottrai ora), "=" (imposta l'ora esatta disponibile), esempio (aggiungi un'ora)==> imposta il limite di tempo per mese,esempio==> imposta il limite di tempo a settimana, esempio==> imposta i limiti di tempo per tutti i giorni consentiti, il numero di valori non deve superare i giorni consentiti per l'utente, esempio==> imposta se le attività per il Tempo di Gioco sono consentite durante intervalli non contabilizzati ("∞"), esempio==> imposta se il Tempo per il Gioco è abilitato per l'utente, esempio==> imposta se il Tempo per il Gioco deve essere considerato invece normale attività, esempio==> imposta se nascondere l'icona nella barra delle applicazioni ed impedire le notifiche, esempio==> imposta se tracciare sessioni utente inattive, esempioInformazioni suInformazioni su Timekpr-nExTConteggio attività Attive di Gioco(in tempo reale, disponibile quando l'utente ha effettuato l'accesso)Elenco attività / applicazioniTempo di GIoco effettivo disponibile oggi (in tempo reale, disponibile quando l'utente ha effettuato l'accesso)Aggiungi utente all'elenco di esclusioneAggiungi il tipo di sessione esclusa all'elencoAggiungi nuova attività di Gioco. Specificare direttamente la maschera dell'attività e una descrizione intuitiva nell'elenco delle attività.Aggiungi una nuova soglia di notifica del Tempo di Gioco all'elencoAggiungi una nuova soglia di notifica all'elencoAggiungi la quantità specificata (ricompensa)Aggiungi il tipo di sessione tracciato alla listaIl tempo di Gioco aggiuntivo per l'utente è stato elaboratoConfigurazione aggiuntivaStatistiche aggiuntiveLimiti aggiuntiviOpzioni aggiuntiveStatistiche aggiuntiveÈ stato elaborato un tempo aggiuntivo per l'utenteConsenti attività di Gioco durante intervalli di tempo non contabilizzati ("∞") per l'utente selezionato. Questa impostazione consente all'utente di utilizzare le applicazioni configurate nel proprio elenco di attività di Gioco durante gli intervalli di tempo contrassegnati come non contabilizzati ("∞"). Se questa impostazione è abilitata, l'utilizzo delle attività non verrà considerato ai fini dei limiti di Gioco, altrimenti le applicazioni nell'elenco delle attività di Gioco verranno terminate non appena vengono avviate durante intervalli di tempo("∞") non contabilizzati.Consenti attività durante intervalli di tempo ("∞") non contabilizzati. Questa impostazione consente di utilizzare le applicazioni elencate in "Elenco attività / applicazioni" durante gli intervalli di tempo contrassegnati come non contabilizzati ("∞"), se l'impostazione non è abilitata, nessuna delle attività può essere eseguita!Aggiustamenti consentitiI giorni consentiti per l'utente sono stati elaboratiConsentito durante gli "∞" intervalli:Consentito durante "∞":Le ore consentite per l'utente sono state elaborateApplica configurazione di GiocoApplica i limiti di Gioco e le modifiche alla configurazione in questa paginaApplica impostazioni Timekpr-nExTApplica ulteriori modifiche alla configurazione in questa paginaApplica tutte le impostazioni di Timekpr-nExT contemporaneamenteApplica configurazioneApplica limiti giornalieriApplica limite a tutte le modifiche apportate in questa paginaBrevi informazioni sul tempo trascorso e tutto ciò che riguarda la gestione del tempo per questo giornoScegli i giorni da regolare per il periodo selezionato.Scegli le ore da regolare per i giorni selezionati.Scegli le ore da regolare per il periodo selezionato.Scegli i minuti da regolare per i giorni selezionati.Scegli i minuti da regolare per il periodo selezionato.Scegli questa opzione per modificare la concessione del Tempo di Gioco dell'utente per oggiScegli questa opzione per regolare il tempo dell'utente per oggiChiudi la finestraComando NON RIUSCITO: accesso negatoComando NON RIUSCITO: la comunicazione non è stata accettataConfigurazioneConfigurazione per notifiche personalizzate sul Tempo di Gioco disponibile. Configura le notifiche come meglio credi. Il valore "Time" di configurazione indica un valore del Tempo di Gioco rimanente quando verrà mostrata la notifica, l'opzione "Importance" governa il colore di un'icona e le proprietà di notifica come segue. Informazioni: verranno visualizzate un'icona verde e una notifica informativa Avviso: verranno visualizzati un'icona gialla e una notifica informativa Grave: verranno mostrate un'icona rossa e una notifica importante Critico: verranno mostrate un'icona rossa e una notifica critica, questa notifica di solito viene mostrata su tutte le applicazioni aperte e rimane aperta fino a quando non viene chiusa, tuttavia questo comportamento dipende fortemente dall'ambiente desktop in usoConfigurazione per notifiche personalizzate sul tempo disponibile. Configura le notifiche come meglio credi. Tuttavia, tieni presente che ci saranno due tipi di notifiche che non possono essere personalizzate: un avviso finale qualche tempo prima che il tempo finisca e un conto alla rovescia quando il tempo sta per scadere. Il valore "Time" di configurazione indica un valore di tempo rimanente in cui verrà mostrata la notifica, l'opzione "Importance" regola il colore di un'icona e le proprietà di notifica come segue. Informazioni: verranno visualizzate un'icona verde e una notifica informativa Avviso: verranno visualizzati un'icona gialla e una notifica informativa Grave: verranno mostrate un'icona rossa e una notifica importante Critico: verranno mostrate un'icona rossa e una notifica critica, questa notifica di solito viene mostrata su tutte le applicazioni aperte e rimane aperta fino a quando non viene chiusa, tuttavia questo comportamento dipende fortemente dall'ambiente desktop in usoConfigurazione per l'utente %s:Configurazione recuperataConnessoConnessione in corso...Tempo continuo lasciato a te. Può estendersi più del giorno corrente.Tempo rimasto. Può estendersi più del giorno corrente (in tempo reale, disponibile quando l'utente è connesso)Tempo residuo rimanente:Controlla le impostazioni di Timekpr-nExTControllo degli elementi di tracciamento di Timekpr-nExTI tipi di sessioni di controllo non sono passatiL'elenco dei tipi di sessioni di controllo non è correttoL'elenco dei tipi di sessioni di controllo non è corretto e non può essere impostatoCopyright (c) 2018-2021 Eduards BezverhijsConto alla rovesciaCrea un nuovo intervallo di tempo che sarà disponibile per l'utente. Dopo aver creato l'intervallo, modificare i suoi orari di inizio e fine direttamente nell'elenco degli intervalli.CriticoTimeout di notifica critico (sec)Statistiche di Gioco correntiNome utente correnteStatistiche attualiConfigurazione limite giornaliero per tutti i giorni della settimanaLimiti giornalieriGiornoI limiti di tempo del giorno per l'utente sono stati elaboratiGiorni e limitiDiminuisci la concessione giornaliera del Tempo di Gioco in base all'unità di tempo selezionata (ore o minuti) per i giorni selezionati. Tieni presente che puoi selezionare più di un giorno per la regolazione!Riduci la concessione di tempo giornaliera in base all'unità di tempo selezionata (ore o minuti) per i giorni selezionati. Tieni presente che puoi selezionare più di un giorno per la regolazione!Diminuisce la concessione di tempo settimanale o mensile in base all'unità di tempo selezionata (giorni o ore o minuti) per il periodo selezionato.Elimina l'intervallo di tempo selezionato dall'elenco di intervalli disponibile.Eduards Bezverhijs (Translations fine-tuning by JP Lord ) (English fine-tuning by Phil Hudson ) (Italian fine-tuning by Abilita Tempo di Gioco per l'utente selezionatoL'abilitazione del Tempo di Gioco per l'utente è stata elaborataAbilita la sovrascrittura del Tempo di Gioco per l'utente selezionato. Questa impostazione sostituisce il conteggio del tempo in modo tale che il tempo venga conteggiato solo quando almeno una delle applicazioni nell'elenco delle attività di Gioco è in esecuzione! Ciò riguarda solo il conteggio del tempo, gli intervalli sono ancora pienamente applicati! Se nessun processo è in esecuzione, il tempo viene considerato inattivo, quindi è effettivamente tempo libero per l'utente!Abilita sovrascrittura del Tempo di Gioco:Abilita Tempo di GiocoAbilitatoMonitoraggio dell'attività migliorato:Immettere l'ora di fine per la funzione di riattivazione automatica. Tieni presente che questa opzione è efficace solo se la riattivazione tramite RealTime Clock è supportata e abilitata in BIOS / UEFI!Immettere l'ora di inizio per la funzione di riattivazione automatica. Tieni presente che questa opzione è efficace solo se la riattivazione tramite RealTime Clock è supportata e abilitata in BIOS / UEFI!Sessioni escluseUtenti esclusiI tipi di sessione esclusi non sono passatiL'elenco dei tipi di sessione esclusi non è correttoL'elenco dei tipi di sessione esclusi non è corretto e non può essere impostatoL'elenco utenti esclusi non è correttoL'elenco utenti esclusi non è corretto e non può essere impostatoL'elenco utenti esclusi non e' passatoConnessione fallitaLa funzione "%%s", utilizzata per rilevare i tempi di inattività, non può essere abilitata! Il tempo di inattività / inattivo potrebbe non essere preso in considerazione quando lo schermo è bloccato!Notifica finaleL'ora di notifica finale "%%s" non è correttaL'ora di notifica finale "%%s" non è corretta e non può essere impostataIl tempo di notifica finale non è trascorsoIl tempo di avviso finale "%%s" non è correttoIl tempo di avviso finale "%%s" non è corretto e non può essere impostatoIl tempo di avviso finale non è passatoFormato: Formato: DaNascondi icone e notifiche:L'icona Nascondi barra delle applicazioni per l'utente è stata elaborataIntervalli di oraIntervalli orari per il giorno selezionato disponibili per l'utente. L'opzione "∞" indica che il tempo trascorso durante questo intervallo non verrà conteggiato nel limite giornaliero, ma sarà invece considerato inattivo. Tieni presente che se il limite del giorno termina alle 24:00 e il limite del giorno successivo inizia alle 00:00, l'utente può lavorare ininterrottamente oltre la mezzanotte. Si noti che non è possibile configurare più intervalli nella stessa ora. Un intervallo può iniziare o finire o contenere un'ora specifica, ma non più di una volta. Questo è di progettazione, non un bug. Quanto tempo l'utente è stato inattivo dall'ultimo accesso (in tempo reale, disponibile quando l'utente è connesso)Errore di inizializzazione dell'icona (%%s)!Icona, non è vero?ImportanzaAumenta la concessione giornaliera del Tempo di Gioco in base all'unità di tempo selezionata (ore o minuti) per i giorni selezionati. Tieni presente che puoi selezionare più di un giorno per la regolazione!Aumenta la concessione di tempo giornaliera in base all'unità di tempo selezionata (ore o minuti) per i giorni selezionati. Tieni presente che puoi selezionare più di un giorno per la regolazione!Aumenta la concessione di tempo settimanale o mensile in base all'unità di tempo selezionata (giorni o ore o minuti) per il periodo selezionato.Informazioni & oggiInformazioniInformazioni sul Tempo di GiocoInformazioni sul tempo rimanente / trascorsoErrore di connessione interna, controllare i files logIntervallo rimossoL'inizio dell'intervallo non può essere lo stesso della fineL'inizio dell'intervallo non può essere successivo alla fineIntervalliMantieni il controllo del computer in usoLimiteLimite di configurazioneLimiti e configurazioneElenco dei tipi di sessione da monitorare. Per favore, non cambiarlo o sperimentarlo a meno che tu non sappia effettivamente (non desiderosamente) cosa stai facendo.Elenco delle sessioni da escludere dal monitoraggio. Per favore, non cambiarlo o sperimentarlo a meno che tu non sappia effettivamente (non desiderosamente) cosa stai facendo.Elenco dei nomi utente registrati nel sistemaElenco di utenti esclusi dal monitoraggio. Specifica qui i nomi utente effettivi, non i nomi reali. Ad esempio, "jsmith", non "John Smith".Elenca il giorno della settimana e ulteriori informazioni sul limite di Gioco del giorno. Abilita / disabilita i giorni per l'utente e imposta il tempo consentito per le attività di Gioco.Elenca il giorno della settimana e ulteriori informazioni sul limite del giorno. Si prega di abilitare / disabilitare i giorni per l'utente.Livello di logIl livello di log "%%s" non è correttoIl livello di registro "%%s" non è corretto e non può essere impostatoIl livello di log non è passatoLivello di registrazioneMensileNote, leggi attentamente;)Configurazione notificheTimeout notifica (sec)NotificheNumero di attività di Gioco attualmente attiveNumero di secondi rimasti per l'utente prima di applicare una restrizione / blocco configurato alle sue sessioni. Dopo che questo è stato raggiunto e l'utente è ancora attivo, le sessioni dell'utente verranno gestite in base alla restrizione / blocco specificati e quasi nulla può essere fatto per impedirlo.Numero di secondi rimanenti per il tempo disponibile dell'utente prima di inviare una notifica finale critica che il tempo sta per scadere. NOTA: il resto dei tempi di notifica sono configurabili utente per utente nell'applicazione client!ERRORE DI ANALISI DEI PARAMETRI (verificare la validità dei parametri): %%sPeriodoTempo di GiocoAttività di GiocoLe attività del Tempo di Gioco per l'utente sono state elaborateI giorni di Gioco consentiti per l'utente sono stati elaboratiIl flag del Tempo di Gioco consentito durante intervalli non contabilizzati per l'utente è stato elaboratoTempo di GIoco disponibile oggi (stato salvato, non in tempo reale)Configurazione Tempo di GiocoI limiti giornalieri del Tempo di Gioco per l'utente sono stati elaboratiTempo di Gioco abilitato:Il flag di monitoraggio dell'attività avanzata del Tempo di Gioco "%%s" non è correttoIl flag di monitoraggio delle attività avanzate del Tempo di Gioco "%%s" non è corretto e non può essere impostatoIl flag di monitoraggio delle attività avanzate del Tempo di Gioco non è passatoIl flag del Tempo di Gioco "%%s"non è correttoIl flag del Tempo di Gioco "%%s" non è corretto e non può essere impostatoIl flag del Tempo di Gioco non è passatoTempo di GIoco trascorso (attuale):Tempo di Gioco trascorso (oggi):Limiti di Tempo di GiocoConfigurazione delle notifiche del Tempo di GiocoOpzioni di GIocoIl flag di sovrascrizione del Tempo di Gioco per l'utente è stato elaboratoTempo di GIoco trascorso (oggi):Tempo di Gioco trascorso oggi (stato salvato, non in tempo reale)Si prega di riaprire l'applicazione se si è super-utente e Timekpr-nExT è in esecuzioneSi prega di selezionare un giorno per impostare i limitiSi prega di selezionare un intervallo di un'ora da rimuovereSpecificare un elenco di nomi di processi completi (eseguibili) senza percorso come stringhe con distinzione tra maiuscole e minuscole da monitorare nel sistema. È possibile specificare anche le maschere RegExp per i processi, ma si prega di fare molta attenzione in quanto l'uso improprio di questa impostazione può portare alla chiusura di processi indesiderati per l'utente! NOTA: RegExp è un'impostazione esperta!Verifica intervalloIl tempo di verifica "%%s" non è correttoIl tempo di verifica "%%s" non è corretto e non può essere impostatoIl tempo di verifica non è passatoDescrizione processoMaschera processoRimuovi la soglia di notifica del Tempo di Gioco dall'elencoRimuovi utente dall'elenco di esclusioneRimuovi il tipo di sessione esclusa dall'elencoRimuovi il tipo di sessione esclusaRimuovi la soglia di notifica dall'elencoRimuovi la voce selezionata dalle attività di Gioco.Rimuovi il tipo di sessione tracciato dall'elencoRipristinaRipristina una configurazione salvataIl tipo di restrizione / blocco per l'utente è stato elaboratoTipo di restrizione / blocco:Attività in corso (effettive):Attività in corso:Salva tutte le modificheRisparmia tempoRisparmio di tempo "%%s" non è correttoRisparmio di tempo "%%s" non è corretto e non può essere impostatoRisparmio di tempo non è passatoSeleziona un tipo di restrizione / blocco per l'utente. NOTA: si prega di fare molta attenzione, pensare in anticipo e leggere ogni descrizione delle opzioni quando si modifica questa impostazione dal valore predefinito!Selezionare un intervallo di tempo in cui il computer può essere riattivato automaticamente. Tieni presente che questa opzione è efficace solo se la riattivazione tramite RealTime Clock è supportata e abilitata in BIOS / UEFI!Seleziona se conteggiare il tempo della sessione inattiva. Se questa opzione è deselezionata, il tempo trascorso nelle sessioni di accesso della console (non dell'emulatore di terminale) e mentre lo schermo è bloccato NON viene preso in considerazione. Questo varia a seconda degli ambienti desktop.Seleziona se conteggiare il tempo della sessione inattiva. Se questa opzione è deselezionata, il tempo trascorso nelle sessioni di accesso della console (non dell'emulatore di terminale) e mentre lo schermo è bloccato NON viene preso in considerazione. Questo varia a seconda degli ambienti desktop.Se viene conteggiato il tempo per le sessioni inattive, se questo è deselezionato, il tempo trascorso in console (non nel terminale) e mentre lo schermo è bloccato, NON viene preso in considerazione (varia molto da DE a DE)Seleziona se mostrare l'icona del lucchetto di Timekpr-next e le notifiche all'utente. Tieni presente che deselezionando questa opzione verrà disabilitata la visualizzazione di tutte le informazioni e le notifiche all'utente!Seleziona se utilizzare il suono "campanello" (breve suono di notifica) per annunciare una nuova notifica da Timekpr-nExT. Funziona solo per le notifiche abilitate. Se questa impostazione non è modificabile, l'ambiente che usi non è in grado di supportare per le notifiche sonore.Seleziona se utilizzare le notifiche vocali, se disponibili. Potresti essere in grado di rendere disponibili le notifiche vocali installando il pacchetto "python3-espeak".Granularità del tempo di polling della sessione che specifica la frequenza con cui le sessioni e l'attività dell'utente vengono controllate e contabilizzate. 3-5 secondi sono ottimali, non cambiarlo se non sei sicuro.Tipo di sessioneImposta questo limite di tempo specificoImpostazioni per le attività di GiocoGraveMostra tutte le notificheMostra le modifiche ai limitiMostra i secondi nell'area di notificaSpecificare il tempo in secondi in cui Timekpr-nExT avvia il conto alla rovescia continuo in tempo reale prima di applicare una restrizione / blocco alle sessioni dell'utente.Se mostrare la notifica quando si modificano le configurazioni limite o la tolleranzaSpecifica se mostrare tutte le notifiche. Se deselezionato, vengono mostrati solo quelli importanti.Specificare se mostrare i secondi nell'area di notifica. Alcuni ambienti desktop, come KDE5, non supportano il testo oltre alle icone di notifica.AvviatoStato del client di amministrazione Timekpr-nExTStato del client Timekpr-nExTSottrai la quantità specificata (penalità)Tempo di termineIl tempo di termine "%%s" non è correttoIl tempo di termine "%%s" non è corretto e non può essere impostatoIl tempo di termine non è passatoL'intervallo si sovrappone a quello esistenteLa fine dell'intervallo è in conflitto con quella esistenteL'inizio dell'intervallo è in conflitto con quello esistenteL'intervallo di inizio o fine duplica l'intervallo esistenteIl comando non è corretto:La quantità di ore da regolare per il limite di oggiLa quantità di minuti da regolare per il limite di oggiL'utilizzo del client di amministrazione Timekpr-nExT è il seguente:Si è verificato un problema durante la comunicazione con Timekpr-nExT (%%s)!Si è verificato un problema durante il collegamento al daemon Timekpr-nExT (%%s)!Questi sono i giorni e i limiti a tua disposizione come parte delle limitazioni delle attività di GiocoQuesti sono giorni e limiti che sono a tua disposizioneQuesta è l'app di configurazione per Timekpr-nExT. Ti consente di impostare limiti di tempo per i tuoi utenti individuali e opzioni generali di Timekpr-nExT. Per usare questa applicazione, devi eseguirla come superutente o far parte del gruppo timekpr. Si noti che la "Configurazione Timekpr-nExT" è disponibile solo in modalità super-utente (amministratore)! Si prega di configurare con attenzione: non chiudetevi fuori!Ciò ti consente di configurare i limiti di Gioco.Ciò consente di configurare i limiti di tempo.Questa opzione sostituisce il conteggio del tempo predefinito. Se è selezionato, il tempo viene conteggiato solo quando le attività in "Elenco attività / applicazioni" sono in esecuzione, il resto del tempo è considerato inattivo.Imposta la durata di visualizzazione di una notifica per le notifiche "critiche" sul tempo rimanente (quando l'icona diventa rossa). Il valore è specificato in secondi. Un valore di 0 significa mostrare fino a quando non viene ignorato. Tieni presente che l'ambiente desktop che utilizzi potrebbe ignorare questo timeout, nel qual caso questa impostazione non avrà alcun effetto sulla notifica.Imposta la durata di visualizzazione di una notifica per le notifiche regolari sul tempo rimanente e sulle modifiche alla configurazione. Il valore è specificato in secondi. Un valore di 0 significa mostrare fino a quando non viene ignorato (non consigliato per le notifiche regolari). Tieni presente che l'ambiente desktop che utilizzi potrebbe ignorare questo timeout, nel qual caso questa impostazione non avrà alcun effetto sulla notifica.Questo imposta il livello di registrazione. Per favore non cambiarlo a meno che tu non sappia cosa stai facendo.Questa impostazione controlla se il monitor dell'attività di Gioco utilizzerà la riga di comando del processo, inclusi gli argomenti, per il monitoraggio dei processi (per impostazione predefinita utilizza solo il nome del processo). Quando questa impostazione è abilitata, Timekpr-nExT eseguirà una corrispondenza con la riga di comando completa fino a 512 caratteri, consentendo funzionalità avanzate di monitoraggio del processo. Fai attenzione e ricontrolla i tuoi schemi RegExp nelle maschere di attività di Gioco di ogni singolo utente!Questa impostazione controlla se la funzionalità di Gioco è abilitata. Questo è un interruttore principale del Tempo di Gioco, se è spento, è spento per tutti indipendentemente dalle impostazioni individuali!Questo mostra le attività / applicazioni che fanno parte delle restrizioni del Tempo di GiocoQuesto mostra gli intervalli di tempo disponibili per l'uso. L'opzione "∞" indica che il tempo trascorso durante questo intervallo non verrà conteggiato nel limite giornaliero, ma sarà invece considerato inattivo.Specifica la frequenza in secondi alla quale lo stato utente effettivo viene salvato su disco. Per migliorare le prestazioni e avere ancora una maggiore precisione, Timekpr-nExT tiene conto del tempo in memoria della frequenza di "Intervallo di polling", questa impostazione definisce una frequenza alla quale lo stato dell'utente viene salvato su disco per l'archiviazione permanente.OrarioIl permesso di tempo è cambiato, si prega di notare il nuovo tempo rimasto!Tempo disponibile oggi (risparmiato dichiarato, non in tempo reale)Tempo inattivo (effettivo):Tempo inattivo in questa sessione o dopo che Timekpr-nExT è stato riavviatoTempo inattivo:Tempo rimasto (effettivo):Tempo rimasto (oggi):Tempo rimasto oggi:Tempo rimasto...Limite di tempo (mese):Limite di tempo (settimana):La configurazione del limite di tempo è cambiata, si prega di notare la nuova configurazione!Limite di tempo per il mese a tua disposizioneLimite di tempo per settimana disponibile per teLimite di tempo oltrepassato:Tempo trascorso (mese):Tempo trascorso (sessione):Tempo trascorso (oggi):Tempo trascorso (settimana):Tempo trascorso per questo meseTempo trascorso questo mese (salvato dichiarato, non in tempo reale)Tempo trascorso in questa sessione o dopo che Timekpr-nExT è stato riavviatoTempo trascorso per questa settimanaTempo trascorso per questa settimana (salvato dichiarato, non in tempo reale)Tempo trascorso oggi (salvato dichiarato, non in tempo reale)Tempo trascorso oggi:Timekpr-nExTConfigurazione dell'amministrazione di Timekpr-nExTConfigurazione Timekpr-nExTNotifica Tempo di Gioco di Timekpr-nExTAmministrazione di Timekpr-nExTClient Timekpr-nExTLa configurazione di Timekpr-nExT è stata salvataL'interfaccia Timekpr-nExT non è ancora prontaLivello di log Timekpr-nExT. Si prega di non modificarlo a meno che non sia necessario. Probabilmente non troverai nulla di carino nei file di registro. I valori sono: 1 - standard, 2 - debug, 3 - extra debugNotifica di Timekpr-nExTConfigurazione relativa a Timekpr-nExTATempo di Gioco totale rimasto oggiTempo di gioco totale speso oggiTempo totale disponibile rimasto in una riga, fino alla fine della giornataLa traccia inattiva "%%s" non è correttaLa traccia inattiva "%%s" non è corretta e non può essere impostataLa traccia inattiva per l'utente è stata elaborataLa traccia inattiva non è passataTieni traccia delle sessioni inattive:Traccia inattiva:Sessioni monitorateERRORE INASPETTATO: %%sERRORE imprevisto durante il recupero della configurazione. Si prega di controllare i file di registro di Timekpr-nExTERRORE imprevisto durante il recupero della configurazione utente. Si prega di controllare i file di registro di Timekpr-nExTERRORE inaspettato per ottenere l'elenco degli utenti. Controlla i files log di Timekpr-nExTERRORE imprevisto durante l'aggiornamento della configurazione. Si prega di controllare i file di registro di Timekpr-nExTERRORE inatteso durante l'aggiornamento. Controlla i files log di Timekpr-nExTERRORE inaspettato durante il caricamento della configurazione. Controlla i files log di Timekpr-nExTUsa il suono "beep" per le notificheUsa le notifiche vocaliLa configurazione dell'utente "%%s" non è stata trovataIl file di controllo dell'utente "%%s" non è stato trovatoL'utente "%%s" non è stato trovatoConfigurazione utenteI limiti di GIoco dell' utente sono stati salvatiLe opzioni aggiuntive dell'utente sono state salvateConfigurazione utente recuperataI limiti di tempo dell'utente sono stati salvatiIl tempo di Gioco "%%s" consentito dell'utente durante gli intervalli non registrati non è correttoIl tempo di Gioco "%%s" consentito dell'utente durante gli intervalli non registrati non è corretto e non può essere impostatoIl tempo di Gioco "%%s" consentito dell'utente durante gli intervalli non registrati non è passatoL'elenco dei limiti giornalieri di Gioco "%%s" dell'utente non è correttoL'elenco dei limiti giornalieri di Gioco "%%s" dell'utente non è corretto e non può essere impostatoL'elenco dei limiti giornalieri di Gioco "%%s" dell'utente non è stato superatoL'elenco dei giorni di Gioco dell'utente "%%s" non è correttoL'elenco dei giorni di Gioco dell'utente "%%s" non è corretto e non può essere impostatoL'elenco dei giorni di Gioco dell'utente "%%s" non è passatoIl flag di abilitazione del Tempo di Gioco "%%s" dell'utente non è correttoIl flag di abilitazione del Tempo di Gioco "%%s" dell'utente non è corretto e non può essere impostatoIl flag di abilitazione del Tempo di Gioco "%%s" dell'utente non è passatoL'operazione di Gioco dell'utente "%%s"può essere una di queste: - + =Il flag di sovrascrizione del Tempo di Gioco dell'utente "%%s" non è correttoIl flag di sovrascrizione del Tempo di Gioco dell'utente "%%s" non è corretto e non può essere impostatoIl flag di sovrascrizione del Tempo di Gioco dell'utente "%%s" non è passatoIl limite di tempo di Gioco dell'utente"%%s" non è corretto e non può essere impostatoLe ore "%%s" consentite dall'utente non sono corrette e non possono essere impostateL'elenco dei limiti di giorno "%%s" dell'utente non è correttoL'elenco dei limiti di giorno "%%s" dell'utente non è corretto e non può essere impostatoL'elenco dei limiti del giorno "%%s" dell'utente non è passatoL'elenco dei giorni "%%s" dell'utente non è correttoL'elenco dei giorni "%%s" dell'utente non è corretto e non può essere impostatoL'elenco dei giorni "%%s" dell'utente non è passatoIl numero del giorno "%%s" dell'utente deve essere compreso tra 1 e 7Il numero del giorno "%%s" dell'utente deve essere presenteIl flag dell'icona "%%s" della barra delle applicazioni dell'utente non è correttoIl flag dell'icona della barra delle applicazioni "%%s" dell'utente non è corretto e non può essere impostatoIl flag dell'icona "%%s" nascosta dell'utente non viene passatoIl permesso mensile dell'utente "%%s" non è correttoIl permesso mensile dell'utente "%%s"non è corretto e non può essere impostatoIl permesso mensile dell'utente "%%s" non e' passatoIl tipo di restrizione / blocco "%%s" dell'utente non è correttoIl tipo di restrizione / blocco dell'utente "%%s" non è corretto e non può essere impostatoIl tipo di restrizione / blocco dell'utente "%%s" non è passatoIl limite di Gioco impostato dall'utente "%%s"non è correttoIl limite di tempo "%%s" dell'utente non è correttoIl limite di tempo "%%s" dell'utente non è corretto e non può essere impostatoL'operazione temporale "%%s" dell'utente può essere una di queste: - + =La traccia inattiva dell'utente "%%s"non e' passataIl contrassegno inattivo della traccia dell'utente"%%s" non è corretto e non può essere impostatoLa traccia inattiva dell'utente "%%s"non e' passataIl permesso settimanale dell'utente "%%s" non è correttoIl permesso settimanale dell'utente"%%s" non è corretto e non può essere impostatoIl permesso settimanale dell'utente"%%s" non viene superatoNome utenteNome utente:Configurazione relativa agli utentiVerifica gli intervalli di tempo configurati. Questo è un passaggio obbligatorio per garantire che gli intervalli siano corretti. Verranno evidenziati gli intervalli che presentano problemi.ATTENZIONE: l'utilità di amministrazione di Timekpr-nExT è stata chiesta di eseguirla in modalità GUI, ma non sono disponibili display, quindi in esecuzione in CLI ...Intervallo ora sveglia:AttenzioneLimiti dei giorni ferialiSettimanaleLimiti settimanali e mensiliLimiti settimanali e mensili per l'utente. Questi limiti vengono applicati all'utente insieme al resto della configurazione dei limiti.I limiti settimanali e mensili per l'utente sono stati elaboratiAllo scadere del tempo, lo schermo del computer verrà bloccato. Questa opzione non è una restrizione ed è più adatta per scopi di autocontrollo.Allo scadere del tempo, il computer verrà spento. Questa opzione è una restrizione! Valuta se hai bisogno di questo tipo di restrizione!Allo scadere del tempo, il computer verrà sospeso (messo in stato di stop) e verrà riattivato all'inizio del successivo intervallo di tempo disponibile per l'utente. Questa opzione non è una restrizione ed è più adatta per scopi di autocontrollo. Se viene riattivato quando non c'è ancora tempo, lo schermo del computer verrà bloccato e dopo un po 'di tempo verrà messo di nuovo in sospensione.Allo scadere del tempo, il computer verrà sospeso (messo in stato di sleep mode). Questa opzione non è una restrizione ed è più adatta per scopi di autocontrollo. Se viene riattivato quando non c'è ancora tempo, lo schermo del computer verrà bloccato e dopo un po 'di tempo verrà messo di nuovo in sospensione.Allo scadere del tempo, le sessioni utente verranno terminate. Questa opzione è una restrizione! Questa è l'opzione predefinita e molto probabilmente è quella che ti serve!Hai %(n)s oraHai %(n)s oreIl tuo tempo non è limitato oggiIl tuo tempo è scaduto, Sarai forzatamente disconnesso inIl tuo tempo è scaduto, il tuo computer verrà spentoIl tuo tempo è scaduto, il tuo computer verrà sospeso forzatamenteIl tuo tempo è scaduto, la tua sessione verrà bloccata forzatamenteginserire intervalli orarimaschera eseguibile...da...hle ore sono numerate secondo ISO 8601 (ad es. orologio 24 ore, formato: 0-23)oreimpoartanza...blocca schermomminutin/ai valori numerici di tempo sono in secondidescrizione del processo...tipo di sessione...arresto del computersospendi / riattiva computerSospensione del computertermina sessioniOrario...Questo programma è software libero: è possibile ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License così come pubblicata dalla Free Software Foundation, sia la versione 3 della licenza, o (a propria scelta) una versione successiva. Questo programma è distribuito nella speranza che possa essere utile, ma SENZA ALCUNA GARANZIA, nemmeno la garanzia implicita di COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO. Vedere la GNU General Public License per ulteriori dettagli. Dovreste aver ricevuto una copia della GNU General Public License insieme a questo programma. In caso contrario, vedere . In Debian, vedere file / usr/share/common-licenses/GPL-3a...il tempo di ogginome utente...verificai giorni della settimana sono numerati secondo ISO 8601 (ovvero il lunedì è il primo giorno, formato: 1-7)timekpr-next/resource/locale/it/LC_MESSAGES/timekpr.po000664 001750 001750 00000356164 14017261747 024527 0ustar00bezvfedubezvfedu000000 000000 msgid "" msgstr "" "Project-Id-Version: Timekpr nExT\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-03-01 22:11+0200\n" "PO-Revision-Date: 2021-03-01 22:18+0200\n" "Last-Translator: albano \n" "Language-Team: Albano Battistella \n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2021-02-01 12:48+0000\n" "X-Generator: Poedit 2.4.1\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __:1,2\n" #: common/constants/messages.py:31 msgid "==> print help, example" msgstr "==> stampa aiuto, esempio" #: common/constants/messages.py:32 msgid "==> get saved user list from the server, example" msgstr "==> ottieni l'elenco degli utenti salvati dal server, esempio" #: common/constants/messages.py:33 msgid "" "==> get user configuration and time information from the server, example" msgstr "" "==> richiama la configurazione utente e le informazioni sull'ora dal server, " "esempio" #: common/constants/messages.py:34 msgid "==> set allowed days for the user, example" msgstr "==> imposta i giorni consentiti per l'utente, esempio" #. TRANSLATORS: please DO NOT translate the keyword "ALL" #: common/constants/messages.py:36 msgid "" "==> set allowed hours for the specified day, or \"ALL\" for every day, " "optionally specify start and end minutes in brackets like this [x-y], " "additionally specify ! in front of hour if it doesn't have to be accounted " "(free time for user), example" msgstr "" "==> imposta le ore consentite per il giorno specificato, o \"ALL\" per ogni " "giorno, opzionalmente specifica i minuti di inizio e di fine tra parentesi " "come questa [x-y], inoltre specifica! davanti all'ora se non deve essere " "contabilizzato (tempo libero per l'utente), esempio" #: common/constants/messages.py:37 msgid "" "==> set time limits for all allowed days, the number of values must not " "exceed the allowed days for the user, example" msgstr "" "==> imposta i limiti di tempo per tutti i giorni consentiti, il numero di " "valori non deve superare i giorni consentiti per l'utente, esempio" #: common/constants/messages.py:38 msgid "==> set time limit per week, example" msgstr "==> imposta il limite di tempo a settimana, esempio" #: common/constants/messages.py:39 msgid "==> set time limit per month, example" msgstr "==> imposta il limite di tempo per mese,esempio" #: common/constants/messages.py:40 msgid "==> set whether to track inactive user sessions, example" msgstr "==> imposta se tracciare sessioni utente inattive, esempio" #: common/constants/messages.py:41 msgid "==> set whether to hide tray icon and prevent notifications, example" msgstr "" "==> imposta se nascondere l'icona nella barra delle applicazioni ed " "impedire le notifiche, esempio" #. TRANSLATORS: please DO NOT translate the keywords: "lock", "suspend", "suspendwake", "terminate", "shutdown" #: common/constants/messages.py:43 msgid "" "==> set restriction / lockout type (\"lock\" - lock session, \"suspend\" - " "suspend the computer, \"suspendwake\" - suspend and wake up, \"terminate\" - " "terminate sessions, \"shutdown\" - shutdown the computer), examples" msgstr "" "==> imposta il tipo di restrizione / blocco (\"lock\" - blocca, \"suspend\" " "- sospendi, \"suspendwake\" - sospendi riattivazione, \"terminate\" - " "termina, \"shutdown\" - arresta), esempi" #: common/constants/messages.py:44 msgid "" "==> set time left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> imposta il tempo rimasto per l'utente allo stato attuale: \"+" "\" (aggiungi ora), \"-\" (sottrai ora), \"=\" (imposta l'ora esatta " "disponibile), esempio (aggiungi un'ora)" #: common/constants/messages.py:45 msgid "==> set whether PlayTime is enabled for the user, example" msgstr "==> imposta se il Tempo per il Gioco è abilitato per l'utente, esempio" #: common/constants/messages.py:46 msgid "" "==> set whether PlayTime must be accounted instead of normal activity, " "example" msgstr "" "==> imposta se il Tempo per il Gioco deve essere considerato invece normale " "attività, esempio" #: common/constants/messages.py:47 msgid "" "==> set whether PlayTime activities are allowed during unaccounted (\"∞\") " "intervals, example" msgstr "" "==> imposta se le attività per il Tempo di Gioco sono consentite durante " "intervalli non contabilizzati (\"∞\"), esempio" #: common/constants/messages.py:48 msgid "==> set allowed days for PlayTime activities, example" msgstr "==> imposta i giorni consentiti per le attività di Gioco, esempio" #: common/constants/messages.py:49 msgid "" "==> set PlayTime limits for all allowed days, the number of values must not " "exceed the allowed PlayTime allowed days for the user, example" msgstr "" "==> imposta i limiti di Gioco per tutti i giorni consentiti, il numero di " "valori non deve superare i giorni di Gioco consentiti per l'utente, esempio" #: common/constants/messages.py:50 msgid "" "==> set PlayTime activity process masks, for which the time is accounted, " "example" msgstr "" "==> imposta le maschere del processo di attività di Gioco, per le quali si " "tiene conto del tempo, esempio" #: common/constants/messages.py:51 msgid "" "==> set PlayTime left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> imposta il Tempo di Gioco a sinistra per l'utente al momento attuale: \"+" "\" (aggiungi tempo), \"-\" (sottrai tempo), \"=\" (imposta il tempo esatto " "disponibile), esempio (aggiungi un'ora)" #: common/constants/messages.py:54 msgid "Control sessions types are not passed" msgstr "I tipi di sessioni di controllo non sono passati" #: common/constants/messages.py:55 msgid "Control sessions types list is not correct" msgstr "L'elenco dei tipi di sessioni di controllo non è corretto" #: common/constants/messages.py:56 msgid "Control sessions types list is not correct and cannot be set" msgstr "" "L'elenco dei tipi di sessioni di controllo non è corretto e non può essere " "impostato" #: common/constants/messages.py:57 msgid "Excluded session types are not passed" msgstr "I tipi di sessione esclusi non sono passati" #: common/constants/messages.py:58 msgid "Excluded session types list is not correct" msgstr "L'elenco dei tipi di sessione esclusi non è corretto" #: common/constants/messages.py:59 msgid "Excluded session types list is not correct and cannot be set" msgstr "" "L'elenco dei tipi di sessione esclusi non è corretto e non può essere " "impostato" #: common/constants/messages.py:60 msgid "Excluded user list is not passed" msgstr "L'elenco utenti esclusi non e' passato" #: common/constants/messages.py:61 msgid "Excluded user list is not correct" msgstr "L'elenco utenti esclusi non è corretto" #: common/constants/messages.py:62 msgid "Excluded user list is not correct and cannot be set" msgstr "L'elenco utenti esclusi non è corretto e non può essere impostato" #: common/constants/messages.py:63 msgid "Final warning time is not passed" msgstr "Il tempo di avviso finale non è passato" #: common/constants/messages.py:64 #, python-format msgid "Final warning time \"%%s\" is not correct" msgstr "Il tempo di avviso finale \"%%s\" non è corretto" #: common/constants/messages.py:65 #, python-format msgid "Final warning time \"%%s\" is not correct and cannot be set" msgstr "" "Il tempo di avviso finale \"%%s\" non è corretto e non può essere impostato" #: common/constants/messages.py:66 msgid "Final notification time is not passed" msgstr "Il tempo di notifica finale non è trascorso" #: common/constants/messages.py:67 #, python-format msgid "Final notification time \"%%s\" is not correct" msgstr "L'ora di notifica finale \"%%s\" non è corretta" #: common/constants/messages.py:68 #, python-format msgid "Final notification time \"%%s\" is not correct and cannot be set" msgstr "" "L'ora di notifica finale \"%%s\" non è corretta e non può essere impostata" #: common/constants/messages.py:69 msgid "Termination time is not passed" msgstr "Il tempo di termine non è passato" #: common/constants/messages.py:70 #, python-format msgid "Termination time \"%%s\" is not correct" msgstr "Il tempo di termine \"%%s\" non è corretto" #: common/constants/messages.py:71 #, python-format msgid "Termination time \"%%s\" is not correct and cannot be set" msgstr "Il tempo di termine \"%%s\" non è corretto e non può essere impostato" #: common/constants/messages.py:72 msgid "Track inactive is not passed" msgstr "La traccia inattiva non è passata" #: common/constants/messages.py:73 #, python-format msgid "Track inactive \"%%s\" is not correct" msgstr "La traccia inattiva \"%%s\" non è corretta" #: common/constants/messages.py:74 #, python-format msgid "Track inactive \"%%s\" is not correct and cannot be set" msgstr "La traccia inattiva \"%%s\" non è corretta e non può essere impostata" #: common/constants/messages.py:75 msgid "Log level is not passed" msgstr "Il livello di log non è passato" #: common/constants/messages.py:76 #, python-format msgid "Log level \"%%s\" is not correct" msgstr "Il livello di log \"%%s\" non è corretto" #: common/constants/messages.py:77 #, python-format msgid "Log level \"%%s\" is not correct and cannot be set" msgstr "" "Il livello di registro \"%%s\" non è corretto e non può essere impostato" #: common/constants/messages.py:78 msgid "Poll time is not passed" msgstr "Il tempo di verifica non è passato" #: common/constants/messages.py:79 #, python-format msgid "Poll time \"%%s\" is not correct" msgstr "Il tempo di verifica \"%%s\" non è corretto" #: common/constants/messages.py:80 #, python-format msgid "Poll time \"%%s\" is not correct and cannot be set" msgstr "Il tempo di verifica \"%%s\" non è corretto e non può essere impostato" #: common/constants/messages.py:81 msgid "Save time is not passed" msgstr "Risparmio di tempo non è passato" #: common/constants/messages.py:82 #, python-format msgid "Save time \"%%s\" is not correct" msgstr "Risparmio di tempo \"%%s\" non è corretto" #: common/constants/messages.py:83 #, python-format msgid "Save time \"%%s\" is not correct and cannot be set" msgstr "Risparmio di tempo \"%%s\" non è corretto e non può essere impostato" #: common/constants/messages.py:84 msgid "PlayTime flag is not passed" msgstr "Il flag del Tempo di Gioco non è passato" #: common/constants/messages.py:85 #, python-format msgid "PlayTime flag \"%%s\" is not correct" msgstr "Il flag del Tempo di Gioco \"%%s\"non è corretto" #: common/constants/messages.py:86 #, python-format msgid "PlayTime flag \"%%s\" is not correct and cannot be set" msgstr "" "Il flag del Tempo di Gioco \"%%s\" non è corretto e non può essere impostato" #: common/constants/messages.py:87 msgid "PlayTime enhanced activity monitor flag is not passed" msgstr "" "Il flag di monitoraggio delle attività avanzate del Tempo di Gioco non è " "passato" #: common/constants/messages.py:88 #, python-format msgid "PlayTime enhanced activity monitor flag \"%%s\" is not correct" msgstr "" "Il flag di monitoraggio dell'attività avanzata del Tempo di Gioco \"%%s\" " "non è corretto" #: common/constants/messages.py:89 #, python-format msgid "" "PlayTime enhanced activity monitor flag \"%%s\" is not correct and cannot be " "set" msgstr "" "Il flag di monitoraggio delle attività avanzate del Tempo di Gioco \"%%s\" " "non è corretto e non può essere impostato" #: common/constants/messages.py:92 #, python-format msgid "User's \"%%s\" day number must be present" msgstr "Il numero del giorno \"%%s\" dell'utente deve essere presente" #: common/constants/messages.py:93 #, python-format msgid "User's \"%%s\" day number must be between 1 and 7" msgstr "" "Il numero del giorno \"%%s\" dell'utente deve essere compreso tra 1 e 7" #: common/constants/messages.py:94 #, python-format msgid "User's \"%%s\" allowed hours are not correct and cannot be set" msgstr "" "Le ore \"%%s\" consentite dall'utente non sono corrette e non possono essere " "impostate" #: common/constants/messages.py:95 #, python-format msgid "User's \"%%s\" day list is not passed" msgstr "L'elenco dei giorni \"%%s\" dell'utente non è passato" #: common/constants/messages.py:96 #, python-format msgid "User's \"%%s\" day list is not correct" msgstr "L'elenco dei giorni \"%%s\" dell'utente non è corretto" #: common/constants/messages.py:97 #, python-format msgid "User's \"%%s\" day list is not correct and cannot be set" msgstr "" "L'elenco dei giorni \"%%s\" dell'utente non è corretto e non può essere " "impostato" #: common/constants/messages.py:98 #, python-format msgid "User's \"%%s\" day limits list is not passed" msgstr "L'elenco dei limiti del giorno \"%%s\" dell'utente non è passato" #: common/constants/messages.py:99 #, python-format msgid "User's \"%%s\" day limits list is not correct" msgstr "L'elenco dei limiti di giorno \"%%s\" dell'utente non è corretto" #: common/constants/messages.py:100 #, python-format msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgstr "" "L'elenco dei limiti di giorno \"%%s\" dell'utente non è corretto e non può " "essere impostato" #: common/constants/messages.py:101 #, python-format msgid "User's \"%%s\" time operation can be one of these: - + =" msgstr "" "L'operazione temporale \"%%s\" dell'utente può essere una di queste: - + =" #: common/constants/messages.py:102 #, python-format msgid "User's \"%%s\" time limit is not correct" msgstr "Il limite di tempo \"%%s\" dell'utente non è corretto" #: common/constants/messages.py:103 #, python-format msgid "User's \"%%s\" time limit is not correct and cannot be set" msgstr "" "Il limite di tempo \"%%s\" dell'utente non è corretto e non può essere " "impostato" #: common/constants/messages.py:104 #, python-format msgid "User's \"%%s\" monthly allowance is not passed" msgstr "Il permesso mensile dell'utente \"%%s\" non e' passato" #: common/constants/messages.py:105 #, python-format msgid "User's \"%%s\" monthly allowance is not correct" msgstr "Il permesso mensile dell'utente \"%%s\" non è corretto" #: common/constants/messages.py:106 #, python-format msgid "User's \"%%s\" monthly allowance is not correct and cannot be set" msgstr "" "Il permesso mensile dell'utente \"%%s\"non è corretto e non può essere " "impostato" #: common/constants/messages.py:107 #, python-format msgid "User's \"%%s\" track inactive flag is not passed" msgstr "La traccia inattiva dell'utente \"%%s\"non e' passata" #: common/constants/messages.py:108 #, python-format msgid "User's \"%%s\" track inactive flag is not correct" msgstr "La traccia inattiva dell'utente \"%%s\"non e' passata" #: common/constants/messages.py:109 #, python-format msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgstr "" "Il contrassegno inattivo della traccia dell'utente\"%%s\" non è corretto e " "non può essere impostato" #: common/constants/messages.py:110 #, python-format msgid "User's \"%%s\" hide tray icon flag is not passed" msgstr "Il flag dell'icona \"%%s\" nascosta dell'utente non viene passato" #: common/constants/messages.py:111 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct" msgstr "" "Il flag dell'icona \"%%s\" della barra delle applicazioni dell'utente non è " "corretto" #: common/constants/messages.py:112 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct and cannot be set" msgstr "" "Il flag dell'icona della barra delle applicazioni \"%%s\" dell'utente non è " "corretto e non può essere impostato" #: common/constants/messages.py:113 #, python-format msgid "User's \"%%s\" restriction / lockout type is not passed" msgstr "Il tipo di restrizione / blocco dell'utente \"%%s\" non è passato" #: common/constants/messages.py:114 #, python-format msgid "User's \"%%s\" restriction / lockout type is not correct" msgstr "Il tipo di restrizione / blocco \"%%s\" dell'utente non è corretto" #: common/constants/messages.py:115 #, python-format msgid "" "User's \"%%s\" restriction / lockout type is not correct and cannot be set" msgstr "" "Il tipo di restrizione / blocco dell'utente \"%%s\" non è corretto e non può " "essere impostato" #: common/constants/messages.py:116 #, python-format msgid "User's \"%%s\" weekly allowance is not passed" msgstr "Il permesso settimanale dell'utente\"%%s\" non viene superato" #: common/constants/messages.py:117 #, python-format msgid "User's \"%%s\" weekly allowance is not correct" msgstr "Il permesso settimanale dell'utente \"%%s\" non è corretto" #: common/constants/messages.py:118 #, python-format msgid "User's \"%%s\" weekly allowance is not correct and cannot be set" msgstr "" "Il permesso settimanale dell'utente\"%%s\" non è corretto e non può essere " "impostato" #: common/constants/messages.py:119 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not passed" msgstr "" "Il flag di abilitazione del Tempo di Gioco \"%%s\" dell'utente non è passato" #: common/constants/messages.py:120 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not correct" msgstr "" "Il flag di abilitazione del Tempo di Gioco \"%%s\" dell'utente non è corretto" #: common/constants/messages.py:121 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not correct and cannot be set" msgstr "" "Il flag di abilitazione del Tempo di Gioco \"%%s\" dell'utente non è " "corretto e non può essere impostato" #: common/constants/messages.py:122 #, python-format msgid "User's \"%%s\" PlayTime override flag is not passed" msgstr "" "Il flag di sovrascrizione del Tempo di Gioco dell'utente \"%%s\" non è " "passato" #: common/constants/messages.py:123 #, python-format msgid "User's \"%%s\" PlayTime override flag is not correct" msgstr "" "Il flag di sovrascrizione del Tempo di Gioco dell'utente \"%%s\" non è " "corretto" #: common/constants/messages.py:124 #, python-format msgid "User's \"%%s\" PlayTime override flag is not correct and cannot be set" msgstr "" "Il flag di sovrascrizione del Tempo di Gioco dell'utente \"%%s\" non è " "corretto e non può essere impostato" #: common/constants/messages.py:125 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "passed" msgstr "" "Il tempo di Gioco \"%%s\" consentito dell'utente durante gli intervalli non " "registrati non è passato" #: common/constants/messages.py:126 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct" msgstr "" "Il tempo di Gioco \"%%s\" consentito dell'utente durante gli intervalli non " "registrati non è corretto" #: common/constants/messages.py:127 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct and cannot be set" msgstr "" "Il tempo di Gioco \"%%s\" consentito dell'utente durante gli intervalli non " "registrati non è corretto e non può essere impostato" #: common/constants/messages.py:128 #, python-format msgid "User's \"%%s\" PlayTime day list is not passed" msgstr "L'elenco dei giorni di Gioco dell'utente \"%%s\" non è passato" #: common/constants/messages.py:129 #, python-format msgid "User's \"%%s\" PlayTime day list is not correct" msgstr "L'elenco dei giorni di Gioco dell'utente \"%%s\" non è corretto" #: common/constants/messages.py:130 #, python-format msgid "User's \"%%s\" PlayTime day list is not correct and cannot be set" msgstr "" "L'elenco dei giorni di Gioco dell'utente \"%%s\" non è corretto e non può " "essere impostato" #: common/constants/messages.py:131 common/constants/messages.py:134 #, python-format msgid "User's \"%%s\" PlayTime day limits list is not passed" msgstr "" "L'elenco dei limiti giornalieri di Gioco \"%%s\" dell'utente non è stato " "superato" #: common/constants/messages.py:132 common/constants/messages.py:135 #, python-format msgid "User's \"%%s\" PlayTime day limits list is not correct" msgstr "" "L'elenco dei limiti giornalieri di Gioco \"%%s\" dell'utente non è corretto" #: common/constants/messages.py:133 common/constants/messages.py:136 #, python-format msgid "" "User's \"%%s\" PlayTime day limits list is not correct and cannot be set" msgstr "" "L'elenco dei limiti giornalieri di Gioco \"%%s\" dell'utente non è corretto " "e non può essere impostato" #: common/constants/messages.py:137 #, python-format msgid "User's \"%%s\" PlayTime operation can be one of these: - + =" msgstr "" "L'operazione di Gioco dell'utente \"%%s\"può essere una di queste: - + =" #: common/constants/messages.py:138 #, python-format msgid "User's \"%%s\" set PlayTime limit is not correct" msgstr "Il limite di Gioco impostato dall'utente \"%%s\"non è corretto" #: common/constants/messages.py:139 #, python-format msgid "User's \"%%s\" PlayTime time limit is not correct and cannot be set" msgstr "" "Il limite di tempo di Gioco dell'utente\"%%s\" non è corretto e non può " "essere impostato" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:143 msgid "" "Unexpected ERROR while loading configuration. Please inspect Timekpr-nExT " "log files" msgstr "" "ERRORE inaspettato durante il caricamento della configurazione. Controlla i " "files log di Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:145 msgid "" "Unexpected ERROR getting configuration. Please inspect Timekpr-nExT log files" msgstr "" "ERRORE imprevisto durante il recupero della configurazione. Si prega di " "controllare i file di registro di Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:147 msgid "" "Unexpected ERROR getting user configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "ERRORE imprevisto durante il recupero della configurazione utente. Si prega " "di controllare i file di registro di Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:149 msgid "" "Unexpected ERROR getting user list. Please inspect Timekpr-nExT log files" msgstr "" "ERRORE inaspettato per ottenere l'elenco degli utenti. Controlla i files log " "di Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:151 msgid "" "Unexpected ERROR updating configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "ERRORE imprevisto durante l'aggiornamento della configurazione. Si prega di " "controllare i file di registro di Timekpr-nExT" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:153 msgid "" "Unexpected ERROR updating control. Please inspect Timekpr-nExT log files" msgstr "" "ERRORE inatteso durante l'aggiornamento. Controlla i files log di Timekpr-" "nExT" #: common/constants/messages.py:154 #, python-format msgid "User \"%%s\" configuration is not found" msgstr "La configurazione dell'utente \"%%s\" non è stata trovata" #: common/constants/messages.py:155 #, python-format msgid "User \"%%s\" control file is not found" msgstr "Il file di controllo dell'utente \"%%s\" non è stato trovato" #: common/constants/messages.py:156 #, python-format msgid "User \"%%s\" is not found" msgstr "L'utente \"%%s\" non è stato trovato" #: common/constants/messages.py:159 msgid "Connected" msgstr "Connesso" #: common/constants/messages.py:160 msgid "Connecting..." msgstr "Connessione in corso..." #: common/constants/messages.py:161 msgid "Failed to connect" msgstr "Connessione fallita" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:163 msgid "" "Please reopen the application if you are superuser and Timekpr-nExT is " "running" msgstr "" "Si prega di riaprire l'applicazione se si è super-utente e Timekpr-nExT è in " "esecuzione" #: common/constants/messages.py:164 msgid "Started" msgstr "Avviato" #: common/constants/messages.py:165 msgid "User configuration retrieved" msgstr "Configurazione utente recuperata" #: common/constants/messages.py:166 msgid "Configuration retrieved" msgstr "Configurazione recuperata" #: common/constants/messages.py:167 msgid "Track inactive for user has been processed" msgstr "La traccia inattiva per l'utente è stata elaborata" #: common/constants/messages.py:168 msgid "Hide tray icon for user has been processed" msgstr "" "L'icona Nascondi barra delle applicazioni per l'utente è stata elaborata" #: common/constants/messages.py:169 msgid "Restriction / lockout type for user has been processed" msgstr "Il tipo di restrizione / blocco per l'utente è stato elaborato" #: common/constants/messages.py:170 msgid "Additional time for user has been processed" msgstr "È stato elaborato un tempo aggiuntivo per l'utente" #: common/constants/messages.py:171 msgid "Additional PlayTime for user has been processed" msgstr "Il tempo di Gioco aggiuntivo per l'utente è stato elaborato" #: common/constants/messages.py:172 msgid "Weekly and monthly limits for user have been processed" msgstr "I limiti settimanali e mensili per l'utente sono stati elaborati" #: common/constants/messages.py:173 msgid "Allowed days for user have been processed" msgstr "I giorni consentiti per l'utente sono stati elaborati" #: common/constants/messages.py:174 msgid "Day time limits for user have been processed" msgstr "I limiti di tempo del giorno per l'utente sono stati elaborati" #: common/constants/messages.py:175 msgid "Allowed hours for user have been processed" msgstr "Le ore consentite per l'utente sono state elaborate" #: common/constants/messages.py:176 msgid "Timekpr-nExT configuration has been saved" msgstr "La configurazione di Timekpr-nExT è stata salvata" #: common/constants/messages.py:177 msgid "User time limits have been saved" msgstr "I limiti di tempo dell'utente sono stati salvati" #: common/constants/messages.py:178 msgid "User PlayTime limits have been saved" msgstr "I limiti di GIoco dell' utente sono stati salvati" #: common/constants/messages.py:179 msgid "User additional options have been saved" msgstr "Le opzioni aggiuntive dell'utente sono state salvate" #: common/constants/messages.py:180 msgid "Enable PlayTime for the user has been processed" msgstr "L'abilitazione del Tempo di Gioco per l'utente è stata elaborata" #: common/constants/messages.py:181 msgid "PlayTime override flag for the user has been processed" msgstr "" "Il flag di sovrascrizione del Tempo di Gioco per l'utente è stato elaborato" #: common/constants/messages.py:182 msgid "" "PlayTime allowed during unaccounted intervals flag for the user has been " "processed" msgstr "" "Il flag del Tempo di Gioco consentito durante intervalli non contabilizzati " "per l'utente è stato elaborato" #: common/constants/messages.py:183 msgid "PlayTime allowed days for user have been processed" msgstr "I giorni di Gioco consentiti per l'utente sono stati elaborati" #: common/constants/messages.py:184 msgid "PlayTime day limits for user have been processed" msgstr "" "I limiti giornalieri del Tempo di Gioco per l'utente sono stati elaborati" #: common/constants/messages.py:185 msgid "PlayTime activities for user have been processed" msgstr "Le attività del Tempo di Gioco per l'utente sono state elaborate" #: common/constants/messages.py:186 msgid "Please select a day to set the limits" msgstr "Si prega di selezionare un giorno per impostare i limiti" #: common/constants/messages.py:187 msgid "That interval overlaps with an existing one" msgstr "L'intervallo si sovrappone a quello esistente" #: common/constants/messages.py:188 msgid "That interval's start conflicts with an existing one" msgstr "L'inizio dell'intervallo è in conflitto con quello esistente" #: common/constants/messages.py:189 msgid "That interval's end conflicts with an existing one" msgstr "La fine dell'intervallo è in conflitto con quella esistente" #: common/constants/messages.py:190 msgid "That interval's start or end duplicates an existing one" msgstr "L'intervallo di inizio o fine duplica l'intervallo esistente" #: common/constants/messages.py:191 msgid "Interval start cannot be the same as end" msgstr "L'inizio dell'intervallo non può essere lo stesso della fine" #: common/constants/messages.py:192 msgid "Interval's start cannot be later than end" msgstr "L'inizio dell'intervallo non può essere successivo alla fine" #: common/constants/messages.py:193 msgid "Please select an hour interval to remove" msgstr "Si prega di selezionare un intervallo di un'ora da rimuovere" #: common/constants/messages.py:194 msgid "Interval removed" msgstr "Intervallo rimosso" #: common/constants/messages.py:195 msgid "Timekpr-nExT interface is not yet ready" msgstr "L'interfaccia Timekpr-nExT non è ancora pronta" #: common/constants/messages.py:198 msgid "" "WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, " "but no displays are available, thus running in CLI..." msgstr "" "ATTENZIONE: l'utilità di amministrazione di Timekpr-nExT è stata chiesta di " "eseguirla in modalità GUI, ma non sono disponibili display, quindi in " "esecuzione in CLI ..." #: common/constants/messages.py:199 msgid "The command is incorrect:" msgstr "Il comando non è corretto:" #: common/constants/messages.py:200 msgid "The usage of Timekpr-nExT admin client is as follows:" msgstr "L'utilizzo del client di amministrazione Timekpr-nExT è il seguente:" #: common/constants/messages.py:201 msgid "---=== NOTICE ===---" msgstr "---=== AVVISO ===---" #: common/constants/messages.py:202 msgid "numeric time values are in seconds" msgstr "i valori numerici di tempo sono in secondi" #: common/constants/messages.py:203 msgid "" "weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, " "format: 1-7)" msgstr "" "i giorni della settimana sono numerati secondo ISO 8601 (ovvero il lunedì è " "il primo giorno, formato: 1-7)" #: common/constants/messages.py:204 msgid "hours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)" msgstr "" "le ore sono numerate secondo ISO 8601 (ad es. orologio 24 ore, formato: 0-23)" #: common/constants/messages.py:206 #, python-format msgid "%(n)s user in total:" msgid_plural "%(n)s users in total:" msgstr[0] "%(n)s utente in totale:" msgstr[1] "%(n)s utenti in totale:" #: common/constants/messages.py:207 #, python-format msgid "Configuration for user %s:" msgstr "Configurazione per l'utente %s:" #: common/constants/messages.py:210 msgid "Time left..." msgstr "Tempo rimasto..." #: common/constants/messages.py:211 msgid "Limits & Configuration" msgstr "Limiti e configurazione" #: common/constants/messages.py:212 msgid "About" msgstr "Informazioni su" #: common/constants/messages.py:215 resource/client/forms/about.glade:17 msgid "Keep control of computer usage" msgstr "Mantieni il controllo del computer in uso" #: common/constants/messages.py:216 msgid "Day" msgstr "Giorno" #: common/constants/messages.py:217 msgid "Enabled" msgstr "Abilitato" #: common/constants/messages.py:218 common/constants/messages.py:224 msgid "Limit" msgstr "Limite" #: common/constants/messages.py:219 msgid "From" msgstr "Da" #: common/constants/messages.py:220 msgid "from..." msgstr "da..." #: common/constants/messages.py:221 msgid "To" msgstr "A" #: common/constants/messages.py:222 msgid "to..." msgstr "a..." #: common/constants/messages.py:223 msgid "Period" msgstr "Periodo" #: common/constants/messages.py:225 msgid "Weekly" msgstr "Settimanale" #: common/constants/messages.py:226 msgid "Monthly" msgstr "Mensile" #: common/constants/messages.py:227 common/constants/messages.py:229 msgid "Session type" msgstr "Tipo di sessione" #: common/constants/messages.py:228 common/constants/messages.py:230 msgid "session type..." msgstr "tipo di sessione..." #: common/constants/messages.py:231 msgid "Username" msgstr "Nome utente" #: common/constants/messages.py:232 msgid "username..." msgstr "nome utente..." #: common/constants/messages.py:233 msgid "Process mask" msgstr "Maschera processo" #: common/constants/messages.py:234 msgid "executable mask..." msgstr "maschera eseguibile..." #: common/constants/messages.py:235 msgid "Process description" msgstr "Descrizione processo" #: common/constants/messages.py:236 msgid "process description..." msgstr "descrizione del processo..." #: common/constants/messages.py:237 msgid "Time" msgstr "Orario" #: common/constants/messages.py:238 msgid "time..." msgstr "Orario..." #: common/constants/messages.py:239 msgid "Importance" msgstr "Importanza" #: common/constants/messages.py:240 msgid "importance..." msgstr "impoartanza..." #: common/constants/messages.py:243 msgid "Timekpr-nExT notification" msgstr "Notifica di Timekpr-nExT" #: common/constants/messages.py:244 msgid "Timekpr-nExT PlayTime notification" msgstr "Notifica Tempo di Gioco di Timekpr-nExT" #: common/constants/messages.py:245 msgid "Your time is not limited today" msgstr "Il tuo tempo non è limitato oggi" #: common/constants/messages.py:246 msgid "Time allowance has changed, please note new time left!" msgstr "" "Il permesso di tempo è cambiato, si prega di notare il nuovo tempo rimasto!" #: common/constants/messages.py:247 msgid "Time limit configuration has changed, please note new configuration!" msgstr "" "La configurazione del limite di tempo è cambiata, si prega di notare la " "nuova configurazione!" #: common/constants/messages.py:248 #, python-format msgid "There is a problem connecting to Timekpr-nExT daemon (%%s)!" msgstr "" "Si è verificato un problema durante il collegamento al daemon Timekpr-nExT " "(%%s)!" #: common/constants/messages.py:249 #, python-format msgid "There is a problem communicating to Timekpr-nExT (%%s)!" msgstr "" "Si è verificato un problema durante la comunicazione con Timekpr-nExT (%%s)!" #: common/constants/messages.py:250 #, python-format msgid "Icon initialization error (%%s)!" msgstr "Errore di inizializzazione dell'icona (%%s)!" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:252 msgid "Your time is up, you will be forcibly logged out in" msgstr "Il tuo tempo è scaduto, Sarai forzatamente disconnesso in" #. TRANSLATORS: this is a part of message "Your time is up, your computer will be forcibly shutdown in %s seconds", please translate accordingly #: common/constants/messages.py:254 msgid "Your time is up, your computer will be forcibly shutdown in" msgstr "Il tuo tempo è scaduto, il tuo computer verrà spento" #. TRANSLATORS: this is a part of message "Your time is up, your session will be forcibly locked in %s seconds", please translate accordingly #: common/constants/messages.py:256 msgid "Your time is up, your session will be forcibly locked in" msgstr "Il tuo tempo è scaduto, la tua sessione verrà bloccata forzatamente" #. TRANSLATORS: this is a part of message ", Your computer will be forcibly suspended in %s seconds", please translate accordingly #: common/constants/messages.py:258 msgid "Your time is up, your computer will be forcibly suspended in" msgstr "Il tuo tempo è scaduto, il tuo computer verrà sospeso forzatamente" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:260 #, python-format msgid "%(n)s second" msgid_plural "%(n)s seconds" msgstr[0] "%(n)s secondo" msgstr[1] "%(n)s secondi" #: common/constants/messages.py:261 msgid "Internal connection error, please check log files" msgstr "Errore di connessione interna, controllare i files log" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:263 #, python-format msgid "You have %(n)s hour" msgid_plural "You have %(n)s hours" msgstr[0] "Hai %(n)s ora" msgstr[1] "Hai %(n)s ore" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:265 #, python-format msgid "%(n)s minute" msgid_plural "%(n)s minutes" msgstr[0] "%(n)s minuto" msgstr[1] "%(n)s minuti" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) of PlayTime left" please translate accordingly #: common/constants/messages.py:267 common/constants/messages.py:269 #, python-format msgid "%(n)s second left" msgid_plural "%(n)s seconds left" msgstr[0] "%(n)s secondo rimasto" msgstr[1] "%(n)s secondi rimasto" #: common/constants/messages.py:269 #, python-format msgid "%(n)s second of PlayTime left" msgid_plural "%(n)s seconds of PlayTime left" msgstr[0] "%(n)s secondo di Gioco rimanente" msgstr[1] "%(n)s secondi di Gioco rimanente" #: common/constants/messages.py:270 #, python-format msgid "" "Feature \"%%s\", which is used to detect idle time, cannot be enabled!\n" "Idle / inactive time might not be accounted when screen is locked!" msgstr "" "La funzione \"%%s\", utilizzata per rilevare i tempi di inattività, non può " "essere abilitata!\n" "Il tempo di inattività / inattivo potrebbe non essere preso in " "considerazione quando lo schermo è bloccato!" #: common/constants/messages.py:273 #, python-format msgid "UNEXPECTED ERROR: %%s" msgstr "ERRORE INASPETTATO: %%s" #: common/constants/messages.py:274 #, python-format msgid "PARAMETER PARSE ERROR (please check parameter validity): %%s" msgstr "" "ERRORE DI ANALISI DEI PARAMETRI (verificare la validità dei parametri): %%s" #: common/constants/messages.py:275 msgid "Command FAILED: access denied" msgstr "Comando NON RIUSCITO: accesso negato" #: common/constants/messages.py:276 msgid "Command FAILED: communication was not accepted" msgstr "Comando NON RIUSCITO: la comunicazione non è stata accettata" #: common/constants/messages.py:277 msgid "n/a" msgstr "n/a" #: resource/client/forms/about.glade:7 msgid "About Timekpr-nExT" msgstr "Informazioni su Timekpr-nExT" #: resource/client/forms/about.glade:16 msgid "Copyright (c) 2018-2021 Eduards Bezverhijs" msgstr "Copyright (c) 2018-2021 Eduards Bezverhijs" #: resource/client/forms/about.glade:19 msgid "Timekpr-nExT" msgstr "Timekpr-nExT" #. Please enter GPL3 licence text in your language #: resource/client/forms/about.glade:20 msgctxt "timekpr-next" msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details.\n" "\n" "You should have received a copy of the GNU General Public License along with " "this program. If not, see . In Debian, see " "file /usr/share/common-licenses/GPL-3" msgstr "" "Questo programma è software libero: è possibile ridistribuirlo e/o " "modificarlo secondo i termini della GNU General Public License così come " "pubblicata dalla Free Software Foundation, sia la versione 3 della licenza, " "o (a propria scelta) una versione successiva.\n" "\n" "Questo programma è distribuito nella speranza che possa essere utile, ma " "SENZA ALCUNA GARANZIA, nemmeno la garanzia implicita di COMMERCIABILITÀ o " "IDONEITÀ PER UN PARTICOLARE SCOPO. Vedere la GNU General Public License per " "ulteriori dettagli.\n" "\n" "Dovreste aver ricevuto una copia della GNU General Public License insieme a " "questo programma. In caso contrario, vedere . " "In Debian, vedere file / usr/share/common-licenses/GPL-3" #. Please fill in translator credits, each person in new line in format: name.surname@mail.xy, name@mail.xy, nick@mail.xy or so... #: resource/client/forms/about.glade:26 msgid "" "Eduards Bezverhijs \n" "(Translations fine-tuning by JP Lord )\n" "(English fine-tuning by Phil Hudson )" msgstr "" "Eduards Bezverhijs \n" "(Translations fine-tuning by JP Lord )\n" "(English fine-tuning by Phil Hudson )\n" "(Italian fine-tuning by " #: resource/client/forms/admin.glade:155 msgid "Remove excluded session type" msgstr "Rimuovi il tipo di sessione esclusa" #: resource/client/forms/admin.glade:385 msgid "Timekpr-nExT administration" msgstr "Amministrazione di Timekpr-nExT" #: resource/client/forms/admin.glade:403 resource/client/forms/admin.glade:409 #: resource/client/forms/client.glade:261 msgid "Icon, isn't it?" msgstr "Icona, non è vero?" #: resource/client/forms/admin.glade:432 msgid "Notes, read carefully ;)" msgstr "Note, leggi attentamente;)" #: resource/client/forms/admin.glade:435 msgid "" "This is the configuration app for Timekpr-nExT. It allows you to set time " "limits for your individual users as well as general Timekpr-nExT options.\n" "To use this application, you either have to execute it as superuser or have " "to be part of the timekpr group.\n" "Please note that the \"Timekpr-nExT Configuration\" is available in " "superuser (administrator) mode only!\n" "\n" "Please configure carefully: do not lock yourself out!" msgstr "" "Questa è l'app di configurazione per Timekpr-nExT. Ti consente di impostare " "limiti di tempo per i tuoi utenti individuali e opzioni generali di Timekpr-" "nExT.\n" "Per usare questa applicazione, devi eseguirla come superutente o far parte " "del gruppo timekpr.\n" "Si noti che la \"Configurazione Timekpr-nExT\" è disponibile solo in " "modalità super-utente (amministratore)!\n" "\n" "Si prega di configurare con attenzione: non chiudetevi fuori!" #: resource/client/forms/admin.glade:465 resource/client/forms/admin.glade:3016 msgid "Users related configuration" msgstr "Configurazione relativa agli utenti" #: resource/client/forms/admin.glade:476 resource/client/forms/client.glade:298 msgid "Username:" msgstr "Nome utente:" #: resource/client/forms/admin.glade:504 resource/client/forms/admin.glade:516 msgid "List of usernames registered on the system" msgstr "Elenco dei nomi utente registrati nel sistema" #: resource/client/forms/admin.glade:530 msgid "Restore" msgstr "Ripristina" #: resource/client/forms/admin.glade:535 msgid "Restore configuration from saved state" msgstr "Ripristina una configurazione salvata" #: resource/client/forms/admin.glade:586 msgid "Information about time left / spent" msgstr "Informazioni sul tempo rimanente / trascorso" #: resource/client/forms/admin.glade:610 msgid "" "Continuous time left. May span more than the current day (realtime, " "available when user is logged in)" msgstr "" "Tempo rimasto. Può estendersi più del giorno corrente (in tempo reale, " "disponibile quando l'utente è connesso)" #: resource/client/forms/admin.glade:612 msgid "Time left (actual):" msgstr "Tempo rimasto (effettivo):" #: resource/client/forms/admin.glade:626 resource/client/forms/admin.glade:657 #: resource/client/forms/admin.glade:688 resource/client/forms/admin.glade:732 #: resource/client/forms/admin.glade:763 resource/client/forms/admin.glade:794 #: resource/client/forms/client.glade:411 #: resource/client/forms/client.glade:425 #: resource/client/forms/client.glade:456 #: resource/client/forms/client.glade:502 #: resource/client/forms/client.glade:728 #: resource/client/forms/client.glade:786 #: resource/client/forms/client.glade:857 #: resource/client/forms/client.glade:885 #: resource/client/forms/client.glade:985 #: resource/client/forms/client.glade:1011 msgid "Format: " msgstr "Formato: " #: resource/client/forms/admin.glade:641 msgid "" "How long the user was inactive since last login (realtime, available when " "user is logged in)" msgstr "" "Quanto tempo l'utente è stato inattivo dall'ultimo accesso (in tempo reale, " "disponibile quando l'utente è connesso)" #: resource/client/forms/admin.glade:643 msgid "Time inactive (actual):" msgstr "Tempo inattivo (effettivo):" #: resource/client/forms/admin.glade:672 msgid "Time available today (saved stated, not real-time)" msgstr "Tempo disponibile oggi (risparmiato dichiarato, non in tempo reale)" #: resource/client/forms/admin.glade:674 msgid "Time left (today):" msgstr "Tempo rimasto (oggi):" #: resource/client/forms/admin.glade:716 msgid "Time spent today (saved stated, not real-time)" msgstr "Tempo trascorso oggi (salvato dichiarato, non in tempo reale)" #: resource/client/forms/admin.glade:718 msgid "Time spent (today):" msgstr "Tempo trascorso (oggi):" #: resource/client/forms/admin.glade:747 msgid "Time spent this week (saved stated, not real-time)" msgstr "" "Tempo trascorso per questa settimana (salvato dichiarato, non in tempo reale)" #: resource/client/forms/admin.glade:749 resource/client/forms/client.glade:717 msgid "Time spent (week):" msgstr "Tempo trascorso (settimana):" #: resource/client/forms/admin.glade:777 msgid "Time spent this month (saved stated, not real-time)" msgstr "Tempo trascorso questo mese (salvato dichiarato, non in tempo reale)" #: resource/client/forms/admin.glade:779 resource/client/forms/client.glade:744 msgid "Time spent (month):" msgstr "Tempo trascorso (mese):" #: resource/client/forms/admin.glade:861 msgid "Allowance adjustments" msgstr "Aggiustamenti consentiti" #: resource/client/forms/admin.glade:885 msgid "today's time" msgstr "il tempo di oggi" #: resource/client/forms/admin.glade:889 msgid "Choose this to adjust user's time allowance for today" msgstr "Scegli questa opzione per regolare il tempo dell'utente per oggi" #: resource/client/forms/admin.glade:901 msgid "PlayTime" msgstr "Tempo di Gioco" #: resource/client/forms/admin.glade:905 msgid "Choose this to adjust user's PlayTime allowance for today" msgstr "" "Scegli questa opzione per modificare la concessione del Tempo di Gioco " "dell'utente per oggi" #: resource/client/forms/admin.glade:934 msgid "hr" msgstr "ore" #: resource/client/forms/admin.glade:945 msgid "The number of minutes to be adjusted for today's limit" msgstr "La quantità di minuti da regolare per il limite di oggi" #: resource/client/forms/admin.glade:961 msgid "The number of hours to be adjusted for today's limit" msgstr "La quantità di ore da regolare per il limite di oggi" #: resource/client/forms/admin.glade:977 msgid "min" msgstr "minuti" #: resource/client/forms/admin.glade:1004 msgid "Add specified time (reward)" msgstr "Aggiungi la quantità specificata (ricompensa)" #: resource/client/forms/admin.glade:1020 msgid "Subtract specified time (penalty)" msgstr "Sottrai la quantità specificata (penalità)" #: resource/client/forms/admin.glade:1036 msgid "Set this specific time limit" msgstr "Imposta questo limite di tempo specifico" #: resource/client/forms/admin.glade:1101 msgid "Information about PlayTime" msgstr "Informazioni sul Tempo di Gioco" #: resource/client/forms/admin.glade:1134 msgid "" "Actual PlayTime available today (realtime, available when user is logged in)" msgstr "" "Tempo di GIoco effettivo disponibile oggi (in tempo reale, disponibile " "quando l'utente ha effettuato l'accesso)" #: resource/client/forms/admin.glade:1136 msgid "PlayTime left (actual):" msgstr "Tempo di GIoco trascorso (attuale):" #: resource/client/forms/admin.glade:1150 #: resource/client/forms/admin.glade:1181 #: resource/client/forms/admin.glade:1269 msgid "Format: " msgstr "Formato: " #: resource/client/forms/admin.glade:1165 msgid "PlayTime available today (saved stated, not real-time)" msgstr "Tempo di GIoco disponibile oggi (stato salvato, non in tempo reale)" #: resource/client/forms/admin.glade:1167 msgid "PlayTime left (today):" msgstr "Tempo di Gioco trascorso (oggi):" #: resource/client/forms/admin.glade:1196 #: resource/client/forms/admin.glade:1212 msgid "" "Active PlayTime activity count (realtime, available when user is logged in)" msgstr "" "Conteggio attività Attive di Gioco(in tempo reale, disponibile quando " "l'utente ha effettuato l'accesso)" #: resource/client/forms/admin.glade:1198 msgid "Running activities (actual):" msgstr "Attività in corso (effettive):" #: resource/client/forms/admin.glade:1253 msgid "PlayTime spent today (saved stated, not real-time)" msgstr "Tempo di Gioco trascorso oggi (stato salvato, non in tempo reale)" #: resource/client/forms/admin.glade:1255 msgid "PlayTime spent (today):" msgstr "Tempo di GIoco trascorso (oggi):" #: resource/client/forms/admin.glade:1306 msgid "" "Brief information about time spent and everything related to time management " "for this day" msgstr "" "Brevi informazioni sul tempo trascorso e tutto ciò che riguarda la gestione " "del tempo per questo giorno" #: resource/client/forms/admin.glade:1307 msgid "Info & Today" msgstr "Informazioni & oggi" #: resource/client/forms/admin.glade:1348 msgid "This lets you configure time limits." msgstr "Ciò consente di configurare i limiti di tempo." #: resource/client/forms/admin.glade:1350 msgid "Week day limits" msgstr "Limiti dei giorni feriali" #. This is meant for very short (e.g. one letter) abbreviation of hours #: resource/client/forms/admin.glade:1370 #: resource/client/forms/admin.glade:1865 #: resource/client/forms/admin.glade:2265 msgid "h" msgstr "h" #: resource/client/forms/admin.glade:1374 #: resource/client/forms/admin.glade:2269 msgid "Choose hours to be adjusted for selected days." msgstr "Scegli le ore da regolare per i giorni selezionati." #. This is meant for very short (e.g. one letter) abbreviation of minutes #: resource/client/forms/admin.glade:1386 #: resource/client/forms/admin.glade:1881 #: resource/client/forms/admin.glade:2281 msgid "m" msgstr "m" #: resource/client/forms/admin.glade:1390 #: resource/client/forms/admin.glade:2285 msgid "Choose minutes to be adjusted for selected days." msgstr "Scegli i minuti da regolare per i giorni selezionati." #: resource/client/forms/admin.glade:1410 msgid "" "Increase daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Aumenta la concessione di tempo giornaliera in base all'unità di tempo " "selezionata (ore o minuti) per i giorni selezionati.\n" "\n" "Tieni presente che puoi selezionare più di un giorno per la regolazione!" #: resource/client/forms/admin.glade:1427 msgid "" "Decrease daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Riduci la concessione di tempo giornaliera in base all'unità di tempo " "selezionata (ore o minuti) per i giorni selezionati.\n" "\n" "Tieni presente che puoi selezionare più di un giorno per la regolazione!" #: resource/client/forms/admin.glade:1474 msgid "" "Lists day of the week and additional information about the day's limit.\n" "\n" "Please enable / disable days for the user." msgstr "" "Elenca il giorno della settimana e ulteriori informazioni sul limite del " "giorno.\n" "\n" "Si prega di abilitare / disabilitare i giorni per l'utente." #: resource/client/forms/admin.glade:1550 msgid "" "Hour intervals for selected day available to the user.\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead.\n" "\n" "Please note that if the day's limit ends at 24:00 and the next day's limit " "starts at 00:00, then the user can work continuously past midnight.\n" "\n" "Please note that multiple intervals cannot be configured within the same " "hour.\n" "An interval can start or end or contain a specific hour, but not more than " "once. This is by design, not a bug.\n" "\n" msgstr "" "Intervalli orari per il giorno selezionato disponibili per l'utente.\n" "L'opzione \"∞\" indica che il tempo trascorso durante questo intervallo non " "verrà conteggiato nel limite giornaliero, ma sarà invece considerato " "inattivo.\n" "\n" "Tieni presente che se il limite del giorno termina alle 24:00 e il limite " "del giorno successivo inizia alle 00:00, l'utente può lavorare " "ininterrottamente oltre la mezzanotte.\n" "\n" "Si noti che non è possibile configurare più intervalli nella stessa ora.\n" "Un intervallo può iniziare o finire o contenere un'ora specifica, ma non più " "di una volta. Questo è di progettazione, non un bug.\n" "\n" #: resource/client/forms/admin.glade:1581 msgid "Hour intervals" msgstr "Intervalli di ora" #: resource/client/forms/admin.glade:1603 msgid "" "Create a new time interval that will be available to the user.\n" "\n" "After creating the interval, please edit its start and end times directly in " "interval list." msgstr "" "Crea un nuovo intervallo di tempo che sarà disponibile per l'utente.\n" "\n" "Dopo aver creato l'intervallo, modificare i suoi orari di inizio e fine " "direttamente nell'elenco degli intervalli." #: resource/client/forms/admin.glade:1620 msgid "Delete the selected time interval from the available list of intervals." msgstr "" "Elimina l'intervallo di tempo selezionato dall'elenco di intervalli " "disponibile." #: resource/client/forms/admin.glade:1688 msgid "enter hour intervals" msgstr "inserire intervalli orari" #: resource/client/forms/admin.glade:1742 msgid "verify" msgstr "verifica" #: resource/client/forms/admin.glade:1746 msgid "" "Verify configured time intervals. This is a mandatory step to ensure that " "intervals are correct.\n" "\n" "Intervals which have problems will be highlighted." msgstr "" "Verifica gli intervalli di tempo configurati. Questo è un passaggio " "obbligatorio per garantire che gli intervalli siano corretti.\n" "\n" "Verranno evidenziati gli intervalli che presentano problemi." #: resource/client/forms/admin.glade:1821 msgid "Weekly and monthly limits" msgstr "Limiti settimanali e mensili" #. This is meant for very short (e.g. one letter) abbreviation of days #: resource/client/forms/admin.glade:1849 msgid "d" msgstr "g" #: resource/client/forms/admin.glade:1853 msgid "Choose days to be adjusted for selected period." msgstr "Scegli i giorni da regolare per il periodo selezionato." #: resource/client/forms/admin.glade:1869 msgid "Choose hours to be adjusted for selected period." msgstr "Scegli le ore da regolare per il periodo selezionato." #: resource/client/forms/admin.glade:1885 msgid "Choose minutes to be adjusted for selected period." msgstr "Scegli i minuti da regolare per il periodo selezionato." #: resource/client/forms/admin.glade:1913 msgid "" "Increase weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" "Aumenta la concessione di tempo settimanale o mensile in base all'unità di " "tempo selezionata (giorni o ore o minuti) per il periodo selezionato." #: resource/client/forms/admin.glade:1927 msgid "" "Decrease weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" "Diminuisce la concessione di tempo settimanale o mensile in base all'unità " "di tempo selezionata (giorni o ore o minuti) per il periodo selezionato." #: resource/client/forms/admin.glade:1976 msgid "" "Weekly and monthly limits for the user.\n" "\n" "These limits are applied to user together with the rest of limit " "configuration." msgstr "" "Limiti settimanali e mensili per l'utente.\n" "\n" "Questi limiti vengono applicati all'utente insieme al resto della " "configurazione dei limiti." #: resource/client/forms/admin.glade:2016 msgid "Apply daily limits" msgstr "Applica limiti giornalieri" #: resource/client/forms/admin.glade:2021 msgid "Apply limit all changes made in this page" msgstr "Applica limite a tutte le modifiche apportate in questa pagina" #: resource/client/forms/admin.glade:2042 msgid "Daily limit configuration for all week days" msgstr "Configurazione limite giornaliero per tutti i giorni della settimana" #: resource/client/forms/admin.glade:2043 msgid "Limit configuration" msgstr "Limite di configurazione" #: resource/client/forms/admin.glade:2064 msgid "Settings for PlayTime activities" msgstr "Impostazioni per le attività di Gioco" #: resource/client/forms/admin.glade:2084 msgid "PlayTime options" msgstr "Opzioni di GIoco" #: resource/client/forms/admin.glade:2108 #: resource/client/forms/admin.glade:2147 msgid "Enable PlayTime for selected user" msgstr "Abilita Tempo di Gioco per l'utente selezionato" #: resource/client/forms/admin.glade:2110 msgid "Enable PlayTime:" msgstr "Abilita Tempo di Gioco" #: resource/client/forms/admin.glade:2124 #: resource/client/forms/admin.glade:2161 msgid "" "Enable PlayTime override for selected user.\n" "\n" "This setting overrides time accounting in a way that time is accounted only " "when at least one of the applications on the PlayTime activity list are " "running!\n" "\n" "This affects only time accounting, intervals are still fully enforced!\n" "\n" "If no processes are running, time is accounted as idle thus effectively it's " "free time for user!" msgstr "" "Abilita la sovrascrittura del Tempo di Gioco per l'utente selezionato.\n" "\n" "Questa impostazione sostituisce il conteggio del tempo in modo tale che il " "tempo venga conteggiato solo quando almeno una delle applicazioni " "nell'elenco delle attività di Gioco è in esecuzione!\n" "\n" "Ciò riguarda solo il conteggio del tempo, gli intervalli sono ancora " "pienamente applicati!\n" "\n" "Se nessun processo è in esecuzione, il tempo viene considerato inattivo, " "quindi è effettivamente tempo libero per l'utente!" #: resource/client/forms/admin.glade:2132 msgid "Enable PlayTime override:" msgstr "Abilita sovrascrittura del Tempo di Gioco:" #: resource/client/forms/admin.glade:2180 #: resource/client/forms/admin.glade:2201 msgid "" "Allow PlayTime activities during unaccounted (\"∞\") time intervals for " "selected user.\n" "\n" "This setting allows the user to use applications configured in his PlayTime " "activity list during time intervals which are marked as unaccounted (\"∞" "\").\n" "\n" "If this setting is enabled, the use of activities will not be accounted " "towards PlayTime limits, otherwise applications in PlayTime activity list " "will be terminated as soon as they are started during unaccounted (\"∞\") " "time intervals." msgstr "" "Consenti attività di Gioco durante intervalli di tempo non contabilizzati " "(\"∞\") per l'utente selezionato.\n" "\n" "Questa impostazione consente all'utente di utilizzare le applicazioni " "configurate nel proprio elenco di attività di Gioco durante gli intervalli " "di tempo contrassegnati come non contabilizzati (\"∞\").\n" "\n" "Se questa impostazione è abilitata, l'utilizzo delle attività non verrà " "considerato ai fini dei limiti di Gioco, altrimenti le applicazioni " "nell'elenco delle attività di Gioco verranno terminate non appena vengono " "avviate durante intervalli di tempo(\"∞\") non contabilizzati." #: resource/client/forms/admin.glade:2186 msgid "Allowed during \"∞\" intervals:" msgstr "Consentito durante gli \"∞\" intervalli:" #: resource/client/forms/admin.glade:2245 msgid "This lets you configure PlayTime limits." msgstr "Ciò ti consente di configurare i limiti di Gioco." #: resource/client/forms/admin.glade:2247 #: resource/client/forms/client.glade:1253 msgid "PlayTime limits" msgstr "Limiti di Tempo di Gioco" #: resource/client/forms/admin.glade:2305 msgid "" "Increase daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Aumenta la concessione giornaliera del Tempo di Gioco in base all'unità di " "tempo selezionata (ore o minuti) per i giorni selezionati.\n" "\n" "Tieni presente che puoi selezionare più di un giorno per la regolazione!" #: resource/client/forms/admin.glade:2322 msgid "" "Decrease daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Diminuisci la concessione giornaliera del Tempo di Gioco in base all'unità " "di tempo selezionata (ore o minuti) per i giorni selezionati.\n" "\n" "Tieni presente che puoi selezionare più di un giorno per la regolazione!" #: resource/client/forms/admin.glade:2374 msgid "" "Lists day of the week and additional information about the day's PlayTime " "limit.\n" "\n" "Please enable / disable days for the user and set time allowance for " "PlayTime activities." msgstr "" "Elenca il giorno della settimana e ulteriori informazioni sul limite di " "Gioco del giorno.\n" "\n" "Abilita / disabilita i giorni per l'utente e imposta il tempo consentito per " "le attività di Gioco." #: resource/client/forms/admin.glade:2423 msgid "PlayTime activities" msgstr "Attività di Gioco" #: resource/client/forms/admin.glade:2445 msgid "" "Add new PlayTime activity.\n" "\n" "Please specify activity mask and user friendly description in the activity " "list directly." msgstr "" "Aggiungi nuova attività di Gioco.\n" "\n" "Specificare direttamente la maschera dell'attività e una descrizione " "intuitiva nell'elenco delle attività." #: resource/client/forms/admin.glade:2462 msgid "Remove selected entry from PlayTime activities." msgstr "Rimuovi la voce selezionata dalle attività di Gioco." #: resource/client/forms/admin.glade:2506 msgid "" "Please specify a list of full process (executable) names without path as " "case sensitive strings to be monitored in the system.\n" "\n" "It's possible to specify RegExp masks for processes too, but please be very " "careful about them as misusing this setting may lead to killing unwanted " "processes for the user!\n" "\n" "NOTE: RegExp is an expert setting!" msgstr "" "Specificare un elenco di nomi di processi completi (eseguibili) senza " "percorso come stringhe con distinzione tra maiuscole e minuscole da " "monitorare nel sistema.\n" "\n" "È possibile specificare anche le maschere RegExp per i processi, ma si prega " "di fare molta attenzione in quanto l'uso improprio di questa impostazione " "può portare alla chiusura di processi indesiderati per l'utente!\n" "\n" "NOTA: RegExp è un'impostazione esperta!" #: resource/client/forms/admin.glade:2546 msgid "Apply PlayTime configuration" msgstr "Applica configurazione di Gioco" #: resource/client/forms/admin.glade:2550 msgid "Apply PlayTime limits and configuration changes on this page" msgstr "" "Applica i limiti di Gioco e le modifiche alla configurazione in questa pagina" #: resource/client/forms/admin.glade:2569 msgid "PlayTime configuration" msgstr "Configurazione Tempo di Gioco" #: resource/client/forms/admin.glade:2594 msgid "Additional configuration options" msgstr "Statistiche aggiuntive" #: resource/client/forms/admin.glade:2629 #: resource/client/forms/admin.glade:2652 msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account. This " "varies among desktop environments." msgstr "" "Seleziona se conteggiare il tempo della sessione inattiva.\n" "\n" "Se questa opzione è deselezionata, il tempo trascorso nelle sessioni di " "accesso della console (non dell'emulatore di terminale) e mentre lo schermo " "è bloccato NON viene preso in considerazione. Questo varia a seconda degli " "ambienti desktop." #: resource/client/forms/admin.glade:2633 msgid "Track inactive sessions:" msgstr "Tieni traccia delle sessioni inattive:" #: resource/client/forms/admin.glade:2669 #: resource/client/forms/admin.glade:2692 msgid "" "Select whether to show Timekpr-next's padlock icon and notifications to the " "user.\n" "\n" "Please note that unchecking this will disable showing all information and " "notifications to the user!" msgstr "" "Seleziona se mostrare l'icona del lucchetto di Timekpr-next e le notifiche " "all'utente.\n" "\n" "Tieni presente che deselezionando questa opzione verrà disabilitata la " "visualizzazione di tutte le informazioni e le notifiche all'utente!" #: resource/client/forms/admin.glade:2673 msgid "Hide icon and notifications:" msgstr "Nascondi icone e notifiche:" #: resource/client/forms/admin.glade:2744 msgid "" "Select a restriction / lockout type for the user.\n" "\n" "NOTE: please be very careful, think ahead and read every options description " "when changing this setting from default value!" msgstr "" "Seleziona un tipo di restrizione / blocco per l'utente.\n" "\n" "NOTA: si prega di fare molta attenzione, pensare in anticipo e leggere ogni " "descrizione delle opzioni quando si modifica questa impostazione dal valore " "predefinito!" #: resource/client/forms/admin.glade:2748 msgid "Restriction / lockout type:" msgstr "Tipo di restrizione / blocco:" #: resource/client/forms/admin.glade:2770 msgid "terminate sessions" msgstr "termina sessioni" #: resource/client/forms/admin.glade:2774 msgid "" "When time ends, user sessions will be terminated.\n" "\n" "This option is a restriction!\n" "\n" "This is the default option and most likely is the one you need!" msgstr "" "Allo scadere del tempo, le sessioni utente verranno terminate.\n" "\n" "Questa opzione è una restrizione!\n" "\n" "Questa è l'opzione predefinita e molto probabilmente è quella che ti serve!" #: resource/client/forms/admin.glade:2792 msgid "shutdown computer" msgstr "arresto del computer" #: resource/client/forms/admin.glade:2796 msgid "" "When time ends, computer will be shut down.\n" "\n" "This option is a restriction!\n" "\n" "Please evaluate whether you need this type of restriction!" msgstr "" "Allo scadere del tempo, il computer verrà spento.\n" "\n" "Questa opzione è una restrizione!\n" "\n" "Valuta se hai bisogno di questo tipo di restrizione!" #: resource/client/forms/admin.glade:2814 msgid "suspend computer" msgstr "Sospensione del computer" #: resource/client/forms/admin.glade:2818 msgid "" "When time ends, computer will be suspended (put to sleep).\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Allo scadere del tempo, il computer verrà sospeso (messo in stato di sleep " "mode).\n" "\n" "Questa opzione non è una restrizione ed è più adatta per scopi di " "autocontrollo.\n" "\n" "Se viene riattivato quando non c'è ancora tempo, lo schermo del computer " "verrà bloccato e dopo un po 'di tempo verrà messo di nuovo in sospensione." #: resource/client/forms/admin.glade:2836 msgid "suspend / wakeup computer" msgstr "sospendi / riattiva computer" #: resource/client/forms/admin.glade:2840 msgid "" "When time ends, computer will be suspended (put to sleep) and will be woken " "up at start of next available time interval for the user.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Allo scadere del tempo, il computer verrà sospeso (messo in stato di stop) e " "verrà riattivato all'inizio del successivo intervallo di tempo disponibile " "per l'utente.\n" "\n" "Questa opzione non è una restrizione ed è più adatta per scopi di " "autocontrollo.\n" "\n" "Se viene riattivato quando non c'è ancora tempo, lo schermo del computer " "verrà bloccato e dopo un po 'di tempo verrà messo di nuovo in sospensione." #: resource/client/forms/admin.glade:2858 msgid "lock screen" msgstr "blocca schermo" #: resource/client/forms/admin.glade:2862 msgid "" "When time ends, computer screen will be locked.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes." msgstr "" "Allo scadere del tempo, lo schermo del computer verrà bloccato.\n" "\n" "Questa opzione non è una restrizione ed è più adatta per scopi di " "autocontrollo." #: resource/client/forms/admin.glade:2893 msgid "" "Select a time interval when computer can be woken up automatically.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Selezionare un intervallo di tempo in cui il computer può essere riattivato " "automaticamente.\n" "\n" "Tieni presente che questa opzione è efficace solo se la riattivazione " "tramite RealTime Clock è supportata e abilitata in BIOS / UEFI!" #: resource/client/forms/admin.glade:2897 msgid "Wakeup hour interval:" msgstr "Intervallo ora sveglia:" #: resource/client/forms/admin.glade:2909 msgid "" "Enter start hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Immettere l'ora di inizio per la funzione di riattivazione automatica.\n" "\n" "Tieni presente che questa opzione è efficace solo se la riattivazione " "tramite RealTime Clock è supportata e abilitata in BIOS / UEFI!" #: resource/client/forms/admin.glade:2928 msgid "" "Enter end hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Immettere l'ora di fine per la funzione di riattivazione automatica.\n" "\n" "Tieni presente che questa opzione è efficace solo se la riattivazione " "tramite RealTime Clock è supportata e abilitata in BIOS / UEFI!" #: resource/client/forms/admin.glade:2966 msgid "Apply configuration" msgstr "Applica configurazione" #: resource/client/forms/admin.glade:2970 msgid "Apply additional configuration changes on this page" msgstr "Applica ulteriori modifiche alla configurazione in questa pagina" #: resource/client/forms/admin.glade:2989 msgid "Additional configuration" msgstr "Configurazione aggiuntiva" #: resource/client/forms/admin.glade:2990 #: resource/client/forms/admin.glade:3661 msgid "Additional options" msgstr "Opzioni aggiuntive" #: resource/client/forms/admin.glade:3017 msgid "User Configuration" msgstr "Configurazione utente" #: resource/client/forms/admin.glade:3027 msgid "Timekpr-nExT related configuration" msgstr "Configurazione relativa a Timekpr-nExT" #: resource/client/forms/admin.glade:3054 msgid "Control Timekpr-nExT Settings" msgstr "Controlla le impostazioni di Timekpr-nExT" #: resource/client/forms/admin.glade:3081 #: resource/client/forms/admin.glade:3233 msgid "" "Timekpr-nExT log level.\n" "\n" "Please do not change this unless you have to. You likely won't find anything " "pretty in the log files.\n" "\n" "Values are: 1 - standard, 2 - debug, 3 - extra debug" msgstr "" "Livello di log Timekpr-nExT.\n" "\n" "Si prega di non modificarlo a meno che non sia necessario. Probabilmente non " "troverai nulla di carino nei file di registro.\n" "\n" "I valori sono: 1 - standard, 2 - debug, 3 - extra debug" #: resource/client/forms/admin.glade:3101 #: resource/client/forms/admin.glade:3149 msgid "" "Session polling time granularity which specifies how often user sessions and " "activity are checked and accounted.\n" "\n" "3 - 5 seconds are optimal, don't change this if unsure." msgstr "" "Granularità del tempo di polling della sessione che specifica la frequenza " "con cui le sessioni e l'attività dell'utente vengono controllate e " "contabilizzate.\n" "\n" "3-5 secondi sono ottimali, non cambiarlo se non sei sicuro." #: resource/client/forms/admin.glade:3105 msgid "Poll interval" msgstr "Verifica intervallo" #: resource/client/forms/admin.glade:3117 #: resource/client/forms/admin.glade:3220 msgid "" "Specify the time in seconds when Timekpr-nExT starts continuous real-time " "countdown before enforcing a restriction / lockout to user's sessions." msgstr "" "Specificare il tempo in secondi in cui Timekpr-nExT avvia il conto alla " "rovescia continuo in tempo reale prima di applicare una restrizione / blocco " "alle sessioni dell'utente." #: resource/client/forms/admin.glade:3133 #: resource/client/forms/admin.glade:3183 msgid "" "This specifies the rate in seconds at which actual user state is saved to " "disk.\n" "\n" "To improve performance and still have great accuracy, Timekpr-nExT accounts " "time in memory at \"Poll interval\" frequency, this setting defines a " "frequency at which user state is saved to disk for permanent storage." msgstr "" "Specifica la frequenza in secondi alla quale lo stato utente effettivo viene " "salvato su disco.\n" "\n" "Per migliorare le prestazioni e avere ancora una maggiore precisione, " "Timekpr-nExT tiene conto del tempo in memoria della frequenza di " "\"Intervallo di polling\", questa impostazione definisce una frequenza alla " "quale lo stato dell'utente viene salvato su disco per l'archiviazione " "permanente." #: resource/client/forms/admin.glade:3137 msgid "Save time" msgstr "Risparmia tempo" #: resource/client/forms/admin.glade:3167 #: resource/client/forms/admin.glade:3202 msgid "" "Number of seconds left for user before enforcing a configured restriction / " "lockout to his sessions.\n" "\n" "After this is reached and user is still active, the user's sessions will be " "handled according to specified restriction / lockout, and almost nothing can " "be done to prevent it." msgstr "" "Numero di secondi rimasti per l'utente prima di applicare una restrizione / " "blocco configurato alle sue sessioni.\n" "\n" "Dopo che questo è stato raggiunto e l'utente è ancora attivo, le sessioni " "dell'utente verranno gestite in base alla restrizione / blocco specificati e " "quasi nulla può essere fatto per impedirlo." #: resource/client/forms/admin.glade:3171 msgid "Termination time" msgstr "Tempo di termine" #: resource/client/forms/admin.glade:3222 msgid "Countdown time" msgstr "Conto alla rovescia" #: resource/client/forms/admin.glade:3239 msgid "Log level" msgstr "Livello di log" #: resource/client/forms/admin.glade:3250 #: resource/client/forms/admin.glade:3266 msgid "" "Number of seconds left for user's available time before sending a final " "critical notification that time is about to run out.\n" "\n" "NOTE: the rest of the notification times are configurable per user by user " "in client application!" msgstr "" "Numero di secondi rimanenti per il tempo disponibile dell'utente prima di " "inviare una notifica finale critica che il tempo sta per scadere.\n" "\n" "NOTA: il resto dei tempi di notifica sono configurabili utente per utente " "nell'applicazione client!" #: resource/client/forms/admin.glade:3254 msgid "Final notification" msgstr "Notifica finale" #: resource/client/forms/admin.glade:3308 msgid "Control Timekpr-nExT tracking items" msgstr "Controllo degli elementi di tracciamento di Timekpr-nExT" #: resource/client/forms/admin.glade:3341 msgid "Tracked Sessions" msgstr "Sessioni monitorate" #: resource/client/forms/admin.glade:3364 msgid "Add tracked session type to the list" msgstr "Aggiungi il tipo di sessione tracciato alla lista" #: resource/client/forms/admin.glade:3379 msgid "Remove tracked session type from the list" msgstr "Rimuovi il tipo di sessione tracciato dall'elenco" #: resource/client/forms/admin.glade:3408 msgid "" "List of session types to be tracked.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Elenco dei tipi di sessione da monitorare.\n" "\n" "Per favore, non cambiarlo o sperimentarlo a meno che tu non sappia " "effettivamente (non desiderosamente) cosa stai facendo." #: resource/client/forms/admin.glade:3442 msgid "Excluded Sessions" msgstr "Sessioni escluse" #: resource/client/forms/admin.glade:3465 msgid "Add an excluded session type to the list" msgstr "Aggiungi il tipo di sessione esclusa all'elenco" #: resource/client/forms/admin.glade:3480 msgid "Remove an excluded session type from the list" msgstr "Rimuovi il tipo di sessione esclusa dall'elenco" #: resource/client/forms/admin.glade:3509 msgid "" "List of sessions to be excluded from tracking.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Elenco delle sessioni da escludere dal monitoraggio.\n" "\n" "Per favore, non cambiarlo o sperimentarlo a meno che tu non sappia " "effettivamente (non desiderosamente) cosa stai facendo." #: resource/client/forms/admin.glade:3543 msgid "Excluded Users" msgstr "Utenti esclusi" #: resource/client/forms/admin.glade:3566 msgid "Add a user to the exclusion list" msgstr "Aggiungi utente all'elenco di esclusione" #: resource/client/forms/admin.glade:3581 msgid "Remove a user from the exclusion list" msgstr "Rimuovi utente dall'elenco di esclusione" #: resource/client/forms/admin.glade:3610 msgid "" "List of users excluded from tracking.\n" "\n" "Please specify actual usernames, not real names here. For example, \"jsmith" "\", not \"John Smith\"." msgstr "" "Elenco di utenti esclusi dal monitoraggio.\n" "\n" "Specifica qui i nomi utente effettivi, non i nomi reali. Ad esempio, \"jsmith" "\", non \"John Smith\"." #: resource/client/forms/admin.glade:3688 #: resource/client/forms/admin.glade:3707 #: resource/client/forms/admin.glade:3743 msgid "" "This setting controls whether PlayTime functionality is enabled.\n" "\n" "This is a PlayTime master switch, if it's turned off, it's turned off for " "everyone regardless of individual settings!" msgstr "" "Questa impostazione controlla se la funzionalità di Gioco è abilitata.\n" "\n" "Questo è un interruttore principale del Tempo di Gioco, se è spento, è " "spento per tutti indipendentemente dalle impostazioni individuali!" #: resource/client/forms/admin.glade:3692 msgid "PlayTime enabled:" msgstr "Tempo di Gioco abilitato:" #: resource/client/forms/admin.glade:3722 msgid "" "This setting controls whether PlayTime activity monitor will use process " "command line, including arguments, for monitoring processes (by default only " "uses the process name).\n" "\n" "When this setting is enabled Timekpr-nExT will perform a match against full " "command line up to 512 characters enabling enhanced process monitoring " "capabilities.\n" "\n" "Please be careful and double check your RegExp patterns in each individual " "user's PlayTime activity masks!" msgstr "" "Questa impostazione controlla se il monitor dell'attività di Gioco " "utilizzerà la riga di comando del processo, inclusi gli argomenti, per il " "monitoraggio dei processi (per impostazione predefinita utilizza solo il " "nome del processo).\n" "\n" "Quando questa impostazione è abilitata, Timekpr-nExT eseguirà una " "corrispondenza con la riga di comando completa fino a 512 caratteri, " "consentendo funzionalità avanzate di monitoraggio del processo.\n" "\n" "Fai attenzione e ricontrolla i tuoi schemi RegExp nelle maschere di attività " "di Gioco di ogni singolo utente!" #: resource/client/forms/admin.glade:3728 msgid "Enhanced activity monitor:" msgstr "Monitoraggio dell'attività migliorato:" #: resource/client/forms/admin.glade:3777 msgid "Apply Timekpr-nExT settings" msgstr "Applica impostazioni Timekpr-nExT" #: resource/client/forms/admin.glade:3782 msgid "Apply all Timekpr-nExT settings at once" msgstr "Applica tutte le impostazioni di Timekpr-nExT contemporaneamente" #: resource/client/forms/admin.glade:3802 msgid "Timekpr-nExT Administration Configuration" msgstr "Configurazione dell'amministrazione di Timekpr-nExT" #: resource/client/forms/admin.glade:3803 msgid "Timekpr-nExT Configuration" msgstr "Configurazione Timekpr-nExT" #: resource/client/forms/admin.glade:3832 #: resource/client/forms/admin.glade:3849 msgid "Status of Timekpr-nExT admin client" msgstr "Stato del client di amministrazione Timekpr-nExT" #. This is one of the notification priorities #: resource/client/forms/client.glade:27 msgid "Information" msgstr "Informazioni" #. This is one of the notification priorities #: resource/client/forms/client.glade:31 msgid "Warning" msgstr "Attenzione" #. This is one of the notification priorities #: resource/client/forms/client.glade:35 msgid "Severe" msgstr "Grave" #. This is one of the notification priorities #: resource/client/forms/client.glade:39 msgid "Critical" msgstr "Critico" #: resource/client/forms/client.glade:133 msgid "Timekpr-nExT client" msgstr "Client Timekpr-nExT" #: resource/client/forms/client.glade:164 msgid "Status of Timekpr-nExT client" msgstr "Stato del client Timekpr-nExT" #: resource/client/forms/client.glade:196 msgid "Save all changes" msgstr "Salva tutte le modifiche" #: resource/client/forms/client.glade:213 msgid "Close the window" msgstr "Chiudi la finestra" #: resource/client/forms/client.glade:297 #: resource/client/forms/client.glade:314 msgid "Current effective username" msgstr "Nome utente corrente" #: resource/client/forms/client.glade:371 msgid "Current statistics" msgstr "Statistiche attuali" #: resource/client/forms/client.glade:396 msgid "Time spent this session or after Timekpr-nExT has been restarted" msgstr "" "Tempo trascorso in questa sessione o dopo che Timekpr-nExT è stato riavviato" #: resource/client/forms/client.glade:398 msgid "Time spent (session):" msgstr "Tempo trascorso (sessione):" #: resource/client/forms/client.glade:441 msgid "Time inactive this session or after Timekpr-nExT has been restarted" msgstr "" "Tempo inattivo in questa sessione o dopo che Timekpr-nExT è stato riavviato" #: resource/client/forms/client.glade:443 msgid "Time inactive:" msgstr "Tempo inattivo:" #: resource/client/forms/client.glade:469 msgid "Continuous time left to you. May span more than the current day." msgstr "Tempo continuo lasciato a te. Può estendersi più del giorno corrente." #: resource/client/forms/client.glade:471 msgid "Continuous time left:" msgstr "Tempo residuo rimanente:" #: resource/client/forms/client.glade:487 msgid "Total time available left today in a row, up to the end of the day" msgstr "" "Tempo totale disponibile rimasto in una riga, fino alla fine della giornata" #: resource/client/forms/client.glade:489 #: resource/client/forms/client.glade:974 msgid "Time left today:" msgstr "Tempo rimasto oggi:" #: resource/client/forms/client.glade:548 msgid "These are the days and limits that are available to you" msgstr "Questi sono giorni e limiti che sono a tua disposizione" #: resource/client/forms/client.glade:573 #: resource/client/forms/client.glade:1171 msgid "Days & Limits" msgstr "Giorni e limiti" #: resource/client/forms/client.glade:609 msgid "" "This shows the time intervals that are available for use.\n" "\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead." msgstr "" "Questo mostra gli intervalli di tempo disponibili per l'uso.\n" "\n" "L'opzione \"∞\" indica che il tempo trascorso durante questo intervallo non " "verrà conteggiato nel limite giornaliero, ma sarà invece considerato " "inattivo." #: resource/client/forms/client.glade:634 msgid "Intervals" msgstr "Intervalli" #: resource/client/forms/client.glade:663 msgid "Daily limits" msgstr "Limiti giornalieri" #: resource/client/forms/client.glade:691 msgid "Additional statistics" msgstr "Statistiche aggiuntive" #: resource/client/forms/client.glade:715 msgid "Time spent this week" msgstr "Tempo trascorso per questa settimana" #: resource/client/forms/client.glade:742 msgid "Time spent this month" msgstr "Tempo trascorso per questo mese" #: resource/client/forms/client.glade:755 msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account.\n" "This varies among desktop environments." msgstr "" "Seleziona se conteggiare il tempo della sessione inattiva.\n" "\n" "Se questa opzione è deselezionata, il tempo trascorso nelle sessioni di " "accesso della console (non dell'emulatore di terminale) e mentre lo schermo " "è bloccato NON viene preso in considerazione.\n" "Questo varia a seconda degli ambienti desktop." #: resource/client/forms/client.glade:760 msgid "Track inactive:" msgstr "Traccia inattiva:" #: resource/client/forms/client.glade:773 msgid "" "Select whether inactive session time is counted. If this is unchecked, time " "spent in console (not terminal emulator) login sessions and while the screen " "is locked is NOT taken into account. This varies among desktop environments." msgstr "" "Se viene conteggiato il tempo per le sessioni inattive, se questo è " "deselezionato, il tempo trascorso in console (non nel terminale) e mentre lo " "schermo è bloccato, NON viene preso in considerazione (varia molto da DE a " "DE)" #: resource/client/forms/client.glade:820 #: resource/client/forms/client.glade:918 msgid "Additional limits" msgstr "Limiti aggiuntivi" #: resource/client/forms/client.glade:844 msgid "Time limit for this week available to you" msgstr "Limite di tempo per settimana disponibile per te" #: resource/client/forms/client.glade:846 msgid "Time limit (week):" msgstr "Limite di tempo (settimana):" #: resource/client/forms/client.glade:872 msgid "Time limit for this month available to you" msgstr "Limite di tempo per il mese a tua disposizione" #: resource/client/forms/client.glade:874 msgid "Time limit (month):" msgstr "Limite di tempo (mese):" #: resource/client/forms/client.glade:948 msgid "Current PlayTime statistics" msgstr "Statistiche di Gioco correnti" #: resource/client/forms/client.glade:972 msgid "Total PlayTime available left today" msgstr "Tempo di Gioco totale rimasto oggi" #: resource/client/forms/client.glade:998 msgid "Total PlayTime spent today" msgstr "Tempo di gioco totale speso oggi" #: resource/client/forms/client.glade:1000 msgid "Time spent today:" msgstr "Tempo trascorso oggi:" #: resource/client/forms/client.glade:1027 #: resource/client/forms/client.glade:1042 msgid "" "This option overrides the default time accounting.\n" "\n" "If it's checked, the time is accounted only when activities in \"Activity / " "application list\" are running, the rest of the time is considered idle." msgstr "" "Questa opzione sostituisce il conteggio del tempo predefinito.\n" "\n" "Se è selezionato, il tempo viene conteggiato solo quando le attività in " "\"Elenco attività / applicazioni\" sono in esecuzione, il resto del tempo è " "considerato inattivo." #: resource/client/forms/client.glade:1046 msgid "Time limit override:" msgstr "Limite di tempo oltrepassato:" #: resource/client/forms/client.glade:1060 #: resource/client/forms/client.glade:1073 msgid "Number of currently active PlayTime activities" msgstr "Numero di attività di Gioco attualmente attive" #: resource/client/forms/client.glade:1062 msgid "Running activities:" msgstr "Attività in corso:" #: resource/client/forms/client.glade:1086 #: resource/client/forms/client.glade:1106 msgid "" "Allow activities during unaccounted (\"∞\") time intervals.\n" "\n" "This setting allows to use applications listed in \"Activity / application " "list\" during time intervals which are marked as unaccounted (\"∞\"), if the " "setting is not enabled, none of activities are allowed to run!" msgstr "" "Consenti attività durante intervalli di tempo (\"∞\") non contabilizzati.\n" "\n" "Questa impostazione consente di utilizzare le applicazioni elencate in " "\"Elenco attività / applicazioni\" durante gli intervalli di tempo " "contrassegnati come non contabilizzati (\"∞\"), se l'impostazione non è " "abilitata, nessuna delle attività può essere eseguita!" #: resource/client/forms/client.glade:1090 msgid "Allowed during \"∞\":" msgstr "Consentito durante \"∞\":" #: resource/client/forms/client.glade:1148 msgid "" "These are days and limits that available to you as part of PlayTime activity " "restrictions" msgstr "" "Questi sono i giorni e i limiti a tua disposizione come parte delle " "limitazioni delle attività di Gioco" #: resource/client/forms/client.glade:1205 msgid "" "This shows activities / applications which are part of PlayTime restrictions" msgstr "" "Questo mostra le attività / applicazioni che fanno parte delle restrizioni " "del Tempo di Gioco" #: resource/client/forms/client.glade:1228 msgid "Activity / application list" msgstr "Elenco attività / applicazioni" #: resource/client/forms/client.glade:1292 msgid "" "Configuration for personalized notifications about available time.\n" "\n" "Please configure notifications as you see fit. However, please keep in mind " "that there will be two types of notifications that cannot be personalized: a " "final warning some time before time ends and a countdown notifications when " "time is about to end.\n" "\n" "The configuration \"Time\" value indicates a value of time left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" "Configurazione per notifiche personalizzate sul tempo disponibile.\n" "\n" "Configura le notifiche come meglio credi. Tuttavia, tieni presente che ci " "saranno due tipi di notifiche che non possono essere personalizzate: un " "avviso finale qualche tempo prima che il tempo finisca e un conto alla " "rovescia quando il tempo sta per scadere.\n" "\n" "Il valore \"Time\" di configurazione indica un valore di tempo rimanente in " "cui verrà mostrata la notifica, l'opzione \"Importance\" regola il colore di " "un'icona e le proprietà di notifica come segue.\n" "\n" "Informazioni: verranno visualizzate un'icona verde e una notifica " "informativa\n" "Avviso: verranno visualizzati un'icona gialla e una notifica informativa\n" "Grave: verranno mostrate un'icona rossa e una notifica importante\n" "Critico: verranno mostrate un'icona rossa e una notifica critica, questa " "notifica di solito viene mostrata su tutte le applicazioni aperte e rimane " "aperta fino a quando non viene chiusa, tuttavia questo comportamento dipende " "fortemente dall'ambiente desktop in uso" #: resource/client/forms/client.glade:1324 msgid "Notification configuration" msgstr "Configurazione notifiche" #: resource/client/forms/client.glade:1346 msgid "Add new notification threshold to the list" msgstr "Aggiungi una nuova soglia di notifica all'elenco" #: resource/client/forms/client.glade:1361 msgid "Remove notification threshold from the list" msgstr "Rimuovi la soglia di notifica dall'elenco" #: resource/client/forms/client.glade:1410 msgid "" "Configuration for personalized notifications about available PlayTime.\n" "\n" "Please configure notifications as you see fit.\n" "\n" "The configuration \"Time\" value indicates a value of PlayTime left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" "Configurazione per notifiche personalizzate sul Tempo di Gioco disponibile.\n" "\n" "Configura le notifiche come meglio credi.\n" "\n" "Il valore \"Time\" di configurazione indica un valore del Tempo di Gioco " "rimanente quando verrà mostrata la notifica, l'opzione \"Importance\" " "governa il colore di un'icona e le proprietà di notifica come segue.\n" "\n" "Informazioni: verranno visualizzate un'icona verde e una notifica " "informativa\n" "Avviso: verranno visualizzati un'icona gialla e una notifica informativa\n" "Grave: verranno mostrate un'icona rossa e una notifica importante\n" "Critico: verranno mostrate un'icona rossa e una notifica critica, questa " "notifica di solito viene mostrata su tutte le applicazioni aperte e rimane " "aperta fino a quando non viene chiusa, tuttavia questo comportamento dipende " "fortemente dall'ambiente desktop in uso" #: resource/client/forms/client.glade:1442 msgid "PlayTime notification configuration" msgstr "Configurazione delle notifiche del Tempo di Gioco" #: resource/client/forms/client.glade:1464 msgid "Add new PlayTime notification threshold to the list" msgstr "Aggiungi una nuova soglia di notifica del Tempo di Gioco all'elenco" #: resource/client/forms/client.glade:1479 msgid "Remove PlayTime notification threshold from the list" msgstr "Rimuovi la soglia di notifica del Tempo di Gioco dall'elenco" #: resource/client/forms/client.glade:1538 msgid "Notifications" msgstr "Notifiche" #: resource/client/forms/client.glade:1562 msgid "" "Select whether to use speech notifications, if available.\n" "\n" "You may be able to make speech notifications available by installing package " "\"python3-espeak\"." msgstr "" "Seleziona se utilizzare le notifiche vocali, se disponibili.\n" "\n" "Potresti essere in grado di rendere disponibili le notifiche vocali " "installando il pacchetto \"python3-espeak\"." #: resource/client/forms/client.glade:1572 msgid "Use speech notifications" msgstr "Usa le notifiche vocali" #: resource/client/forms/client.glade:1591 #: resource/client/forms/client.glade:1613 msgid "" "This sets the logging level.\n" "\n" "Please do not change this unless you know what you're doing." msgstr "" "Questo imposta il livello di registrazione.\n" "\n" "Per favore non cambiarlo a meno che tu non sappia cosa stai facendo." #: resource/client/forms/client.glade:1617 msgid "Logging level" msgstr "Livello di registrazione" #: resource/client/forms/client.glade:1639 msgid "" "Specify whether to show a notification when limit configurations or " "allowance changes" msgstr "" "Se mostrare la notifica quando si modificano le configurazioni limite o la " "tolleranza" #: resource/client/forms/client.glade:1647 msgid "Show limit changes" msgstr "Mostra le modifiche ai limiti" #: resource/client/forms/client.glade:1663 msgid "" "Specify whether to show all notifications.\n" "\n" "If unchecked, then only important ones are shown." msgstr "" "Specifica se mostrare tutte le notifiche.\n" "\n" "Se deselezionato, vengono mostrati solo quelli importanti." #: resource/client/forms/client.glade:1673 msgid "Show all notifications" msgstr "Mostra tutte le notifiche" #: resource/client/forms/client.glade:1689 msgid "" "Specify whether to show seconds in notification area.\n" "\n" "Some desktop environments, like KDE5, do not support text besides " "notification icons." msgstr "" "Specificare se mostrare i secondi nell'area di notifica.\n" "\n" "Alcuni ambienti desktop, come KDE5, non supportano il testo oltre alle icone " "di notifica." #: resource/client/forms/client.glade:1699 msgid "Show seconds in notification area" msgstr "Mostra i secondi nell'area di notifica" #: resource/client/forms/client.glade:1718 #: resource/client/forms/client.glade:1742 msgid "" "This sets how long a notification is shown for regular notifications about " "time left and configuration changes.\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed (not recommended for regular " "notifications).\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Imposta la durata di visualizzazione di una notifica per le notifiche " "regolari sul tempo rimanente e sulle modifiche alla configurazione.\n" "\n" "Il valore è specificato in secondi.\n" "Un valore di 0 significa mostrare fino a quando non viene ignorato (non " "consigliato per le notifiche regolari).\n" "\n" "Tieni presente che l'ambiente desktop che utilizzi potrebbe ignorare questo " "timeout, nel qual caso questa impostazione non avrà alcun effetto sulla " "notifica." #: resource/client/forms/client.glade:1749 msgid "Notification timeout (sec)" msgstr "Timeout notifica (sec)" #: resource/client/forms/client.glade:1774 #: resource/client/forms/client.glade:1799 msgid "" "This sets how long a notification is shown for \"Critical\" notifications " "about time left (when the icon turns red).\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed.\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Imposta la durata di visualizzazione di una notifica per le notifiche " "\"critiche\" sul tempo rimanente (quando l'icona diventa rossa).\n" "\n" "Il valore è specificato in secondi.\n" "Un valore di 0 significa mostrare fino a quando non viene ignorato.\n" "\n" "Tieni presente che l'ambiente desktop che utilizzi potrebbe ignorare questo " "timeout, nel qual caso questa impostazione non avrà alcun effetto sulla " "notifica." #: resource/client/forms/client.glade:1806 msgid "Critical notification timeout (sec)" msgstr "Timeout di notifica critico (sec)" #: resource/client/forms/client.glade:1828 msgid "" "Select whether to use sound \"bell\" (short notification sound) to announce " "a new notification from Timekpr-nExT.\n" "\n" "This works only for enabled notifications.\n" "\n" "If this setting is not editable, your environment does not advertise sound " "notification support." msgstr "" "Seleziona se utilizzare il suono \"campanello\" (breve suono di notifica) " "per annunciare una nuova notifica da Timekpr-nExT.\n" "\n" "Funziona solo per le notifiche abilitate.\n" "\n" "Se questa impostazione non è modificabile, l'ambiente che usi non è in grado " "di supportare per le notifiche sonore." #: resource/client/forms/client.glade:1840 msgid "Use sound \"bell\" for notifications" msgstr "Usa il suono \"beep\" per le notifiche" #: resource/client/forms/client.glade:1860 msgid "Configuration" msgstr "Configurazione" #~ msgid "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Main test (ex): Rinalds Dobelis\n" #~ "Beta test: SanskritFritz" #~ msgstr "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Main test (ex): Rinalds Dobelis\n" #~ "Beta test: SanskritFritz" #~ msgid "" #~ "==> set time left for the user at current moment, example (add one hour)" #~ msgstr "" #~ "==> imposta il tempo rimasto per l'utente al momento attuale,esempio " #~ "(aggiungi un'ora)" #~ msgid "==> set time limits per all allowed days, example" #~ msgstr "" #~ "==> imposta i limiti di tempo per tutti i giorni consentiti, ad esempio" #~ msgid "" #~ "==> set allowed hours per specified day or ALL for every day, example" #~ msgstr "" #~ "==> imposta le ore consentite per giorno specificato o TUTTI per ogni " #~ "giorno, esempio" #~ msgid "==> get user configuration from the server, example" #~ msgstr "==> richiama la configurazione utente dal server, ad esempio" #~ msgid "Excluded session types list is not correct and can not be set" #~ msgstr "" #~ "L'elenco dei tipi di sessione esclusi non è corretto e non può essere " #~ "impostato" #~ msgid "Excluded user list is not correct and can not be set" #~ msgstr "L'elenco utenti esclusi non è corretto e non può essere impostato" #~ msgid "" #~ "Unexpected ERROR getting confguration. Please inspect Timekpr-nExT log " #~ "files" #~ msgstr "" #~ "ERRORE imprevisto durante la configurazione. Controlla i files log di " #~ "Timekpr-nExT" #~ msgid "" #~ "Unexpected ERROR getting user confguration. Please inspect Timekpr-nExT " #~ "log files" #~ msgstr "" #~ "ERRORE imprevisto durante la configurazione dell'utente. Controlla i " #~ "files log di Timekpr-nExT" #~ msgid "" #~ "Unexpected ERROR updating confguration. Please inspect Timekpr-nExT log " #~ "files" #~ msgstr "" #~ "ERRORE inatteso configurazione di aggiornamento. Controlla i files log di " #~ "Timekpr-nExT" #~ msgid "Time limits for days for user have been processed" #~ msgstr "I limiti di tempo dei giorni per l'utente sono stati elaborati" #~ msgid "Please select a hour interval to remove" #~ msgstr "Si prega di selezionare un intervallo di un'ora da rimuovere" #~ msgid "Interval start can not be the same as end" #~ msgstr "L'inizio dell'intervallo non può essere lo stesso della fine" #~ msgid "Interval start or end duplicates existing interval" #~ msgstr "L'intervallo di inizio o fine duplica l'intervallo esistente" #~ msgid "Interval end conflicts with existing one" #~ msgstr "La fine dell'intervallo è in conflitto con quella esistente" #~ msgid "Interval start conflicts with existing one" #~ msgstr "L'inizio dell'intervallo è in conflitto con quello esistente" #~ msgid "Interval overlaps with existing one" #~ msgstr "L'intervallo si sovrappone a quello esistente" #, python-format #~ msgid "Config for %s:" #~ msgstr "Configura per %s:" #~ msgid "00:00:00:00" #~ msgstr "00:00:00:00" #~ msgid "Time spent for this week (saved stated, not real-time)" #~ msgstr "" #~ "Tempo trascorso per questa settimana (salvato dichiarato, non in tempo " #~ "reale)" #~ msgid "Add specified amount (reward)" #~ msgstr "Aggiungi la quantità specificata (ricompensa)" #~ msgid "Amount:" #~ msgstr "Totale:" #~ msgid "Subtract specified amount (penalty)" #~ msgstr "Sottrai la quantità specificata (penalità)" #~ msgid "Configure time limits for week days" #~ msgstr "Configura i limiti di tempo per i giorni della settimana" #~ msgid "Set track inactive sessions" #~ msgstr "Imposta la traccia della sessioni inattive" #~ msgid "Set exacly specified limit" #~ msgstr "Imposta il limite specificato in modo esatto" #~ msgid "Specify START minute of the allowed hour interval" #~ msgstr "Specificare INIZIO minuto dell'intervallo di ore consentito" #~ msgid "Specify START hour of the allowed hour interval" #~ msgstr "Specificare l'ora di INIZIO dell'intervallo di ore consentito" #~ msgid "from" #~ msgstr "da" #~ msgid "Set the amount of hours to limit available time for particular day" #~ msgstr "" #~ "Imposta il numero di ore per limitare il tempo disponibile per un giorno " #~ "particolare" #~ msgid "to" #~ msgstr "a" #~ msgid "Time limit for the month" #~ msgstr "Limite di tempo per il mese" #~ msgid "Specify day's limit" #~ msgstr "Specifica il limite del giorno" #~ msgid "Apply all changes made in this page" #~ msgstr "Applica tutte le modifiche apportate in questa pagina" #~ msgid "Specify END minute of the allowed hour interval" #~ msgstr "Specificare il minuto di FINE dell'intervallo di ore consentito" #~ msgid "Specify END hour of the allowed hour interval" #~ msgstr "Specificare l'ora di FINE dell'intervallo di ore consentito" #~ msgid "Month limit amount (days part)" #~ msgstr "Totale limite mese (parte giorni)" #~ msgid "Time limit (week)" #~ msgstr "Limite di tempo (settimana)" #~ msgid "Time limit for the week is enabled" #~ msgstr "Il limite di tempo per la settimana è abilitato" #~ msgid "Time limit for the month is enabled" #~ msgstr "Il limite di tempo per il mese è abilitato" #~ msgid "Time limit for the week" #~ msgstr "Limite di tempo per la settimana" #~ msgid "Week limit amount (hours part)" #~ msgstr "Totale limite settimana (parte di ore)" #~ msgid "Week limit amount (minutes part)" #~ msgstr "Totale limite settimana (parte minuti)" #~ msgid "day" #~ msgstr "giorno" #~ msgid "Week limit amount (days part)" #~ msgstr "Totale limite settimana (parte dei giorni)" #~ msgid "Time limit (month)" #~ msgstr "Limite di tempo (mese)" #~ msgid "This allows You to set up weekly & monthly limits" #~ msgstr "Questo ti consente di impostare limiti settimanali e mensili" #~ msgid "Apply weekly and monthly limits" #~ msgstr "Applica limiti settimanali e mensili" #~ msgid "Month limit amount (minutes part)" #~ msgstr "Totale limite mese (parte minuti)" #~ msgid "Month limit amount (hours part)" #~ msgstr "Totale limite mese (parte ore)" #~ msgid "Weekly and monthly limit configuration" #~ msgstr "Configurazione limite settimanale e mensile" #~ msgid "This specifies the time interval at which actual user state is saved" #~ msgstr "" #~ "Specifica l'intervallo di tempo in cui viene salvato lo stato dell'utente " #~ "effettivo" #~ msgid "Warning time" #~ msgstr "Tempo di preavviso" #~ msgid "" #~ "Specify session polling time granularity (at which interval user sessions " #~ "and activity are polled).\n" #~ "3 -5 seconds are optimal, don't change this if unsure." #~ msgstr "" #~ "Specificare la granularità del tempo di verifica della sessione (a quale " #~ "intervallo vengono interrogate le sessioni utente e l'attività).\n" #~ "3 -5 secondi sono ottimali, non cambiare questo se non sei sicuro." #~ msgid "Remove excluded session type from the list" #~ msgstr "Rimuovi il tipo di sessione esclusa dall'elenco" #~ msgid "Enter session type to be tracked" #~ msgstr "Inserisci il tipo di sessione da tracciare" #~ msgid "Enter session type to be excluded from tracking" #~ msgstr "Inserisci il tipo di sessione da escludere dal monitoraggio" #~ msgid "Add excluded session type to the list" #~ msgstr "Aggiungi il tipo di sessione esclusa all'elenco" #~ msgid "Remove user from the exclusion list" #~ msgstr "Rimuovi utente dall'elenco di esclusione" #~ msgid "Add user to the exclusion list" #~ msgstr "Aggiungi utente all'elenco di esclusione" #~ msgid "Enter username to be excluded from tracking" #~ msgstr "Inserisci il nome utente da escludere dal monitoraggio" #~ msgid "Apply Timekpr-nExT setings" #~ msgstr "Applicare le impostazioni di Timekpr-nExT" #~ msgid "Continous time left:" #~ msgstr "Tempo residuo rimanente:" #~ msgid "These are days and limits that available to You" #~ msgstr "Questi sono giorni e limiti che sono a tua disposizione" #~ msgid "This shows time intervals that are available for Your use" #~ msgstr "" #~ "Questo mostra gli intervalli di tempo che sono disponibili per il tuo uso" #~ msgid "TIme spent for this week" #~ msgstr "Tempo trascorso per questa settimana" #~ msgid "Continous time left to You which may span to more than a current day" #~ msgstr "" #~ "Tempo residuo lasciato a te che può estendersi a più di un giorno corrente" #~ msgid "Time spent for this month" #~ msgstr "Tempo trascorso per questo mese" #~ msgid "Time limit for month available to You" #~ msgstr "Limite di tempo per il mese a tua disposizione" #~ msgid "Time limit for week available to You" #~ msgstr "Limite di tempo per settimana disponibile per te" #~ msgid "" #~ "This sets logging level (please do not change this unless You know what " #~ "You're doing)" #~ msgstr "" #~ "Questo imposta il livello di registrazione (si prega di non modificare " #~ "questo se non si sa cosa si stia facendo)" #, python-format #~ msgid "User's \"%%s\" set time operation can be one of these: -+=" #~ msgstr "" #~ "L'operazione di tempo impostata dall'utente\"%%s\" può essere una delle " #~ "seguenti: -+=" #~ msgid "Control sessions types list is not correct and can not be set" #~ msgstr "" #~ "L'elenco dei tipi di sessioni di controllo non è corretto e non può " #~ "essere impostato" #, python-format #~ msgid "Final warning time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Il tempo di avviso finale \"%%s\" non è corretto e non può essere " #~ "impostato" #, python-format #~ msgid "Termination time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Il tempo di termine \"%%s\" non è corretto e non può essere impostato" #, python-format #~ msgid "Track inactive \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "La traccia inattiva \"%%s\" non è corretta e non può essere impostata" #, python-format #~ msgid "Log level \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Il livello di registro \"%%s\" non è corretto e non può essere impostato" #, python-format #~ msgid "Poll time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Il tempo di verifica \"%%s\" non è corretto e non può essere impostato" #, python-format #~ msgid "Save time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Risparmio di tempo \"%%s\" non è corretto e non può essere impostato" #, python-format #~ msgid "User's \"%%s\" allowed hours are not correct and can not be set" #~ msgstr "" #~ "Le ore \"%%s\" consentite dall'utente non sono corrette e non possono " #~ "essere impostate" #, python-format #~ msgid "User's \"%%s\" day limits list is not correct and can not be set" #~ msgstr "" #~ "L'elenco dei limiti di giorno \"%%s\" dell'utente non è corretto e non " #~ "può essere impostato" #, python-format #~ msgid "User's \"%%s\" day list is not correct and can not be set" #~ msgstr "" #~ "L'elenco dei giorni \"%%s\" dell'utente non è corretto e non può essere " #~ "impostato" #~ msgid "please-enter-translator-credits" #~ msgstr "Albano Battistella" #, python-format #~ msgid "Icon inititalization error (%%s)!" #~ msgstr "Errore di inizializzazione dell'icona (%%s)!" #~ msgid "" #~ "This is Timekpr-nExT configuration app. It allows you to configure time " #~ "for your users as well as the Timekpr-nExT parameters.\n" #~ "\n" #~ "To use this application, you either have to execute it as superuser or " #~ "have to be part of the timekpr group.\n" #~ "Please note that the \"Timekpr-nExT Configuration\" is available in " #~ "superuser (administrator) mode only!\n" #~ "\n" #~ "Please configure carefully: do not lock yourself out!" #~ msgstr "" #~ "Questa è l'app di configurazione Timekpr-nExT, ti consente di configurare " #~ "il tempo per i tuoi utenti e anche per Timekpr-nExT.\n" #~ "\n" #~ "Per utilizzare questa applicazione devi eseguirla come superutente o " #~ "essere nel gruppo timekpr.\n" #~ "Si noti che \"la configurazione di Timekpr-nExT\" è disponibile solo in " #~ "modalità super-utente (amministratore)!\n" #~ "\n" #~ "Si prega di configurare con attenzione, non chiudetevi fuori!" #~ msgid "" #~ "This allows you to change time for today as well as inactive session " #~ "tracking" #~ msgstr "" #~ "Ciò ti consente di modificare il tempo di oggi per il monitoraggio della " #~ "sessione inattiva" #~ msgid "The amount of minutes to be adjusted for today's limit" #~ msgstr "La quantità di minuti da regolare per il limite di oggi" #~ msgid "The amount of hours to be adjusted for today's limit" #~ msgstr "La quantità di ore da regolare per il limite di oggi" #~ msgid "Add" #~ msgstr "Aggiungi" #~ msgid "Subtract" #~ msgstr "Sottrai" #~ msgid "Set" #~ msgstr "Imposta" #~ msgid "" #~ "Select whether time for inactive sessions are counted. If this is " #~ "unchecked, time spent in console (not terminal) and while screen is " #~ "locked is NOT taken into account (this very much varies from DE to DE)" #~ msgstr "" #~ "Se viene conteggiato il tempo per le sessioni inattive, se questo è " #~ "deselezionato, il tempo trascorso in console (non nel terminale) e mentre " #~ "lo schermo è bloccato, NON viene preso in considerazione (varia molto da " #~ "DE a DE)" #~ msgid "" #~ "Lists day of the week and additional information about the day's limit, " #~ "please enable / disable days for the user" #~ msgstr "" #~ "Elenco dei giorni della settimana e ulteriori informazioni sul limite del " #~ "giorno, si prega di abilitare / disabilitare i giorni per l'utente" #~ msgid "" #~ "Set specified hours and minutes for particular day at user's disposal (do " #~ "not forget to hit the button)" #~ msgstr "" #~ "Imposta le ore e i minuti specificati per un giorno specifico a " #~ "disposizione dell'utente (non dimenticare di premere il pulsante " #~ ")" #~ msgid "" #~ "Hour intervals per day available to user.\n" #~ "Please note that if day ends at 24th hour and next day starts at 0, user " #~ "can work continuously past midnight.\n" #~ "Please note that multiple intervals cannot be configured within the same " #~ "hour. An interval can start or end or contain a specific hour, but not " #~ "more than once (this is by design, not a bug)" #~ msgstr "" #~ "Intervalli di ora al giorno disponibili per l'utente.\n" #~ "Tieni presente che se il giorno termina alle 24 ore e il giorno " #~ "successivo inizia da 0, l'utente può lavorare fino a mezzanotte passata.\n" #~ "Tieni presente che non è possibile configurare più intervalli entro la " #~ "stessa ora, questo può iniziare o terminare o contenere entro un'ora, ma " #~ "non più di una volta (questo è di progettazione, non un bug)" #~ msgid "Manage intervals for the day" #~ msgstr "Gestisci gli intervalli per il giorno" #~ msgid "Remove" #~ msgstr "Rimuovi" #~ msgid "" #~ "Remove selected interval from the list (do not forget to hit the " #~ "button)" #~ msgstr "" #~ "Rimuovi l'intervallo selezionato dall'elenco (non dimenticare di premere " #~ "il pulsante )" #~ msgid "" #~ "Add specified hour interval to the list (do not forget to hit th e " #~ "button)" #~ msgstr "" #~ "Aggiungi l'intervallo di ore specificato all'elenco (non dimenticare di " #~ "premere il pulsante )" #~ msgid "Apply" #~ msgstr "Applica" #~ msgid "Weekly & Monthly limits" #~ msgstr "Limiti settimanali e mensili" #~ msgid "" #~ "Timekpr-nExT log level. Please do not change this unless asked (you " #~ "likely won't find anything pretty in the log files)\n" #~ "1 - standard, 2 - debug, 3 - extra debug" #~ msgstr "" #~ "Timekpr-nExT log level, si prega di non modificare questo a meno che " #~ "richiesto (Probabilmente non troverete nulla di bello nei files log)\n" #~ "1 - standard, 2 - debug, 3 - extra debug" #~ msgid "" #~ "Specify the time in seconds when Timekpr-nExT starts continuous real-time " #~ "countdown before terminating the session" #~ msgstr "" #~ "Specificare il tempo in secondi quando Timekpr-nExT avvia il conto alla " #~ "rovescia in tempo reale prima di terminare la sessione" #~ msgid "" #~ "Amount of seconds before terminating user sessions. After this is " #~ "reached, user will be terminated, nothing can be done to prevent it.\n" #~ "Adding time does not help in this case. Do that before reaching this " #~ "point..." #~ msgstr "" #~ "Quantità di secondi prima di terminare le sessioni utente, dopo che " #~ "questo è stato raggiunto l'utente verrà terminato, non si può fare nulla " #~ "per impedirlo.\n" #~ "Aggiungere tempo non aiuta in questo caso, fallo prima di raggiungere " #~ "questo punto ..." #~ msgid "" #~ "List of session types to be tracked.\n" #~ "Please, do not change or experiment with this unless you actually (not " #~ "wishfully) know what you are doing." #~ msgstr "" #~ "Elenco dei tipi di sessione da tracciare.\n" #~ "Per favore, non cambiare o sperimentare con questo a meno che tu in " #~ "realtà (non lo voglia) sappia cosa stai facendo." #~ msgid "" #~ "List of sessions to be excluded from tracking.\n" #~ "Please, do not change or experiment with this unless you actually (not " #~ "wishfully) know what you are doing." #~ msgstr "" #~ "Elenco delle sessioni da escludere dal tracciamento.\n" #~ "Per favore, non cambiare o sperimentare con questo a meno che tu in " #~ "realtà (non lo voglia) sappia cosa stai facendo." #~ msgid "" #~ "List of users excluded from tracking.\n" #~ "Please specify actual usernames, not real names here (e.g please specify " #~ "jsmith, not John Smith)" #~ msgstr "" #~ "Elenco di utenti esclusi dal monitoraggio.\n" #~ "Si prega di specificare usernames reali e non nomi reali qui (ad es. si " #~ "prega di specificare jsmith, non John Smith)" #~ msgid "" #~ "Select whether to use speech notifications (if not available, this will " #~ "be greyed out). If usage of speech is very much needed, please install " #~ "python3-espeak package" #~ msgstr "" #~ "Se utilizzate le notifiche vocali (se non disponibili, questo sarà " #~ "disattivato), se l'uso del parlato è davvero necessario, si prega di " #~ "installare il pacchetto python3-espeak" #~ msgid "" #~ "Specify whether to show notification when limit configurations or " #~ "allowance changes" #~ msgstr "" #~ "Se mostrare la notifica quando si modificano le configurazioni limite o " #~ "la tolleranza" #~ msgid "" #~ "Specify whether to show all notifications. If unchecked, then only " #~ "important ones are shown" #~ msgstr "" #~ "Se mostrate tutte le notifiche, se deselezionate, vengono mostrate solo " #~ "quelle importanti" #~ msgid "" #~ "Specify whether to show seconds in notification area (some DE, like KDE5, " #~ "do not support text besides notification icons)" #~ msgstr "" #~ "Se mostrati i secondi nell'area di notifica (alcuni DE, come KDE5, non " #~ "supportano il testo affianco alle icone di notifica)" #, python-format #~ msgid "User's \"%%s\" monthly allowance is not correct and can not be set" #~ msgstr "" #~ "Il permesso mensile dell'utente \"%%s\"non è corretto e non può essere " #~ "impostato" #, python-format #~ msgid "User's \"%%s\" set time limit is not correct" #~ msgstr "Il tempo limite impostato dall'utente \"%%s\" non è corretto" #, python-format #~ msgid "User's \"%%s\" set time limit is not correct and can not be set" #~ msgstr "" #~ "Il tempo limite impostato dall'utente \"%%s\" non è corretto e non può " #~ "essere impostato" #, python-format #~ msgid "User's \"%%s\" track inactive flag is not correct and can not be set" #~ msgstr "" #~ "Il contrassegno inattivo della traccia dell'utente\"%%s\" non è corretto " #~ "e non può essere impostato" #, python-format #~ msgid "User's \"%%s\" weekly allowance is not correct and can not be set" #~ msgstr "" #~ "Il permesso settimanale dell'utente\"%%s\" non è corretto e non può " #~ "essere impostato" #, python-format #~ msgid "" #~ "Feature \"%%s\", which is used to detect idle time, can not be enabled!\n" #~ "Idle / inactive time might not be accounted when screen is locked!" #~ msgstr "" #~ "La funzione \"%%s\", utilizzata per rilevare i tempi di inattività, non " #~ "può essere abilitata!\n" #~ "Il tempo di inattività / inattivo potrebbe non essere preso in " #~ "considerazione quando lo schermo è bloccato!" #~ msgid "Hide tray icon is not passed" #~ msgstr "L'icona Nascondi vassoio non viene passata" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct" #~ msgstr "L'icona Nascondi barra delle applicazioni \"%%s\" non è corretta" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "L'icona Nascondi barra delle applicazioni \"%%s\" non è corretta e non " #~ "può essere impostata" #, python-format #~ msgid "User's \"%%s\" hide tray icon flag is not correct and can not be set" #~ msgstr "" #~ "Il flag dell'icona \"%%s\" della barra delle applicazioni dell'utente non " #~ "è corretto e non può essere impostato" #~ msgid "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Super tester: Rinalds Dobelis\n" #~ "Beta tester: SanskritFritz" #~ msgstr "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Super tester: Rinalds Dobelis\n" #~ "Beta tester: SanskritFritz" #~ msgid "This shows information about time left / spent" #~ msgstr "Questo ti mostra informazioni sul tempo rimasto / trascorso" #~ msgid "" #~ "Continuous time left to user which may span to more than a current day " #~ "(realtime, available when user is logged in)" #~ msgstr "" #~ "Tempo continuo lasciato all'utente che può estendersi a più di un giorno " #~ "corrente (in tempo reale, disponibile quando l'utente ha effettuato " #~ "l'accesso)" #~ msgid "" #~ "How long user was inactive since last login (realtime, available when " #~ "user is logged in)" #~ msgstr "" #~ "Per quanto tempo l'utente è rimasto inattivo dall'ultimo accesso (in " #~ "tempo reale, disponibile quando l'utente ha effettuato l'accesso)" #~ msgid "Set preference for showing icon to user" #~ msgstr "Imposta la preferenza per mostrare l'icona all'utente" #~ msgid "" #~ "Select whether to show padlock icon and notifications to user.\n" #~ "Please note that this will disable showing all information and " #~ "notifications to the user!" #~ msgstr "" #~ "Seleziona se mostrare l'icona del lucchetto e le notifiche all'utente.\n" #~ "Nota che questo disabiliterà la visualizzazione di tutte le informazioni " #~ "e le notifiche all'utente!" timekpr-next/resource/locale/fr/000775 001750 001750 00000000000 13476006650 020701 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/fr/LC_MESSAGES/000775 001750 001750 00000000000 14017261747 022470 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/fr/LC_MESSAGES/timekpr.mo000664 001750 001750 00000220244 14017261747 024504 0ustar00bezvfedubezvfedu000000 000000  Q$$ %$'%<L%*%%0%H%C&Q[&&K'5'* (7(+))%*$*u*]X+9+N+D?,8,,,K,"-L>- -(-u-3K.*..$././ 4/U/g/z/+//12)22 3*"3M3<j3333'3434)F4Yp4/4.40)50Z5259555.6?6.]6 66~9&=A= Y= c=@q=e=>.>#L>%p>*><>*>)?8??#?@@8@+K@ w@@,@ @@iAs BGBB!aC/CsC'EAEREZEuEFFF%F*G<9G!vG3G GGGH,H>H%I',I9TI I*I#IIJ* JKJZJ\sL LL M MMsTN N NN#N1 ORO(cO)O OOOOOPP*wMwawtw wwwDw*w))xSxhx|xxxx3x@yDy2Yy.yy y)yz"zBz^z)rz'zzy{"{{#{{B{#;|5_|*||||}}M-}R{}I}N~Hg~S~"'%@$f$' NA`M4?Ft3-?,]0B/:.2iD1A<U+=*$'6L#/'ׅ/A/.q-?Ά,6;Hr5.& 8G6/A.),X>+ĉ 5KScjx64M;(G3f;<֐8LNcv~Gȑ ˑ ّ")9Kev7 = JVW]Xs>Kϗ:VGnXZ,DΚ8LH1'*DW˞G#Ukc9% _iX#ܠW-X-;R-.-@Z)xԣ;[."6ɧ*+:D(F'D,\"=ǩYI_>K?4ItYTm'. ׬SV5% ɳӳ2ʹ17:ST* 3:R;i?͸qTY3t)Һ'ռ*Cо35)O_/I߿3)]q>2RL35N<4/&&GA4*   ,9+T:K5 P:\{8Nb(tB% <Xu&FS &1CGDO? `:|>X =d(C&6"Kn)A#=*Ph32 5OI3;-7-e!-C-' U4_I""$ :[-pF*%-(E!U#w "2Ky ,*6a..H+@,l>AKf79E=<BzX4K3 /Aq_Rs^Ts@IFHK<Sj^Kh% $ 33MK64!V s%5+ 57,m}'+*0*HCs9'9J[@rLK[LCA/."^7>#'?DB'1l!bKyfO,H|cL)Bv]5VME_IJ Z Y GI a K 6? Pv 9 A <C M z _I < V ?=F}NJ?^:UH/Fx_I?iYEI]$tJ  7#DhNGt*)J'BrRNW YzP 1Nj}*   ~% c\qKp$Bg';wo2t#\c 2GL~uD"{1x+Zt.E9Xsi a'_&K aS?0%R5 POkMC!bIgnIl8MR<_eY!Ti T>NrEf/J(97`36Q +sYN*y`|=SzA4VF#U }mAG/WrWnzm|4)]h [L*]BQ(j<^Z ;X5H137k,0vbf: H{"O?CdF=8~U6j->,DJ[$lq ):dw%}@Vou.ve @x^h&Py-p%(n)s minute%(n)s minutes%(n)s second%(n)s seconds%(n)s second left%(n)s seconds left%(n)s second of PlayTime left%(n)s seconds of PlayTime left%(n)s user in total:%(n)s users in total:---=== NOTICE ===---==> get saved user list from the server, example==> get user configuration and time information from the server, example==> print help, example==> set PlayTime activity process masks, for which the time is accounted, example==> set PlayTime left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set PlayTime limits for all allowed days, the number of values must not exceed the allowed PlayTime allowed days for the user, example==> set allowed days for PlayTime activities, example==> set allowed days for the user, example==> set allowed hours for the specified day, or "ALL" for every day, optionally specify start and end minutes in brackets like this [x-y], additionally specify ! in front of hour if it doesn't have to be accounted (free time for user), example==> set restriction / lockout type ("lock" - lock session, "suspend" - suspend the computer, "suspendwake" - suspend and wake up, "terminate" - terminate sessions, "shutdown" - shutdown the computer), examples==> set time left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set time limit per month, example==> set time limit per week, example==> set time limits for all allowed days, the number of values must not exceed the allowed days for the user, example==> set whether PlayTime activities are allowed during unaccounted ("∞") intervals, example==> set whether PlayTime is enabled for the user, example==> set whether PlayTime must be accounted instead of normal activity, example==> set whether to hide tray icon and prevent notifications, example==> set whether to track inactive user sessions, exampleAboutAbout Timekpr-nExTActive PlayTime activity count (realtime, available when user is logged in)Activity / application listActual PlayTime available today (realtime, available when user is logged in)Add a user to the exclusion listAdd an excluded session type to the listAdd new PlayTime activity. Please specify activity mask and user friendly description in the activity list directly.Add new PlayTime notification threshold to the listAdd new notification threshold to the listAdd specified time (reward)Add tracked session type to the listAdditional PlayTime for user has been processedAdditional configurationAdditional configuration optionsAdditional limitsAdditional optionsAdditional statisticsAdditional time for user has been processedAllow PlayTime activities during unaccounted ("∞") time intervals for selected user. This setting allows the user to use applications configured in his PlayTime activity list during time intervals which are marked as unaccounted ("∞"). If this setting is enabled, the use of activities will not be accounted towards PlayTime limits, otherwise applications in PlayTime activity list will be terminated as soon as they are started during unaccounted ("∞") time intervals.Allow activities during unaccounted ("∞") time intervals. This setting allows to use applications listed in "Activity / application list" during time intervals which are marked as unaccounted ("∞"), if the setting is not enabled, none of activities are allowed to run!Allowance adjustmentsAllowed days for user have been processedAllowed during "∞" intervals:Allowed during "∞":Allowed hours for user have been processedApply PlayTime configurationApply PlayTime limits and configuration changes on this pageApply Timekpr-nExT settingsApply additional configuration changes on this pageApply all Timekpr-nExT settings at onceApply configurationApply daily limitsApply limit all changes made in this pageBrief information about time spent and everything related to time management for this dayChoose days to be adjusted for selected period.Choose hours to be adjusted for selected days.Choose hours to be adjusted for selected period.Choose minutes to be adjusted for selected days.Choose minutes to be adjusted for selected period.Choose this to adjust user's PlayTime allowance for todayChoose this to adjust user's time allowance for todayClose the windowCommand FAILED: access deniedCommand FAILED: communication was not acceptedConfigurationConfiguration for personalized notifications about available PlayTime. Please configure notifications as you see fit. The configuration "Time" value indicates a value of PlayTime left when notification will be shown, the "Importance" option governs an icon colour and notification properties as follows. Information - a green icon and an informational notification will be shown Warning - a yellow icon and an informational notification will be shown Severe - a red icon and important notification will be shown Critical - a red icon and critical notification will be shown, this notification usually is shown over all open applications and stays open until dismissed, however this behaviour highly depends on Desktop Environment in useConfiguration for personalized notifications about available time. Please configure notifications as you see fit. However, please keep in mind that there will be two types of notifications that cannot be personalized: a final warning some time before time ends and a countdown notifications when time is about to end. The configuration "Time" value indicates a value of time left when notification will be shown, the "Importance" option governs an icon colour and notification properties as follows. Information - a green icon and an informational notification will be shown Warning - a yellow icon and an informational notification will be shown Severe - a red icon and important notification will be shown Critical - a red icon and critical notification will be shown, this notification usually is shown over all open applications and stays open until dismissed, however this behaviour highly depends on Desktop Environment in useConfiguration for user %s:Configuration retrievedConnectedConnecting...Continuous time left to you. May span more than the current day.Continuous time left. May span more than the current day (realtime, available when user is logged in)Continuous time left:Control Timekpr-nExT SettingsControl Timekpr-nExT tracking itemsControl sessions types are not passedControl sessions types list is not correctControl sessions types list is not correct and cannot be setCopyright (c) 2018-2021 Eduards BezverhijsCountdown timeCreate a new time interval that will be available to the user. After creating the interval, please edit its start and end times directly in interval list.CriticalCritical notification timeout (sec)Current PlayTime statisticsCurrent effective usernameCurrent statisticsDaily limit configuration for all week daysDaily limitsDayDay time limits for user have been processedDays & LimitsDecrease daily PlayTime allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Decrease daily time allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Decrease weekly or monthly time allowance by selected time unit (days or hours or minutes) for the selected period.Delete the selected time interval from the available list of intervals.Eduards Bezverhijs (Translations fine-tuning by JP Lord ) (English fine-tuning by Phil Hudson )Enable PlayTime for selected userEnable PlayTime for the user has been processedEnable PlayTime override for selected user. This setting overrides time accounting in a way that time is accounted only when at least one of the applications on the PlayTime activity list are running! This affects only time accounting, intervals are still fully enforced! If no processes are running, time is accounted as idle thus effectively it's free time for user!Enable PlayTime override:Enable PlayTime:EnabledEnhanced activity monitor:Enter end hour for the automatic wakeup function. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Enter start hour for the automatic wakeup function. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Excluded SessionsExcluded UsersExcluded session types are not passedExcluded session types list is not correctExcluded session types list is not correct and cannot be setExcluded user list is not correctExcluded user list is not correct and cannot be setExcluded user list is not passedFailed to connectFeature "%%s", which is used to detect idle time, cannot be enabled! Idle / inactive time might not be accounted when screen is locked!Final notificationFinal notification time "%%s" is not correctFinal notification time "%%s" is not correct and cannot be setFinal notification time is not passedFinal warning time "%%s" is not correctFinal warning time "%%s" is not correct and cannot be setFinal warning time is not passedFormat: Format: FromHide icon and notifications:Hide tray icon for user has been processedHour intervalsHour intervals for selected day available to the user. Option "∞" indicates that time spent during this interval will not be accounted towards the daily limit, it will be accounted as idle instead. Please note that if the day's limit ends at 24:00 and the next day's limit starts at 00:00, then the user can work continuously past midnight. Please note that multiple intervals cannot be configured within the same hour. An interval can start or end or contain a specific hour, but not more than once. This is by design, not a bug. How long the user was inactive since last login (realtime, available when user is logged in)Icon initialization error (%%s)!Icon, isn't it?ImportanceIncrease daily PlayTime allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Increase daily time allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Increase weekly or monthly time allowance by selected time unit (days or hours or minutes) for the selected period.Info & TodayInformationInformation about PlayTimeInformation about time left / spentInternal connection error, please check log filesInterval removedInterval start cannot be the same as endInterval's start cannot be later than endIntervalsKeep control of computer usageLimitLimit configurationLimits & ConfigurationList of session types to be tracked. Please, do not change or experiment with this unless you actually (not wishfully) know what you are doing.List of sessions to be excluded from tracking. Please, do not change or experiment with this unless you actually (not wishfully) know what you are doing.List of usernames registered on the systemList of users excluded from tracking. Please specify actual usernames, not real names here. For example, "jsmith", not "John Smith".Lists day of the week and additional information about the day's PlayTime limit. Please enable / disable days for the user and set time allowance for PlayTime activities.Lists day of the week and additional information about the day's limit. Please enable / disable days for the user.Log levelLog level "%%s" is not correctLog level "%%s" is not correct and cannot be setLog level is not passedLogging levelMonthlyNotes, read carefully ;)Notification configurationNotification timeout (sec)NotificationsNumber of currently active PlayTime activitiesNumber of seconds left for user before enforcing a configured restriction / lockout to his sessions. After this is reached and user is still active, the user's sessions will be handled according to specified restriction / lockout, and almost nothing can be done to prevent it.Number of seconds left for user's available time before sending a final critical notification that time is about to run out. NOTE: the rest of the notification times are configurable per user by user in client application!PARAMETER PARSE ERROR (please check parameter validity): %%sPeriodPlayTimePlayTime activitiesPlayTime activities for user have been processedPlayTime allowed days for user have been processedPlayTime allowed during unaccounted intervals flag for the user has been processedPlayTime available today (saved stated, not real-time)PlayTime configurationPlayTime day limits for user have been processedPlayTime enabled:PlayTime enhanced activity monitor flag "%%s" is not correctPlayTime enhanced activity monitor flag "%%s" is not correct and cannot be setPlayTime enhanced activity monitor flag is not passedPlayTime flag "%%s" is not correctPlayTime flag "%%s" is not correct and cannot be setPlayTime flag is not passedPlayTime left (actual):PlayTime left (today):PlayTime limitsPlayTime notification configurationPlayTime optionsPlayTime override flag for the user has been processedPlayTime spent (today):PlayTime spent today (saved stated, not real-time)Please reopen the application if you are superuser and Timekpr-nExT is runningPlease select a day to set the limitsPlease select an hour interval to removePlease specify a list of full process (executable) names without path as case sensitive strings to be monitored in the system. It's possible to specify RegExp masks for processes too, but please be very careful about them as misusing this setting may lead to killing unwanted processes for the user! NOTE: RegExp is an expert setting!Poll intervalPoll time "%%s" is not correctPoll time "%%s" is not correct and cannot be setPoll time is not passedProcess descriptionProcess maskRemove PlayTime notification threshold from the listRemove a user from the exclusion listRemove an excluded session type from the listRemove excluded session typeRemove notification threshold from the listRemove selected entry from PlayTime activities.Remove tracked session type from the listRestoreRestore configuration from saved stateRestriction / lockout type for user has been processedRestriction / lockout type:Running activities (actual):Running activities:Save all changesSave timeSave time "%%s" is not correctSave time "%%s" is not correct and cannot be setSave time is not passedSelect a restriction / lockout type for the user. NOTE: please be very careful, think ahead and read every options description when changing this setting from default value!Select a time interval when computer can be woken up automatically. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether to show Timekpr-next's padlock icon and notifications to the user. Please note that unchecking this will disable showing all information and notifications to the user!Select whether to use sound "bell" (short notification sound) to announce a new notification from Timekpr-nExT. This works only for enabled notifications. If this setting is not editable, your environment does not advertise sound notification support.Select whether to use speech notifications, if available. You may be able to make speech notifications available by installing package "python3-espeak".Session polling time granularity which specifies how often user sessions and activity are checked and accounted. 3 - 5 seconds are optimal, don't change this if unsure.Session typeSet this specific time limitSettings for PlayTime activitiesSevereShow all notificationsShow limit changesShow seconds in notification areaSpecify the time in seconds when Timekpr-nExT starts continuous real-time countdown before enforcing a restriction / lockout to user's sessions.Specify whether to show a notification when limit configurations or allowance changesSpecify whether to show all notifications. If unchecked, then only important ones are shown.Specify whether to show seconds in notification area. Some desktop environments, like KDE5, do not support text besides notification icons.StartedStatus of Timekpr-nExT admin clientStatus of Timekpr-nExT clientSubtract specified time (penalty)Termination timeTermination time "%%s" is not correctTermination time "%%s" is not correct and cannot be setTermination time is not passedThat interval overlaps with an existing oneThat interval's end conflicts with an existing oneThat interval's start conflicts with an existing oneThat interval's start or end duplicates an existing oneThe command is incorrect:The number of hours to be adjusted for today's limitThe number of minutes to be adjusted for today's limitThe usage of Timekpr-nExT admin client is as follows:There is a problem communicating to Timekpr-nExT (%%s)!There is a problem connecting to Timekpr-nExT daemon (%%s)!These are days and limits that available to you as part of PlayTime activity restrictionsThese are the days and limits that are available to youThis is the configuration app for Timekpr-nExT. It allows you to set time limits for your individual users as well as general Timekpr-nExT options. To use this application, you either have to execute it as superuser or have to be part of the timekpr group. Please note that the "Timekpr-nExT Configuration" is available in superuser (administrator) mode only! Please configure carefully: do not lock yourself out!This lets you configure PlayTime limits.This lets you configure time limits.This option overrides the default time accounting. If it's checked, the time is accounted only when activities in "Activity / application list" are running, the rest of the time is considered idle.This sets how long a notification is shown for "Critical" notifications about time left (when the icon turns red). The value is specified in seconds. A value of 0 means show until dismissed. Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification.This sets how long a notification is shown for regular notifications about time left and configuration changes. The value is specified in seconds. A value of 0 means show until dismissed (not recommended for regular notifications). Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification.This sets the logging level. Please do not change this unless you know what you're doing.This setting controls whether PlayTime activity monitor will use process command line, including arguments, for monitoring processes (by default only uses the process name). When this setting is enabled Timekpr-nExT will perform a match against full command line up to 512 characters enabling enhanced process monitoring capabilities. Please be careful and double check your RegExp patterns in each individual user's PlayTime activity masks!This setting controls whether PlayTime functionality is enabled. This is a PlayTime master switch, if it's turned off, it's turned off for everyone regardless of individual settings!This shows activities / applications which are part of PlayTime restrictionsThis shows the time intervals that are available for use. Option "∞" indicates that time spent during this interval will not be accounted towards the daily limit, it will be accounted as idle instead.This specifies the rate in seconds at which actual user state is saved to disk. To improve performance and still have great accuracy, Timekpr-nExT accounts time in memory at "Poll interval" frequency, this setting defines a frequency at which user state is saved to disk for permanent storage.TimeTime allowance has changed, please note new time left!Time available today (saved stated, not real-time)Time inactive (actual):Time inactive this session or after Timekpr-nExT has been restartedTime inactive:Time left (actual):Time left (today):Time left today:Time left...Time limit (month):Time limit (week):Time limit configuration has changed, please note new configuration!Time limit for this month available to youTime limit for this week available to youTime limit override:Time spent (month):Time spent (session):Time spent (today):Time spent (week):Time spent this monthTime spent this month (saved stated, not real-time)Time spent this session or after Timekpr-nExT has been restartedTime spent this weekTime spent this week (saved stated, not real-time)Time spent today (saved stated, not real-time)Time spent today:Timekpr-nExTTimekpr-nExT Administration ConfigurationTimekpr-nExT ConfigurationTimekpr-nExT PlayTime notificationTimekpr-nExT administrationTimekpr-nExT clientTimekpr-nExT configuration has been savedTimekpr-nExT interface is not yet readyTimekpr-nExT log level. Please do not change this unless you have to. You likely won't find anything pretty in the log files. Values are: 1 - standard, 2 - debug, 3 - extra debugTimekpr-nExT notificationTimekpr-nExT related configurationToTotal PlayTime available left todayTotal PlayTime spent todayTotal time available left today in a row, up to the end of the dayTrack inactive "%%s" is not correctTrack inactive "%%s" is not correct and cannot be setTrack inactive for user has been processedTrack inactive is not passedTrack inactive sessions:Track inactive:Tracked SessionsUNEXPECTED ERROR: %%sUnexpected ERROR getting configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR getting user configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR getting user list. Please inspect Timekpr-nExT log filesUnexpected ERROR updating configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR updating control. Please inspect Timekpr-nExT log filesUnexpected ERROR while loading configuration. Please inspect Timekpr-nExT log filesUse sound "bell" for notificationsUse speech notificationsUser "%%s" configuration is not foundUser "%%s" control file is not foundUser "%%s" is not foundUser ConfigurationUser PlayTime limits have been savedUser additional options have been savedUser configuration retrievedUser time limits have been savedUser's "%%s" PlayTime allowed during unaccounted intervals flag is not correctUser's "%%s" PlayTime allowed during unaccounted intervals flag is not correct and cannot be setUser's "%%s" PlayTime allowed during unaccounted intervals flag is not passedUser's "%%s" PlayTime day limits list is not correctUser's "%%s" PlayTime day limits list is not correct and cannot be setUser's "%%s" PlayTime day limits list is not passedUser's "%%s" PlayTime day list is not correctUser's "%%s" PlayTime day list is not correct and cannot be setUser's "%%s" PlayTime day list is not passedUser's "%%s" PlayTime enable flag is not correctUser's "%%s" PlayTime enable flag is not correct and cannot be setUser's "%%s" PlayTime enable flag is not passedUser's "%%s" PlayTime operation can be one of these: - + =User's "%%s" PlayTime override flag is not correctUser's "%%s" PlayTime override flag is not correct and cannot be setUser's "%%s" PlayTime override flag is not passedUser's "%%s" PlayTime time limit is not correct and cannot be setUser's "%%s" allowed hours are not correct and cannot be setUser's "%%s" day limits list is not correctUser's "%%s" day limits list is not correct and cannot be setUser's "%%s" day limits list is not passedUser's "%%s" day list is not correctUser's "%%s" day list is not correct and cannot be setUser's "%%s" day list is not passedUser's "%%s" day number must be between 1 and 7User's "%%s" day number must be presentUser's "%%s" hide tray icon flag is not correctUser's "%%s" hide tray icon flag is not correct and cannot be setUser's "%%s" hide tray icon flag is not passedUser's "%%s" monthly allowance is not correctUser's "%%s" monthly allowance is not correct and cannot be setUser's "%%s" monthly allowance is not passedUser's "%%s" restriction / lockout type is not correctUser's "%%s" restriction / lockout type is not correct and cannot be setUser's "%%s" restriction / lockout type is not passedUser's "%%s" set PlayTime limit is not correctUser's "%%s" time limit is not correctUser's "%%s" time limit is not correct and cannot be setUser's "%%s" time operation can be one of these: - + =User's "%%s" track inactive flag is not correctUser's "%%s" track inactive flag is not correct and cannot be setUser's "%%s" track inactive flag is not passedUser's "%%s" weekly allowance is not correctUser's "%%s" weekly allowance is not correct and cannot be setUser's "%%s" weekly allowance is not passedUsernameUsername:Users related configurationVerify configured time intervals. This is a mandatory step to ensure that intervals are correct. Intervals which have problems will be highlighted.WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, but no displays are available, thus running in CLI...Wakeup hour interval:WarningWeek day limitsWeeklyWeekly and monthly limitsWeekly and monthly limits for the user. These limits are applied to user together with the rest of limit configuration.Weekly and monthly limits for user have been processedWhen time ends, computer screen will be locked. This option is not a restriction and is more suited for self control purposes.When time ends, computer will be shut down. This option is a restriction! Please evaluate whether you need this type of restriction!When time ends, computer will be suspended (put to sleep) and will be woken up at start of next available time interval for the user. This option is not a restriction and is more suited for self control purposes. When woken up when there is still no time left, computer screen will be locked and put to sleep again after some time.When time ends, computer will be suspended (put to sleep). This option is not a restriction and is more suited for self control purposes. When woken up when there is still no time left, computer screen will be locked and put to sleep again after some time.When time ends, user sessions will be terminated. This option is a restriction! This is the default option and most likely is the one you need!You have %(n)s hourYou have %(n)s hoursYour time is not limited todayYour time is up, you will be forcibly logged out inYour time is up, your computer will be forcibly shutdown inYour time is up, your computer will be forcibly suspended inYour time is up, your session will be forcibly locked indenter hour intervalsexecutable mask...from...hhours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)hrimportance...lock screenmminn/anumeric time values are in secondsprocess description...session type...shutdown computersuspend / wakeup computersuspend computerterminate sessionstime...timekpr-nextThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . In Debian, see file /usr/share/common-licenses/GPL-3to...today's timeusername...verifyweekdays are numbered according to ISO 8601 (i.e. Monday is the first day, format: 1-7)Project-Id-Version: timekpr-next Report-Msgid-Bugs-To: FULL NAME PO-Revision-Date: 2021-03-01 22:16+0200 Last-Translator: JP Lord Language-Team: French (Canada) Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2021-02-01 12:48+0000 X-Generator: Poedit 2.4.1 %(n)s minute%(n)s minutes%(n)s seconde%(n)s secondes%(n)s seconde à votre session%(n)s secondes à votre session%(n)s seconde de TempsLibre restante%(n)s secondes de TempsLibre restantes%(n)s utilisateur au total :%(n)s utilisateurs au total:---=== REMARQUER ===---==> enregistrer la liste des utilisateurs à partir du serveur, exemple==> obtenir les informations de configuration utilisateur et d'heure du serveur, exemple==> afficher l'aide, exemple==> régler les masques des processus pour lesquels le TempsLibre est considéré, exemple==> régler le TempsLibre restant : "+" pour ajouter du temps, "-" pour réduire le temps, "=" pour régler le temps exact, exemple (ajouter une heure)==> régler les limites de TempsLibre pour les jours choisis. Le nombre de valeurs ne doit pas excéder le nombre de jours de "Temps libre" permis pour l'utilisateur, exemple==> régler les jours permis pour les activités TempsLibre, exemple==> régler les jours permis pour l'utilisateur, exemple==> régler les heures permises pour le jour choisi, ou "ALL" pour tous les jours. Utilisez des crochets [x-y] pour indiquer un intervalle. Utilisez ! devant l'heure pour ne pas tenir compte de cette heure (heure disponible à l'utilisateur), exemple==> régler le type de restriction/verrou ("lock" - verrouiller la session, "suspend" - mettre en veille, "suspendwake" - mettre en veille et réveiller, "terminate" - fermer la session, "shutdown" - arrêter l'ordinateur), exemples==> régler le temps restant pour l'utilisateur à partir de maintenant: "+" (ajouter l'heure), "-" (soustraire l'heure), "=" (définir l'heure exacte disponible), exemple (ajouter une heure)==> régler la limite par mois, exemple==> régler la limite par semaine, exemple==> régler les limites de temps pour les jours choisis. Le nombre de valeurs ne doit pas excéder le nombre de jours permis, exemple==> choisir si TempsLibre est permis durant les intervalles non comptabilisés, exemple==> activer/désactiver l'option TempsLibre pour l'utilisateur, exemple==> choisir si TempsLibre doit être utilisé au lieu de l'activité normale, exemple==> définir s'il faut masquer l'icône de la barre d'état et empêcher les notifications, exemple==> choisir de surveiller les sessions inactives, exempleÀ proposÀ propos de Timekpr-nExTCompteur d'activité en TempsLibre (véritable, disponible à l'ouverture de la session)Liste des activités / applicationsTempsLibre disponible aujourd'hui (véritable, disponible à l'ouverture de la session)Ajouter l'utilisateur à la liste d'exclusionAjouter le type de session exclue à la listeAjouter une nouvelle activité TempsLibre. Veuillez spécifier le masque d'activité et une description conviviale directement dans la liste des activités.Ajouter un niveau d'avertissement du TempsLibre à la listeAjouter un niveau d'avertissement à la listeAjouter la quantité spécifiée (récompense)Ajouter le type de session suivie à la listeLe TempsLibre supplémentaire pour l'utilisateur a été traitéConfiguration supplémentaireOptions de configuration supplémentairesLimites supplémentairesOptions supplémentairesStatistiques supplémentairesLe temps supplémentaire pour l'utilisateur a été traitéPermettre les activités TempsLibre pendant les intervalles de temps non comptabilisés ("∞") pour l'utilisateur sélectionné. Ce réglage permet à l'utilisateur d'utiliser les applications configurées dans la liste des activités TempsLibre pendant les intervalles de temps indiqués comme non comptabilisés ("∞"). Si ce réglage est activé, les activités utilisées ne seront pas comptabilisées dans la limite du TempsLibre, sinon les applications dans la liste des activités TempsLibre seront fermées aussitôt qu'elles sont lancées pendant les intervalles non comptabilisés ("∞").Permettre les activités pendant les intervalles non comptabilisés ("∞"). Ce réglage permet l'utilisation des activités de la liste d'activités pendant les intervalles indiqués comme non comptabilisés ("∞"). Si ce réglage n'est pas activé, aucune activité ne sera autorisée!Ajustements des allocationsLes jours permis pour l'utilisateur ont été traitésPermises pendant les intervalles ("∞") :Permettre durant "∞" :Les heures permises pour l'utilisateur ont été traitéesAppliquer la configuration du TempsLibreAppliquer les limites et la configuration du TempsLibre sur cette pageAppliquer les réglages de Timekpr-nExTAppliquer les changements supplémentaires effectués sur cette pageAppliquer TOUS les réglages de Timekpr-nExTAppliquer la configurationAppliquez les limites quotidiennesAppliquer toutes les modifications effectuées sur cette pageInformation brève sur l'utilisation du temps et sur la gestion du temps pour aujourd'huiChoisissez les jours qui seront ajustés pour la période sélectionnée.Choisissez les heures à ajuster pour les jours sélectionnésChoisissez les heures qui seront ajustées pour la période sélectionnée.Choisissez les minutes à ajuster pour les jours sélectionnésChoisissez les jours qui seront ajustés pour la période sélectionnée.Choisissez ceci pour ajuster l'allocation de TempsLibre de l'utilisateur pour aujourd'huiChoisissez ceci pour ajuster l'allocation de temps de l'utilisateur pour aujourd'huiFermer la fenêtreÉCHEC de l'opération: accès interditÉCHEC de l'opération: communication refuséeRéglagesRéglage des avertissements (temps restant) du TempsLibre personnalisés. Veuillez configurer ces réglages selon vos préférences. Le point de réglage "Temps" indique le TempsLibre restant au moment de l'affichage de l'avertissement. Le point "Importance" gère les propriétés suivantes de l'avertissement: Information - un icône vert et un avertissement d'information est affiché. Attention - un icône jaune et n avertissement d'information est affiché. Sévère - un icône rouge et un avertissement important est affiché. Critique - un icône rouge et un avertissement critique est affiché. Ce type d'avertissement est généralement affiché par-dessus outtes les applications ouvertes et reste affiché jusqu'à ce qu'il soit manuellement fermé, mais reste dépendant de l'environnement de bureau (desktop environnment) utilisé.Avertissements (temps restant) personnalisés. Veuillez configurer ces réglages selon vos préférences. Cependant, souvenez-vous que deux types d'avertissements ne peuvent être personnalisés : l'avertissement final avant que le temps ne soit écoulé et le compte à rebours quand le temps est presque écoulé. Information - un icône vert et un avertissement d'information est affiché. Attention - un icône jaune et n avertissement d'information est affiché. Sévère - un icône rouge et un avertissement important est affiché. Critique - un icône rouge et un avertissement critique est affiché. Ce type d'avertissement est généralement affiché par-dessus outtes les applications ouvertes et reste affiché jusqu'à ce qu'il soit manuellement fermé, mais reste dépendant de l'environnement de bureau (desktop environnment) utilisé.Configuration pour l'utilisateur %s :Configuration trouvéeConnectéConnexion en cours…Temps restant. Peut s'étaler sur plus d'un jour.Temps disponible en continu. Peut être utilisé sur plus que le jour courant (la valeur réelle est disponible quand la session de l'utilisateur est ouverte)Temps restant :Paramètres de Timekpr-nExTContrôle des éléments de suivi de Timekpr-nExTLes types de sessions de contrôle ne sont pas envoyésLa liste des types de sessions de contrôle est incorrecteLa liste des types de sessions de contrôle est incorrecte et ne peux être régléeCopyright (c) 2018-2021 Eduards BezverhijsCompte à reboursCréer un nouvel intervalle qui sera disponible à l'utilisateur. Après la création de l'intervalle, veuillez éditer son temps de début et de fin directement dans la liste des intervalles.CritiqueDélai d'expiration des notifications critiques (s)Statistiques de TempsLibreNom d'utilisateur actifStatistiques actuellesConfiguration des limites pour tous les jours de la semaineLimites quotidiennesJourLes limites quotidiennes pour l'utilisateur ont été traitéesJours et limitesRéduire l'allocation quotidienne de TempsLibre par l'unité de temps sélectionnée (heures ou minutes) pour les jours sélectionnés. Notez que vous pouvez sélectionner plus d'un jour!Réduire les limites quotidiennes par l'unité de temps choisie (heures ou minutes) pour le jour sélectionné. Notez que vous pouvez choisir plus d'une journée!Réduire l'allocation hebdomadaire ou mensuelle en utilisant l'unité de temps choisie (jours, heures ou minutes) pour la période sélectionnée.Effacer l'intervalle de temps sélectionné de la liste des intervalles disponibles.JP Lord Activer TempsLibre pour l'utilisateur sélectionnéTempsLibre pour l'utilisateur est activéActiver le contournement du TempsLibre pour l'utilisateur sélectionné. Ce réglage a préséance sur la comptabilisation du temps de sorte que le temps est comptabilisé seulement lorsqu'une application sur la liste des activités TempsLibre est activée! Ce réglage influence seulement la comptabilisation du temps. Les intervalles de temps sont toujours considérés. Si aucun processus n'est en cours d'utilisation, le temps est comptabilisé comme du temps inactif par l'utilisateur (non comptabilisé)!Activer le contournement du TempsLibre:Activer TempsLibreActivéVérification améliorée des activités :Entrer la fin l'heure de mise en fonction du réveil automatique. Notez que ce réglage fonctionne uniquement si le réveil par l'horloge du système est supporté et activé dans le BIOS / UEFI!Entrer le début l'heure de mise en fonction du réveil automatique. Notez que ce réglage fonctionne uniquement si le réveil par l'horloge du système est supporté et activé dans le BIOS / UEFI!Sessions excluesUtilisateurs exclusLes types de sessions exclues ne sont pas eonvoyésLa liste des types de sessions exclues est incorrecteLa liste des types de sessions exclues est incorrecte et ne peux être régléeLa liste des utilisateurs exclus est incorrecteLa liste des utilisateurs exclus est incorrecte et ne peux être régléeLa liste des utilisateurs exclus n'est pas envoyéeÉchec de connexionLa fonctionnalité "%%s", qui est utilisée pour détecter le temps d'inactivité, ne peut pas être activée! Le temps inactif / inactif peut ne pas être pris en compte lorsque l'écran est verrouillé!Avertissement finalAvertissement final : le temps "%%s" est incorrectAvertissement final : le temps "%%s" est incorrect et ne peut être utiliséAvertissement final que le temps n'est pas écouléL'avertissement de temps écoulé "%%s" est incorrectL'avertissement de temps écoulé "%%s" est incorrect et ne peut être régléL'avertissement final sur le temps n'est pas envoyéFormat : Format : DeMasquer l'icône et les notifications:Masquer l'icône de la barre d'état pour l'utilisateur a été traitéPériodes horairesIntervalles en heure pour le jour sélectionné et pour l'utilisateur. L'option "∞" indique que le temps utilisé durant cet intervalle ne sera pas comptabilisé dans la limite quotidienne. Il sera comptabilisé comme temps inactif. Notez que si la limite se termine à 24:00 et que la limite du jour suivant commence à 00:00, alors l'utilisateur peut continuer à travailler sans interruption à minuit. Notez que des intervalles multiples ne peuvent pas être configurés à l'intérieur de la même heure. Un intervalle peut commencer ou se terminer ou contenir une heure spécifique, mais pas plus d'une fois. C'est un comportement voulu, pas un bug. Durée d'inactivité de l'utilisateur depuis la dernière ouverture de session (la valeur réelle est disponible quand la session de l'utilisateur est ouverte)Erreur d'initialisation de l'icône (%%s)!Icône, n'est-ce pas?importanceAugmenter l'allocation quotidienne de TempsLibre par l'unité de temps sélectionnée (heures ou minutes) pour les jours sélectionnés. Notez que vous pouvez sélectionner plus d'un jour!Augmenter les limites quotidiennes par l'unité de temps choisie (heures ou minutes) pour le jour sélectionné. Notez que vous pouvez choisir plus d'une journée!Augmenter l'allocation hebdomadaire ou mensuelle en utilisant l'unité de temps choisie (jours, heures ou minutes) pour la période sélectionnée.Infos et aujourd'huiInformationsInformation sur TempsLibreInformation sur le temps restant / utiliséErreur de connexion interne, veuillez consulter le journalIntervalle retiréLe début de l'intervalle ne peut être identique à la fin de l'intervalleLe début de l'intervalle ne peut être après la finIntervallesDemeurez en contrôle de l'utilisation de votre ordinateurLimiteConfiguration de la limiteLimites et configurationListe des sessions à vérifier. Veuillez ne pas changer ou expérimenter d'autres valeurs à moins de bien comprendre ce que vous faites (pas seulement pour essayer).Liste des sessions exclues de la vérification. Veuillez indiquer les noms d'utilisateur, par les noms réels. Par exemple, "jsmith", pas "John Smith".Liste des noms d'utilisateur disponibles sur le systèmeListe des utilisateurs exclus de la vérification. Veuillez indiquer les noms d'utilisateur, par les noms réels. Par exemple, "jsmith", pas "John Smith".Listes des jours de la semaine an informations supplémentaires du TempsLibre du jour. Veuillez activer / désactiver les jours pour l'utilisateur et régler l'allocation de temps pour les activités TempsLibre.Liste des jours de la semaine et informations supplémentaires à propos des limites quotidiennes. Veuillez activer / désactiver les jours pour l'utilisateur.Niveau du journalLe niveau de journal "%%s" est incorrectLe niveau de journal "%%s" est incorrect et the peut être régléLe niveau de journal n'est pas passéNiveau du journalMensuelNotes à lire attentivementRéglage des avertissementsDélai de notification (sec)AvertissementsNombre d'acvitiés TempsLibre en coursNombre de secondes restantes avant d'appliquer la restriction / le verrouillage configuré pour la session. À la fin du compte à rebours, si l'utilisateur est toujours actif, la session sera prise en charge selon le réglage programmé dans le champ restriction / verrouillage et rien ne pourra être fait pour l'empêcher.Nombre de secondes restantes avant d'envoyer un avertissement critique et final que le temps est sur le point d'expirer. NOTE : le moment des autres avertissements est réglable par utilisateur et par application!ERREUR D'ANALYSE DE PARAMÈTRE (veuillez vérifier la validité du paramètre): %%sPériodeTempsLibreActivités TempsLibreLes activités de TempsLibre pour l'utilisateur ont été traitéesLes jours de TempsLibre permis pour l'utilisateur ont été traitésLe TempsLibre permis pendant les intervalles non comptabilisés a été traitéTempsLibre disponible aujourd'hui (enregistré, peut différer)Configuration du TempsLibreLes limites quotidiennes de TempsLibre ont été traitéesTempsLibre activé :Le suivi amélioré de l'option TempsLibre "%%s" est incorrectLe suivi amélioré de l'option TempsLibre "%%s" est incorrect et ne peut être utiliséLe suivi amélioré de l'option TempsLibre n'est pas expiréeL'option TempsLibre "%%s" est incorrecteL'option TempsLibre "%%s" est incorrecte et ne peut être utiliséeL'option TempsLibre n'est pas expiréeTempsLibre restant :TempsLibre restant (aujourd'hui) :Limites du TempsLibreRéglage des avertissements du TempsLibreOptions du TempsLibreLe contournement du TempsLibre pour l'utilisateur a été traitéTempsLibre utilisé (aujourd'hui) :TempsLibre utilisé aujourd'hui (enregistré, peut différer)Relancez l'application si vous êtes super utilisateur et que Timekpr-nExT rouleVeuillez choisir un jour avant de fixer les limitesVeuillez choisir un intervalle de temps à retirerVeuillez spécifier la liste complète des noms des processus (exécutables) sans leur chemin de répertoire en tenant comptes des majuscules. Cette liste sera considérée prise en compte dans l'observation du système. Il est également possible d'utiliser des masques de RegExp, mais soyez prudent puisque ces expressions peuvent arrêter des processus valides pour l'utilisateur! NOTE : l'utilisation des RegExp est réservée aux utilisateurs expérimentés!Intervalle de rafraîchissementLa période de rafraîchissement "%%s" est incorrecteLa période de rafraîchissement "%%s" est incorrecte et ne peut être régléeLa période de rafraîchissement n'est pas envoyéeDescription du processusMasque des processusRetirer un niveau d'avertissement du TempsLibre de la listeRetirer l'utilisateur de la liste d'exclusionRetirer le type de session exclue de la listeRetirez le type de session exclueRetirer un niveau d'avertissement de la listeRetirer l'item sélectionné de la liste des activités TempsLibre.Retirer le type de session suivie de la listeRétablirRétablir les paramètres de la version enregistréeLe type de contrainte / verrouillage pour l'utilisateur a été appliquéType de contrainte / verrouillage:Activités en cours (véritable) :Activités en cours :Enregistrer tous les changementsEnregistrer le tempsLe temps d'enregistrement "%%s" est incorrectLe temps d'enregistrement "%%s" est incorrect et ne peut être régléLe temps d'enregistrement n'est pas passéChoisir une restriction / type de verrouillage pour l'utilisateur. NOTE : soyez prudent, réfléchissez bien et lisez chacune des options en modifiant la valeur par défaut de ce réglage!Choisir un intervalle de temps où l'ordinateur peut être réveillé automatiquement. Notez que ce réglage fonctionne uniquement si le réveil par l'horloge du système est supporté et activé dans le BIOS / UEFI!Choisir si le temps inactif est comptabilisé. Si ce réglage n'est pas coché, le temps passé en console (pas en émulateur de terminal) et pendant le verrouillage de l'écran ne sera PAS comptabilisé. L'effet de ce réglage varie selon les environnements de bureau (desktop environnment).Déterminer si le temps de session inactif est comptabilisé. Si ce réglage n'est pas coché, le temps passé en mode console (excluant l'émulateur du terminal) et pendant le verrouillage de l'écran n'est PAS comptabilisé. L'effet varie selon les environnements de bureau (desktop environments).Si le temps pour les sessions inactives est compté, si cette option est désactivée, le temps passé dans la console (pas le terminal) et si l'écran est verrouillé, n'est PAS pris en compte (ceci varie beaucoup selon les environments de bureau)Choisir d'afficher l'icône du cadenas de Timekpr-nExT et les avertissements à l'utilisateur. Notez que désactiver cette option empêchera toute information de parvenir à l'utilisateur!Activer le beep du système à l'affichage d'un nouvel avertissement de Timekpr-nExT. Cette option fonctionne uniquement pour les avertissements actifs. Si vous ne pouvez modifier ce réglage, c'est que votre environnement de bureau ne supporte pas l'utilisation du son dans les avertissements.Activer les avertissements vocaux, s'ils sont disponibles. Il peut être possible d'activer les avertissements vocaux disponibles en installant le paquet "python3-espeak".Fréquence de vérification de la comptabilisation des sessions utilisateurs. 3 à 5 secondes représente une valeur optimale. Ne changez pas ce réglage sans savoir ce que vous faites.Type de sessionRégler la limite de temps exacteRéglages des activités TempsLibreSévèreAfficher tous les avertissementsAfficher les changements de limiteAfficher les secondes dans la zone d'avertissementSpécifier le temps en secondes où Timekpr-nExT débute le compte à rebours en temps réel avant d'appliquer la restriction / le verrouillage de la session de l'utilisateur.Activation des avertissements quand les limites ou les allocations changentAfficher tous les avertissements. Si ce réglage n'est pas coché, seuls les avertissements importants seront affichés.Afficher les secondes dans les avertissements. Des environnements de bureau (KDE par exemple) ne supportent pas le texte sur les icônes d'avertissement.DémarréÉtat du client de gestion de Timekpr-nExTÉtat du client de Timekpr-nExTSoustraire la quantité spécifiée (punition)Temps de fin de sessionL'heure de fin de session "%%s" est incorrecteL'heure de fin de session "%%s" est incorrecte et ne peut être régléeL'heure de fin de session n'est pas passéeL'intervalle chevauche l'intervalle existantLa fin de l'intervalle est en conflit avec la valeur existanteLe début de l'intervalle est en conflit avec la valeur existanteLe début ou la fin de l'intervalle est un doublon de l'intervalle existantLa commande est incorrecte :Nombre d'heure(s) à ajuster à la limite d'aujourd'huiNombre de minute(s) à ajuster à la limite d'aujourd'huiL'utilisation du client de gestion de Timekpr-nExT est la suivante :Il y a un problème de communication avec Timekpr-nExT (%%s)!Il y a un problème de connexion au service de Timekpr-nExT (%%s)!Voici les jours et les limites disponibles pour la restriction des activités TempsLibreJours et limites qui sont associés à l'utilisateurVous êtes dans l'app de configuration pour Timekpr-nExT. Elle vous permet de régler les limites de temps pour chaque utilisateur ainsi que les options générales de Timekpr-nExT. Vous devez exécuter cette application en tant que superutilisateur ou faire partie du groupe timekpr. Notez que "Configuration de Timekpr-nExT" est disponible seulement en mode superutilisateur (administrateur). Configurez prudemment : ne bloquez pas votre accès!Vous permet de configurer les limites du TempsLibreVous permet de configurer les limites de temps.Cette option contourne la comptabilisation du temps par défaut. Si elle est cochée, le temps n'est comptabilisé que les activités de la liste d'activités sont en cours. Le reste du temps est considéré comme inactif.Délai d'affichage d'un avertissement pour un avertissement critique à propos du temps restant (icône rouge). Cette valeur est en secondes. Une valeur de 0 indique que l'avertissement sera affiché jusqu'à ce qu'il soit manuellement fermé. Notez que l'environnement du bureau peut contourner ce délai. Dans ce cas, ce réglage n'a aucun effet.Délai d'affichage d'un avertissement pour un avertissement normal à propos du temps restant et d'un changement de réglage. Cette valeur est en secondes. Une valeur de 0 indique que l'avertissement sera affiché jusqu'à ce qu'il soit manuellement fermé (n'est pas recommandé pour les avertissements non critiques). Notez que l'environnement du bureau peut contourner ce délai. Dans ce cas, ce réglage n'a aucun effet.Régler le niveau de journalisation. Veuillez ne pas modifier ce paramètre à moins de savoir ce que vous faites.L'activation de ce réglage activera la vérification des arguments des processus lancés par ligne de commande (la vérification par défaut utilise uniquement le nom du processus). Lorsque ce réglage est activé, Timekpr-nExT vérifiera toute la ligne de commande jusqu'à 512 caractères pour mieux cibler les processus. Soyez prudent et vérifiez deux fois les expression RegExp pour chacun des masques des utilisateurs de TempsLibre.Ce réglage contrôle si la fonction TempsLibre est activée ou non. Ce réglage est le commutateur principal de la fonction TempsLibre. S'il est désactivé, TempsLibre sera désactivé pour tous les utilisateurs peu importe leurs configurations individuelles.Affiche les activités / applications qui font partie des restrictions du TempsLibreAfficher les intervalles de temps configurés et disponibles. L'option "∞" indique que le temps utilisé pendant l'intervalle ne sera pas comptabilisé dans la limite quotidienne. Il sera comptabilisé comme temps inactif.Spécifie la fréquence en secondes d'enregistrement de l'état de l'utilisateur sur le disque. Pour améliorer la performance en maintenant une bonne précision, Timekpr-nExT ajuste l'état de l'utilisateur en mémoire vive à la "fréquenced de vérification". Ce réglage spécifie uniquement la fréquence à laquelle l'information est consignée sur le disque dur.TempsVotre allocation a changé, veuillez prendre note de votre nouveau temps!Temps disponible aujourd'hui (enregistré déclaré, pas en temps réel)Temps inactif (réel):Temps d'inactivité de la session ou depuis le redémarrage de Timekpr-nExTTemps d'inactivité :Temps restant (réel):Temps restant (aujourd'hui):Temps restant aujourd'hui :Temps restant...Limite de temps (mois) :Limite de temps (semaine) :Votre configuration de temps a changé, veuillez prendre note de votre nouvelle configuration!Limite de temps pour le moisLimite de temps pour la semaineContournement de la limite de temps :Temps d'utilisation (mois) :Temps d'utilisation (session) :Temps d'utilisation (aujourd'hui) :Temps d'utilisation (semaine) :Temps utilisé ce mois-ciTemps d'utilisation ce mois-ci (pas en temps réel)Temps d'utilisation de la session ou depuis le redémarrage de Timekpr-nExTTemps utilisé cette semaineTemps d'utilisation cette semaine (pas en temps réel)Temps d'utilisation aujourd'hui (pas en temps réel)Temps utilisé aujourd'hui :Timekpr-nExTParamètre de gestion de Timekpr-nExTLa configuration de Timekpr-nExT a été enregistréeAvertissement de TempsLibre de Timekpr-nExTGestion de Timekpr-nExTClient de Timekpr-nExTLa configuration de Timekpr-nExT a été enregistréeL'interface de Timekpr-nExT n'est pas prêteNiveau de journalisation de Timekpr-nExT. Évitez de changer ce réglage à moins que ça ne soit nécessaire. Vous risquez de ne rien trouver d'utile dans les logs. Valeurs possibles : 1- standard, 2- debug, 3- extra debutMessage de Timekpr-nExTConfiguration associée à Timekpr-nExTÀDurée de TempsLibre disponible aujourd'huiDurée de TempsLibre utilisée aujourd'huiTemps total consécutif disponible (aujourd'hui)Le suivi d'inactivité "%%s" est incorrectLe suivi d'inactivité "%%s" est incorrect et ne peut être régléLe suivi d'inactivité pour l'utilisateur a été traitéLe suivi d'inactivité n'est pas passéSuivi des sessions inactives :Suivi inactif :Sessions suiviesERREUR INATTENDUE: %%SERREUR inattendue en obtenant la configuration. Consultez le logERREUR inattendue en obtenant la configuration utilisateur. Consultez le logERREUR inattendue (obtenir la liste des utilisateurs). Vérifiez le journalERREUR inattendue lors de la mise à jour de la configuration utilisateur. Consultez le logERREUR inattendue (mise à jour du contrôle). Vérifiez le journalERREUR inattendue (chargement de la config). Vérifiez le journalUtiliser un "bip" sonore pour les notificationsUtiliser des avertissements vocauxLa configuration de l'utilisateur "%%s" est introuvableLa fichier de contrôle de l'utilisateur "%%s" est introuvableL'utilisateur "%%s" est introuvableConfiguration de l'utilisateur trouvéeLes limites de TempsLibre pour l'utilisateur sont enregistréesLes options supplémentaires pour l'utilisateur sont enregistréesConfiguration de l'utilisateur trouvéeLes limites pour l'utilisateur sont enregistréesLa permission de TempsLibre durant les intervalles non comptabilisés pour l'utilisateur "%%s" est incorrectLa permission de TempsLibre durant les intervalles non comptabilisés pour l'utilisateur "%%s" est incorrect et ne peux être utiliséeLe TempsLibre durant les intervalles non comptabilisés pour l'utilisateur "%%s" n'est pas expiréLa limite quotidienne de TempsLibre pour l'utilisateur "%%s" est incorrecteLa limite quotidienne de TempsLibre pour l'utilisateur "%%s" est incorrecte et ne peut être utiliséeLa limite quotidienne de TempsLibre pour l'utilisateur "%%s" n'est pas expiréeLa liste des jours de TempsLibre pour l'utilisateur "%%s" est incorrecteLa liste des jours de TempsLibre pour l'utilisateur "%%s" est incorrecte et ne peut être utiliséeLa liste des jours de TempsLibre pour l'utilisateur "%%s" n'est pas expiréeL'activation de TempsLibre pour l'utilisateur "%%s" est incorrecteL'activation de TempsLibre pour l'utilisateur "%%s" est incorrecte et ne peut être utiliséeTempsLibre pour l'utilisateur "%%s" n'est pas expiréLes opérations sur le TempsLibre de l'utilisateur "%%s" peuvent être "+", "-" ou "="Le contournement du TempsLibre pour l'utilisateur "%%s" est incorrectLe contournement du TempsLibre pour l'utilisateur "%%s" est incorrect et ne peut être utiliséLe contournement du TempsLibre pour l'utilisateur "%%s" n'est pas expiréLa limite de TempsLibre pour l'utilisateur "%%s" est incorrecte et ne peut être utiliséeLes heures permises de l'utilisateur "%%s" sont incorrectes et ne peuvent être régléesLa liste des limites quotidiennes de l'utilisateur "%%s" est incorrecteLa liste des limites quotidiennes de l'utilisateur "%%s" est incorrecte et ne peut être régléeLa liste des limites quotidiennes de l'utilisateur "%%s" n'est pas envoyéeLa liste de jour de l'utilisateur "%%s" est incorrecteLa liste de jour de l'utilisateur "%%s" est incorrecte et ne peut être régléeLa liste de jour de l'utilisateur "%%s" n'est pas passéeLe numéro du jour de l'utilisateur "%%s" doit être entre 1 et 7Le numéro du jour de l'utilisateur "%%s" doit être inscritL'indicateur de masquage de l'icône "%%s" de l'utilisateur n'est pas correctLe réglage pour masquer 'icône de la barre d'état pour l'utilisateur "%%s" et incorrect et ne peut pas être configuréL'indicateur d'icône de masquage de la barre d'état "%%s" de l'utilisateur n'est pas transmisL'allocation mensuelle de l'utilisateur "%%s" est incorrecteL'allocation mensuelle de l'utilisateur "%%s" est incorrecte et ne peut être régléeL'allocation mensuelle de l'utilisateur "%%s" n'est pas passéeLa contrainte / le verrouillage pour l'utilisateur "%%s" est incorrectLe type de contrainte / verrouillage est incorrect et ne peut être configuréLa contrainte / le verrouillage pour l'utilisateur "%%s" n'est pas atteintLa limite de TempsLibre pour l'utilisateur "%%s" est incorrecteLa limite de temps pour l'utilisateur "%%s" est incorrecteLa limite de temps pour l'utilisateur "%%s" est incorrecte et ne peux être utiliséeLe temps d'utilisation de l'utilisateur "%%s" peut être "+", "-" ou "="Le témoin de suivi d'inactivité de l'utilisateur "%%s" est incorrectLe témoin de suivi d'inactivité de l'utilisateur "%%s" est incorrect et ne peut être régléLe témoin de suivi d'inactivité de l'utilisateur "%%s" n'est pas passéL'allocation hebdomadaire de l'utilisateur "%%s" est incorrecteL'allocation hebdomadaire de l'utilisateur "%%s" est incorrecte et ne peut être régléeL'allocation hebdomadaire de l'utilisateur "%%s" n'est pas dépasséeNom d’utilisateurNom d’utilisateur :Paramètres reliés aux utilisateursVérifier les intervalles de temps configurés est une étape nécessaire pour assurer que les intervalles sont valides. Les intervalles non conformes seront mis en évidence.AVERTISSEMENT: l'interface de gestion de Timekpr-nExT devait être lancée en mode graphique, mais aucun affichage n'est disponible. Elle fonctionne donc en ligne de commande...Délai de réveil:AttentionLimites des jours de semaineHebdomadaireLimites hebdomadaires et mensuellesLimites hebdomadaire et mensuelle pour l'utilisateur. Ces limites sont appliquées pour l'utilisateur en plus des autres limites configurées.Les limites hebdomadaires et mensuelles pour l'utilisateur ont été traitéesÀ l'expiration du temps, l'écran de l'ordinateur sera verrouillé. Cette option est une restriction et est mieux adaptée pour gérer l'auto-restriction de son ordinateur!À l'expiration du temps, l'ordinateur sera arrêté. Cette option est une restriction! Veuillez évaluer avec soin si vous avez besoin d'utiliser cette restriction!À l'expiration du temps, l'ordinateur sera mis en veille et réveillé au début du prochain intervalle disponible pour l'utilisateur. Cette option est une restriction et est mieux adaptée pour gérer l'auto-restriction de son ordinateur! Au réveil, s'il n'y a plus de temps disponible, l'écran sera verrouillé et l'ordinateur sera remis en veille après un moment.À l'expiration du temps, l'ordinateur sera mis en veille. Cette option est une restriction! Au réveil de l'ordinateur, s'il n'y a toujours plus de temps disponible, l'écran demeurera verrouillé et l'ordinateur sera remis en veille après un moment.À l'expiration du temps, la session de l'utilisateur sera fermée. Cette options est une restriction! Cette option est la valeur par défaut et probablement celle que vous voulez utiliser!Il reste %(n)s heureIl reste %(n)s heuresVotre temps n'est pas limité aujourd'huiVotre temps est expiré, votre session sera automatiquement terminée dansTemps expiré, votre ordinateur sera automatiquement arrêté dansVotre temps est écoulé, votre ordinateur sera automatiquement mis en veille dansVotre temps est écoulé, votre session sera automatiquement verrouillée dansjentrez les intervalles en heuresmasque exécutable...de...hles heures sont numérotées selon ISO 8601 (c.-à-d. horloge 24h, format: 0-23)himportance...verrouillage de l'écranmminn/ales valeurs de temps numériques sont en secondesdescription du processus...type de session...extinction de l'ordinateurmise en veille / rallumage de l'ordinateurmise en veille de l'ordinateurinterrompre les sessionstemps...Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant les termes de la GNU General Public License telle que publiée par la Free Software Foundation , soit la version 3 de la Licence, soit (à votre gré) toute version ultérieure. Ce programme est distribué dans l’espoir qu’il sera utile, mais SANS AUCUNE GARANTIE : sans même la garantie implicite de COMMERCIALISABILITÉ 16 ni d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez la GNU General Public License pour plus de détails. Vous devriez avoir reçu une copie de la GNU General Public License avec ce programme ; si ce n’est pas le cas, consultez : . Sur Debian, consultez /usr/share/common-licenses/GPL-3à...le temps aujourd'huinom d'utilisateur...vérifierles jours de la semaine sont numérotés selon la norme ISO 8601 (c'est-à-dire que le lundi est le premier jour, format: 1-7)timekpr-next/resource/locale/fr/LC_MESSAGES/timekpr.po000664 001750 001750 00000355370 14017261747 024520 0ustar00bezvfedubezvfedu000000 000000 # French (Canada) translation for timekpr-next # Copyright (c) 2019 Rosetta Contributors and Canonical Ltd 2019 # This file is distributed under the same license as the timekpr-next package. # FIRST AUTHOR , 2019. # msgid "" msgstr "" "Project-Id-Version: timekpr-next\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2021-03-01 22:11+0200\n" "PO-Revision-Date: 2021-03-01 22:16+0200\n" "Last-Translator: JP Lord \n" "Language-Team: French (Canada) \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2021-02-01 12:48+0000\n" "X-Generator: Poedit 2.4.1\n" #: common/constants/messages.py:31 msgid "==> print help, example" msgstr "==> afficher l'aide, exemple" #: common/constants/messages.py:32 msgid "==> get saved user list from the server, example" msgstr "==> enregistrer la liste des utilisateurs à partir du serveur, exemple" #: common/constants/messages.py:33 msgid "" "==> get user configuration and time information from the server, example" msgstr "" "==> obtenir les informations de configuration utilisateur et d'heure du " "serveur, exemple" #: common/constants/messages.py:34 msgid "==> set allowed days for the user, example" msgstr "==> régler les jours permis pour l'utilisateur, exemple" #. TRANSLATORS: please DO NOT translate the keyword "ALL" #: common/constants/messages.py:36 msgid "" "==> set allowed hours for the specified day, or \"ALL\" for every day, " "optionally specify start and end minutes in brackets like this [x-y], " "additionally specify ! in front of hour if it doesn't have to be accounted " "(free time for user), example" msgstr "" "==> régler les heures permises pour le jour choisi, ou \"ALL\" pour tous les " "jours. Utilisez des crochets [x-y] pour indiquer un intervalle. Utilisez ! " "devant l'heure pour ne pas tenir compte de cette heure (heure disponible à " "l'utilisateur), exemple" #: common/constants/messages.py:37 msgid "" "==> set time limits for all allowed days, the number of values must not " "exceed the allowed days for the user, example" msgstr "" "==> régler les limites de temps pour les jours choisis. Le nombre de " "valeurs ne doit pas excéder le nombre de jours permis, exemple" #: common/constants/messages.py:38 msgid "==> set time limit per week, example" msgstr "==> régler la limite par semaine, exemple" #: common/constants/messages.py:39 msgid "==> set time limit per month, example" msgstr "==> régler la limite par mois, exemple" #: common/constants/messages.py:40 msgid "==> set whether to track inactive user sessions, example" msgstr "==> choisir de surveiller les sessions inactives, exemple" #: common/constants/messages.py:41 msgid "==> set whether to hide tray icon and prevent notifications, example" msgstr "" "==> définir s'il faut masquer l'icône de la barre d'état et empêcher les " "notifications, exemple" #. TRANSLATORS: please DO NOT translate the keywords: "lock", "suspend", "suspendwake", "terminate", "shutdown" #: common/constants/messages.py:43 msgid "" "==> set restriction / lockout type (\"lock\" - lock session, \"suspend\" - " "suspend the computer, \"suspendwake\" - suspend and wake up, \"terminate\" - " "terminate sessions, \"shutdown\" - shutdown the computer), examples" msgstr "" "==> régler le type de restriction/verrou (\"lock\" - verrouiller la session, " "\"suspend\" - mettre en veille, \"suspendwake\" - mettre en veille et " "réveiller, \"terminate\" - fermer la session, \"shutdown\" - arrêter " "l'ordinateur), exemples" #: common/constants/messages.py:44 msgid "" "==> set time left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> régler le temps restant pour l'utilisateur à partir de maintenant: \"+" "\" (ajouter l'heure), \"-\" (soustraire l'heure), \"=\" (définir l'heure " "exacte disponible), exemple (ajouter une heure)" #: common/constants/messages.py:45 msgid "==> set whether PlayTime is enabled for the user, example" msgstr "==> activer/désactiver l'option TempsLibre pour l'utilisateur, exemple" #: common/constants/messages.py:46 msgid "" "==> set whether PlayTime must be accounted instead of normal activity, " "example" msgstr "" "==> choisir si TempsLibre doit être utilisé au lieu de l'activité normale, " "exemple" #: common/constants/messages.py:47 msgid "" "==> set whether PlayTime activities are allowed during unaccounted (\"∞\") " "intervals, example" msgstr "" "==> choisir si TempsLibre est permis durant les intervalles non " "comptabilisés, exemple" #: common/constants/messages.py:48 msgid "==> set allowed days for PlayTime activities, example" msgstr "==> régler les jours permis pour les activités TempsLibre, exemple" #: common/constants/messages.py:49 msgid "" "==> set PlayTime limits for all allowed days, the number of values must not " "exceed the allowed PlayTime allowed days for the user, example" msgstr "" "==> régler les limites de TempsLibre pour les jours choisis. Le nombre de " "valeurs ne doit pas excéder le nombre de jours de \"Temps libre\" permis " "pour l'utilisateur, exemple" #: common/constants/messages.py:50 msgid "" "==> set PlayTime activity process masks, for which the time is accounted, " "example" msgstr "" "==> régler les masques des processus pour lesquels le TempsLibre est " "considéré, exemple" #: common/constants/messages.py:51 msgid "" "==> set PlayTime left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> régler le TempsLibre restant : \"+\" pour ajouter du temps, \"-\" pour " "réduire le temps, \"=\" pour régler le temps exact, exemple (ajouter une " "heure)" #: common/constants/messages.py:54 msgid "Control sessions types are not passed" msgstr "Les types de sessions de contrôle ne sont pas envoyés" #: common/constants/messages.py:55 msgid "Control sessions types list is not correct" msgstr "La liste des types de sessions de contrôle est incorrecte" #: common/constants/messages.py:56 msgid "Control sessions types list is not correct and cannot be set" msgstr "" "La liste des types de sessions de contrôle est incorrecte et ne peux être " "réglée" #: common/constants/messages.py:57 msgid "Excluded session types are not passed" msgstr "Les types de sessions exclues ne sont pas eonvoyés" #: common/constants/messages.py:58 msgid "Excluded session types list is not correct" msgstr "La liste des types de sessions exclues est incorrecte" #: common/constants/messages.py:59 msgid "Excluded session types list is not correct and cannot be set" msgstr "" "La liste des types de sessions exclues est incorrecte et ne peux être réglée" #: common/constants/messages.py:60 msgid "Excluded user list is not passed" msgstr "La liste des utilisateurs exclus n'est pas envoyée" #: common/constants/messages.py:61 msgid "Excluded user list is not correct" msgstr "La liste des utilisateurs exclus est incorrecte" #: common/constants/messages.py:62 msgid "Excluded user list is not correct and cannot be set" msgstr "La liste des utilisateurs exclus est incorrecte et ne peux être réglée" #: common/constants/messages.py:63 msgid "Final warning time is not passed" msgstr "L'avertissement final sur le temps n'est pas envoyé" #: common/constants/messages.py:64 #, python-format msgid "Final warning time \"%%s\" is not correct" msgstr "L'avertissement de temps écoulé \"%%s\" est incorrect" #: common/constants/messages.py:65 #, python-format msgid "Final warning time \"%%s\" is not correct and cannot be set" msgstr "" "L'avertissement de temps écoulé \"%%s\" est incorrect et ne peut être réglé" #: common/constants/messages.py:66 msgid "Final notification time is not passed" msgstr "Avertissement final que le temps n'est pas écoulé" #: common/constants/messages.py:67 #, python-format msgid "Final notification time \"%%s\" is not correct" msgstr "Avertissement final : le temps \"%%s\" est incorrect" #: common/constants/messages.py:68 #, python-format msgid "Final notification time \"%%s\" is not correct and cannot be set" msgstr "" "Avertissement final : le temps \"%%s\" est incorrect et ne peut être utilisé" #: common/constants/messages.py:69 msgid "Termination time is not passed" msgstr "L'heure de fin de session n'est pas passée" #: common/constants/messages.py:70 #, python-format msgid "Termination time \"%%s\" is not correct" msgstr "L'heure de fin de session \"%%s\" est incorrecte" #: common/constants/messages.py:71 #, python-format msgid "Termination time \"%%s\" is not correct and cannot be set" msgstr "" "L'heure de fin de session \"%%s\" est incorrecte et ne peut être réglée" #: common/constants/messages.py:72 msgid "Track inactive is not passed" msgstr "Le suivi d'inactivité n'est pas passé" #: common/constants/messages.py:73 #, python-format msgid "Track inactive \"%%s\" is not correct" msgstr "Le suivi d'inactivité \"%%s\" est incorrect" #: common/constants/messages.py:74 #, python-format msgid "Track inactive \"%%s\" is not correct and cannot be set" msgstr "Le suivi d'inactivité \"%%s\" est incorrect et ne peut être réglé" #: common/constants/messages.py:75 msgid "Log level is not passed" msgstr "Le niveau de journal n'est pas passé" #: common/constants/messages.py:76 #, python-format msgid "Log level \"%%s\" is not correct" msgstr "Le niveau de journal \"%%s\" est incorrect" #: common/constants/messages.py:77 #, python-format msgid "Log level \"%%s\" is not correct and cannot be set" msgstr "Le niveau de journal \"%%s\" est incorrect et the peut être réglé" #: common/constants/messages.py:78 msgid "Poll time is not passed" msgstr "La période de rafraîchissement n'est pas envoyée" #: common/constants/messages.py:79 #, python-format msgid "Poll time \"%%s\" is not correct" msgstr "La période de rafraîchissement \"%%s\" est incorrecte" #: common/constants/messages.py:80 #, python-format msgid "Poll time \"%%s\" is not correct and cannot be set" msgstr "" "La période de rafraîchissement \"%%s\" est incorrecte et ne peut être réglée" #: common/constants/messages.py:81 msgid "Save time is not passed" msgstr "Le temps d'enregistrement n'est pas passé" #: common/constants/messages.py:82 #, python-format msgid "Save time \"%%s\" is not correct" msgstr "Le temps d'enregistrement \"%%s\" est incorrect" #: common/constants/messages.py:83 #, python-format msgid "Save time \"%%s\" is not correct and cannot be set" msgstr "Le temps d'enregistrement \"%%s\" est incorrect et ne peut être réglé" #: common/constants/messages.py:84 msgid "PlayTime flag is not passed" msgstr "L'option TempsLibre n'est pas expirée" #: common/constants/messages.py:85 #, python-format msgid "PlayTime flag \"%%s\" is not correct" msgstr "L'option TempsLibre \"%%s\" est incorrecte" #: common/constants/messages.py:86 #, python-format msgid "PlayTime flag \"%%s\" is not correct and cannot be set" msgstr "L'option TempsLibre \"%%s\" est incorrecte et ne peut être utilisée" #: common/constants/messages.py:87 msgid "PlayTime enhanced activity monitor flag is not passed" msgstr "Le suivi amélioré de l'option TempsLibre n'est pas expirée" #: common/constants/messages.py:88 #, python-format msgid "PlayTime enhanced activity monitor flag \"%%s\" is not correct" msgstr "Le suivi amélioré de l'option TempsLibre \"%%s\" est incorrect" #: common/constants/messages.py:89 #, python-format msgid "" "PlayTime enhanced activity monitor flag \"%%s\" is not correct and cannot be " "set" msgstr "" "Le suivi amélioré de l'option TempsLibre \"%%s\" est incorrect et ne peut " "être utilisé" #: common/constants/messages.py:92 #, python-format msgid "User's \"%%s\" day number must be present" msgstr "Le numéro du jour de l'utilisateur \"%%s\" doit être inscrit" #: common/constants/messages.py:93 #, python-format msgid "User's \"%%s\" day number must be between 1 and 7" msgstr "Le numéro du jour de l'utilisateur \"%%s\" doit être entre 1 et 7" #: common/constants/messages.py:94 #, python-format msgid "User's \"%%s\" allowed hours are not correct and cannot be set" msgstr "" "Les heures permises de l'utilisateur \"%%s\" sont incorrectes et ne peuvent " "être réglées" #: common/constants/messages.py:95 #, python-format msgid "User's \"%%s\" day list is not passed" msgstr "La liste de jour de l'utilisateur \"%%s\" n'est pas passée" #: common/constants/messages.py:96 #, python-format msgid "User's \"%%s\" day list is not correct" msgstr "La liste de jour de l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:97 #, python-format msgid "User's \"%%s\" day list is not correct and cannot be set" msgstr "" "La liste de jour de l'utilisateur \"%%s\" est incorrecte et ne peut être " "réglée" #: common/constants/messages.py:98 #, python-format msgid "User's \"%%s\" day limits list is not passed" msgstr "" "La liste des limites quotidiennes de l'utilisateur \"%%s\" n'est pas envoyée" #: common/constants/messages.py:99 #, python-format msgid "User's \"%%s\" day limits list is not correct" msgstr "" "La liste des limites quotidiennes de l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:100 #, python-format msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgstr "" "La liste des limites quotidiennes de l'utilisateur \"%%s\" est incorrecte et " "ne peut être réglée" #: common/constants/messages.py:101 #, python-format msgid "User's \"%%s\" time operation can be one of these: - + =" msgstr "" "Le temps d'utilisation de l'utilisateur \"%%s\" peut être \"+\", \"-\" ou \"=" "\"" #: common/constants/messages.py:102 #, python-format msgid "User's \"%%s\" time limit is not correct" msgstr "La limite de temps pour l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:103 #, python-format msgid "User's \"%%s\" time limit is not correct and cannot be set" msgstr "" "La limite de temps pour l'utilisateur \"%%s\" est incorrecte et ne peux être " "utilisée" #: common/constants/messages.py:104 #, python-format msgid "User's \"%%s\" monthly allowance is not passed" msgstr "L'allocation mensuelle de l'utilisateur \"%%s\" n'est pas passée" #: common/constants/messages.py:105 #, python-format msgid "User's \"%%s\" monthly allowance is not correct" msgstr "L'allocation mensuelle de l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:106 #, python-format msgid "User's \"%%s\" monthly allowance is not correct and cannot be set" msgstr "" "L'allocation mensuelle de l'utilisateur \"%%s\" est incorrecte et ne peut " "être réglée" #: common/constants/messages.py:107 #, python-format msgid "User's \"%%s\" track inactive flag is not passed" msgstr "" "Le témoin de suivi d'inactivité de l'utilisateur \"%%s\" n'est pas passé" #: common/constants/messages.py:108 #, python-format msgid "User's \"%%s\" track inactive flag is not correct" msgstr "Le témoin de suivi d'inactivité de l'utilisateur \"%%s\" est incorrect" #: common/constants/messages.py:109 #, python-format msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgstr "" "Le témoin de suivi d'inactivité de l'utilisateur \"%%s\" est incorrect et ne " "peut être réglé" #: common/constants/messages.py:110 #, python-format msgid "User's \"%%s\" hide tray icon flag is not passed" msgstr "" "L'indicateur d'icône de masquage de la barre d'état \"%%s\" de l'utilisateur " "n'est pas transmis" #: common/constants/messages.py:111 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct" msgstr "" "L'indicateur de masquage de l'icône \"%%s\" de l'utilisateur n'est pas " "correct" #: common/constants/messages.py:112 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct and cannot be set" msgstr "" "Le réglage pour masquer 'icône de la barre d'état pour l'utilisateur \"%%s\" " "et incorrect et ne peut pas être configuré" #: common/constants/messages.py:113 #, python-format msgid "User's \"%%s\" restriction / lockout type is not passed" msgstr "" "La contrainte / le verrouillage pour l'utilisateur \"%%s\" n'est pas atteint" #: common/constants/messages.py:114 #, python-format msgid "User's \"%%s\" restriction / lockout type is not correct" msgstr "" "La contrainte / le verrouillage pour l'utilisateur \"%%s\" est incorrect" #: common/constants/messages.py:115 #, python-format msgid "" "User's \"%%s\" restriction / lockout type is not correct and cannot be set" msgstr "" "Le type de contrainte / verrouillage est incorrect et ne peut être configuré" #: common/constants/messages.py:116 #, python-format msgid "User's \"%%s\" weekly allowance is not passed" msgstr "L'allocation hebdomadaire de l'utilisateur \"%%s\" n'est pas dépassée" #: common/constants/messages.py:117 #, python-format msgid "User's \"%%s\" weekly allowance is not correct" msgstr "L'allocation hebdomadaire de l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:118 #, python-format msgid "User's \"%%s\" weekly allowance is not correct and cannot be set" msgstr "" "L'allocation hebdomadaire de l'utilisateur \"%%s\" est incorrecte et ne peut " "être réglée" #: common/constants/messages.py:119 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not passed" msgstr "TempsLibre pour l'utilisateur \"%%s\" n'est pas expiré" #: common/constants/messages.py:120 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not correct" msgstr "L'activation de TempsLibre pour l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:121 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not correct and cannot be set" msgstr "" "L'activation de TempsLibre pour l'utilisateur \"%%s\" est incorrecte et ne " "peut être utilisée" #: common/constants/messages.py:122 #, python-format msgid "User's \"%%s\" PlayTime override flag is not passed" msgstr "" "Le contournement du TempsLibre pour l'utilisateur \"%%s\" n'est pas expiré" #: common/constants/messages.py:123 #, python-format msgid "User's \"%%s\" PlayTime override flag is not correct" msgstr "" "Le contournement du TempsLibre pour l'utilisateur \"%%s\" est incorrect" #: common/constants/messages.py:124 #, python-format msgid "User's \"%%s\" PlayTime override flag is not correct and cannot be set" msgstr "" "Le contournement du TempsLibre pour l'utilisateur \"%%s\" est incorrect et " "ne peut être utilisé" #: common/constants/messages.py:125 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "passed" msgstr "" "Le TempsLibre durant les intervalles non comptabilisés pour l'utilisateur " "\"%%s\" n'est pas expiré" #: common/constants/messages.py:126 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct" msgstr "" "La permission de TempsLibre durant les intervalles non comptabilisés pour " "l'utilisateur \"%%s\" est incorrect" #: common/constants/messages.py:127 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct and cannot be set" msgstr "" "La permission de TempsLibre durant les intervalles non comptabilisés pour " "l'utilisateur \"%%s\" est incorrect et ne peux être utilisée" #: common/constants/messages.py:128 #, python-format msgid "User's \"%%s\" PlayTime day list is not passed" msgstr "" "La liste des jours de TempsLibre pour l'utilisateur \"%%s\" n'est pas expirée" #: common/constants/messages.py:129 #, python-format msgid "User's \"%%s\" PlayTime day list is not correct" msgstr "" "La liste des jours de TempsLibre pour l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:130 #, python-format msgid "User's \"%%s\" PlayTime day list is not correct and cannot be set" msgstr "" "La liste des jours de TempsLibre pour l'utilisateur \"%%s\" est incorrecte " "et ne peut être utilisée" #: common/constants/messages.py:131 common/constants/messages.py:134 #, python-format msgid "User's \"%%s\" PlayTime day limits list is not passed" msgstr "" "La limite quotidienne de TempsLibre pour l'utilisateur \"%%s\" n'est pas " "expirée" #: common/constants/messages.py:132 common/constants/messages.py:135 #, python-format msgid "User's \"%%s\" PlayTime day limits list is not correct" msgstr "" "La limite quotidienne de TempsLibre pour l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:133 common/constants/messages.py:136 #, python-format msgid "" "User's \"%%s\" PlayTime day limits list is not correct and cannot be set" msgstr "" "La limite quotidienne de TempsLibre pour l'utilisateur \"%%s\" est " "incorrecte et ne peut être utilisée" #: common/constants/messages.py:137 #, python-format msgid "User's \"%%s\" PlayTime operation can be one of these: - + =" msgstr "" "Les opérations sur le TempsLibre de l'utilisateur \"%%s\" peuvent être \"+" "\", \"-\" ou \"=\"" #: common/constants/messages.py:138 #, python-format msgid "User's \"%%s\" set PlayTime limit is not correct" msgstr "La limite de TempsLibre pour l'utilisateur \"%%s\" est incorrecte" #: common/constants/messages.py:139 #, python-format msgid "User's \"%%s\" PlayTime time limit is not correct and cannot be set" msgstr "" "La limite de TempsLibre pour l'utilisateur \"%%s\" est incorrecte et ne peut " "être utilisée" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:143 msgid "" "Unexpected ERROR while loading configuration. Please inspect Timekpr-nExT " "log files" msgstr "ERREUR inattendue (chargement de la config). Vérifiez le journal" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:145 msgid "" "Unexpected ERROR getting configuration. Please inspect Timekpr-nExT log files" msgstr "ERREUR inattendue en obtenant la configuration. Consultez le log" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:147 msgid "" "Unexpected ERROR getting user configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "ERREUR inattendue en obtenant la configuration utilisateur. Consultez le log" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:149 msgid "" "Unexpected ERROR getting user list. Please inspect Timekpr-nExT log files" msgstr "" "ERREUR inattendue (obtenir la liste des utilisateurs). Vérifiez le journal" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:151 msgid "" "Unexpected ERROR updating configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "ERREUR inattendue lors de la mise à jour de la configuration utilisateur. " "Consultez le log" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:153 msgid "" "Unexpected ERROR updating control. Please inspect Timekpr-nExT log files" msgstr "ERREUR inattendue (mise à jour du contrôle). Vérifiez le journal" #: common/constants/messages.py:154 #, python-format msgid "User \"%%s\" configuration is not found" msgstr "La configuration de l'utilisateur \"%%s\" est introuvable" #: common/constants/messages.py:155 #, python-format msgid "User \"%%s\" control file is not found" msgstr "La fichier de contrôle de l'utilisateur \"%%s\" est introuvable" #: common/constants/messages.py:156 #, python-format msgid "User \"%%s\" is not found" msgstr "L'utilisateur \"%%s\" est introuvable" #: common/constants/messages.py:159 msgid "Connected" msgstr "Connecté" #: common/constants/messages.py:160 msgid "Connecting..." msgstr "Connexion en cours…" #: common/constants/messages.py:161 msgid "Failed to connect" msgstr "Échec de connexion" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:163 msgid "" "Please reopen the application if you are superuser and Timekpr-nExT is " "running" msgstr "" "Relancez l'application si vous êtes super utilisateur et que Timekpr-nExT " "roule" #: common/constants/messages.py:164 msgid "Started" msgstr "Démarré" #: common/constants/messages.py:165 msgid "User configuration retrieved" msgstr "Configuration de l'utilisateur trouvée" #: common/constants/messages.py:166 msgid "Configuration retrieved" msgstr "Configuration trouvée" #: common/constants/messages.py:167 msgid "Track inactive for user has been processed" msgstr "Le suivi d'inactivité pour l'utilisateur a été traité" #: common/constants/messages.py:168 msgid "Hide tray icon for user has been processed" msgstr "Masquer l'icône de la barre d'état pour l'utilisateur a été traité" #: common/constants/messages.py:169 msgid "Restriction / lockout type for user has been processed" msgstr "Le type de contrainte / verrouillage pour l'utilisateur a été appliqué" #: common/constants/messages.py:170 msgid "Additional time for user has been processed" msgstr "Le temps supplémentaire pour l'utilisateur a été traité" #: common/constants/messages.py:171 msgid "Additional PlayTime for user has been processed" msgstr "Le TempsLibre supplémentaire pour l'utilisateur a été traité" #: common/constants/messages.py:172 msgid "Weekly and monthly limits for user have been processed" msgstr "" "Les limites hebdomadaires et mensuelles pour l'utilisateur ont été traitées" #: common/constants/messages.py:173 msgid "Allowed days for user have been processed" msgstr "Les jours permis pour l'utilisateur ont été traités" #: common/constants/messages.py:174 msgid "Day time limits for user have been processed" msgstr "Les limites quotidiennes pour l'utilisateur ont été traitées" #: common/constants/messages.py:175 msgid "Allowed hours for user have been processed" msgstr "Les heures permises pour l'utilisateur ont été traitées" #: common/constants/messages.py:176 msgid "Timekpr-nExT configuration has been saved" msgstr "La configuration de Timekpr-nExT a été enregistrée" #: common/constants/messages.py:177 msgid "User time limits have been saved" msgstr "Les limites pour l'utilisateur sont enregistrées" #: common/constants/messages.py:178 msgid "User PlayTime limits have been saved" msgstr "Les limites de TempsLibre pour l'utilisateur sont enregistrées" #: common/constants/messages.py:179 msgid "User additional options have been saved" msgstr "Les options supplémentaires pour l'utilisateur sont enregistrées" #: common/constants/messages.py:180 msgid "Enable PlayTime for the user has been processed" msgstr "TempsLibre pour l'utilisateur est activé" #: common/constants/messages.py:181 msgid "PlayTime override flag for the user has been processed" msgstr "Le contournement du TempsLibre pour l'utilisateur a été traité" #: common/constants/messages.py:182 msgid "" "PlayTime allowed during unaccounted intervals flag for the user has been " "processed" msgstr "" "Le TempsLibre permis pendant les intervalles non comptabilisés a été traité" #: common/constants/messages.py:183 msgid "PlayTime allowed days for user have been processed" msgstr "Les jours de TempsLibre permis pour l'utilisateur ont été traités" #: common/constants/messages.py:184 msgid "PlayTime day limits for user have been processed" msgstr "Les limites quotidiennes de TempsLibre ont été traitées" #: common/constants/messages.py:185 msgid "PlayTime activities for user have been processed" msgstr "Les activités de TempsLibre pour l'utilisateur ont été traitées" #: common/constants/messages.py:186 msgid "Please select a day to set the limits" msgstr "Veuillez choisir un jour avant de fixer les limites" #: common/constants/messages.py:187 msgid "That interval overlaps with an existing one" msgstr "L'intervalle chevauche l'intervalle existant" #: common/constants/messages.py:188 msgid "That interval's start conflicts with an existing one" msgstr "Le début de l'intervalle est en conflit avec la valeur existante" #: common/constants/messages.py:189 msgid "That interval's end conflicts with an existing one" msgstr "La fin de l'intervalle est en conflit avec la valeur existante" #: common/constants/messages.py:190 msgid "That interval's start or end duplicates an existing one" msgstr "" "Le début ou la fin de l'intervalle est un doublon de l'intervalle existant" #: common/constants/messages.py:191 msgid "Interval start cannot be the same as end" msgstr "" "Le début de l'intervalle ne peut être identique à la fin de l'intervalle" #: common/constants/messages.py:192 msgid "Interval's start cannot be later than end" msgstr "Le début de l'intervalle ne peut être après la fin" #: common/constants/messages.py:193 msgid "Please select an hour interval to remove" msgstr "Veuillez choisir un intervalle de temps à retirer" #: common/constants/messages.py:194 msgid "Interval removed" msgstr "Intervalle retiré" #: common/constants/messages.py:195 msgid "Timekpr-nExT interface is not yet ready" msgstr "L'interface de Timekpr-nExT n'est pas prête" #: common/constants/messages.py:198 msgid "" "WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, " "but no displays are available, thus running in CLI..." msgstr "" "AVERTISSEMENT: l'interface de gestion de Timekpr-nExT devait être lancée en " "mode graphique, mais aucun affichage n'est disponible. Elle fonctionne donc " "en ligne de commande..." #: common/constants/messages.py:199 msgid "The command is incorrect:" msgstr "La commande est incorrecte :" #: common/constants/messages.py:200 msgid "The usage of Timekpr-nExT admin client is as follows:" msgstr "L'utilisation du client de gestion de Timekpr-nExT est la suivante :" #: common/constants/messages.py:201 msgid "---=== NOTICE ===---" msgstr "---=== REMARQUER ===---" #: common/constants/messages.py:202 msgid "numeric time values are in seconds" msgstr "les valeurs de temps numériques sont en secondes" #: common/constants/messages.py:203 msgid "" "weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, " "format: 1-7)" msgstr "" "les jours de la semaine sont numérotés selon la norme ISO 8601 (c'est-à-dire " "que le lundi est le premier jour, format: 1-7)" #: common/constants/messages.py:204 msgid "hours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)" msgstr "" "les heures sont numérotées selon ISO 8601 (c.-à-d. horloge 24h, format: 0-23)" #: common/constants/messages.py:206 #, python-format msgid "%(n)s user in total:" msgid_plural "%(n)s users in total:" msgstr[0] "%(n)s utilisateur au total :" msgstr[1] "%(n)s utilisateurs au total:" #: common/constants/messages.py:207 #, python-format msgid "Configuration for user %s:" msgstr "Configuration pour l'utilisateur %s :" #: common/constants/messages.py:210 msgid "Time left..." msgstr "Temps restant..." #: common/constants/messages.py:211 msgid "Limits & Configuration" msgstr "Limites et configuration" #: common/constants/messages.py:212 msgid "About" msgstr "À propos" #: common/constants/messages.py:215 resource/client/forms/about.glade:17 msgid "Keep control of computer usage" msgstr "Demeurez en contrôle de l'utilisation de votre ordinateur" #: common/constants/messages.py:216 msgid "Day" msgstr "Jour" #: common/constants/messages.py:217 msgid "Enabled" msgstr "Activé" #: common/constants/messages.py:218 common/constants/messages.py:224 msgid "Limit" msgstr "Limite" #: common/constants/messages.py:219 msgid "From" msgstr "De" #: common/constants/messages.py:220 msgid "from..." msgstr "de..." #: common/constants/messages.py:221 msgid "To" msgstr "À" #: common/constants/messages.py:222 msgid "to..." msgstr "à..." #: common/constants/messages.py:223 msgid "Period" msgstr "Période" #: common/constants/messages.py:225 msgid "Weekly" msgstr "Hebdomadaire" #: common/constants/messages.py:226 msgid "Monthly" msgstr "Mensuel" #: common/constants/messages.py:227 common/constants/messages.py:229 msgid "Session type" msgstr "Type de session" #: common/constants/messages.py:228 common/constants/messages.py:230 msgid "session type..." msgstr "type de session..." #: common/constants/messages.py:231 msgid "Username" msgstr "Nom d’utilisateur" #: common/constants/messages.py:232 msgid "username..." msgstr "nom d'utilisateur..." #: common/constants/messages.py:233 msgid "Process mask" msgstr "Masque des processus" #: common/constants/messages.py:234 msgid "executable mask..." msgstr "masque exécutable..." #: common/constants/messages.py:235 msgid "Process description" msgstr "Description du processus" #: common/constants/messages.py:236 msgid "process description..." msgstr "description du processus..." #: common/constants/messages.py:237 msgid "Time" msgstr "Temps" #: common/constants/messages.py:238 msgid "time..." msgstr "temps..." #: common/constants/messages.py:239 msgid "Importance" msgstr "importance" #: common/constants/messages.py:240 msgid "importance..." msgstr "importance..." #: common/constants/messages.py:243 msgid "Timekpr-nExT notification" msgstr "Message de Timekpr-nExT" #: common/constants/messages.py:244 msgid "Timekpr-nExT PlayTime notification" msgstr "Avertissement de TempsLibre de Timekpr-nExT" #: common/constants/messages.py:245 msgid "Your time is not limited today" msgstr "Votre temps n'est pas limité aujourd'hui" #: common/constants/messages.py:246 msgid "Time allowance has changed, please note new time left!" msgstr "" "Votre allocation a changé, veuillez prendre note de votre nouveau temps!" #: common/constants/messages.py:247 msgid "Time limit configuration has changed, please note new configuration!" msgstr "" "Votre configuration de temps a changé, veuillez prendre note de votre " "nouvelle configuration!" #: common/constants/messages.py:248 #, python-format msgid "There is a problem connecting to Timekpr-nExT daemon (%%s)!" msgstr "Il y a un problème de connexion au service de Timekpr-nExT (%%s)!" #: common/constants/messages.py:249 #, python-format msgid "There is a problem communicating to Timekpr-nExT (%%s)!" msgstr "Il y a un problème de communication avec Timekpr-nExT (%%s)!" #: common/constants/messages.py:250 #, python-format msgid "Icon initialization error (%%s)!" msgstr "Erreur d'initialisation de l'icône (%%s)!" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:252 msgid "Your time is up, you will be forcibly logged out in" msgstr "" "Votre temps est expiré, votre session sera automatiquement terminée dans" #. TRANSLATORS: this is a part of message "Your time is up, your computer will be forcibly shutdown in %s seconds", please translate accordingly #: common/constants/messages.py:254 msgid "Your time is up, your computer will be forcibly shutdown in" msgstr "Temps expiré, votre ordinateur sera automatiquement arrêté dans" #. TRANSLATORS: this is a part of message "Your time is up, your session will be forcibly locked in %s seconds", please translate accordingly #: common/constants/messages.py:256 msgid "Your time is up, your session will be forcibly locked in" msgstr "" "Votre temps est écoulé, votre session sera automatiquement verrouillée dans" #. TRANSLATORS: this is a part of message ", Your computer will be forcibly suspended in %s seconds", please translate accordingly #: common/constants/messages.py:258 msgid "Your time is up, your computer will be forcibly suspended in" msgstr "" "Votre temps est écoulé, votre ordinateur sera automatiquement mis en veille " "dans" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:260 #, python-format msgid "%(n)s second" msgid_plural "%(n)s seconds" msgstr[0] "%(n)s seconde" msgstr[1] "%(n)s secondes" #: common/constants/messages.py:261 msgid "Internal connection error, please check log files" msgstr "Erreur de connexion interne, veuillez consulter le journal" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:263 #, python-format msgid "You have %(n)s hour" msgid_plural "You have %(n)s hours" msgstr[0] "Il reste %(n)s heure" msgstr[1] "Il reste %(n)s heures" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:265 #, python-format msgid "%(n)s minute" msgid_plural "%(n)s minutes" msgstr[0] "%(n)s minute" msgstr[1] "%(n)s minutes" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) of PlayTime left" please translate accordingly #: common/constants/messages.py:267 common/constants/messages.py:269 #, python-format msgid "%(n)s second left" msgid_plural "%(n)s seconds left" msgstr[0] "%(n)s seconde à votre session" msgstr[1] "%(n)s secondes à votre session" #: common/constants/messages.py:269 #, python-format msgid "%(n)s second of PlayTime left" msgid_plural "%(n)s seconds of PlayTime left" msgstr[0] "%(n)s seconde de TempsLibre restante" msgstr[1] "%(n)s secondes de TempsLibre restantes" #: common/constants/messages.py:270 #, python-format msgid "" "Feature \"%%s\", which is used to detect idle time, cannot be enabled!\n" "Idle / inactive time might not be accounted when screen is locked!" msgstr "" "La fonctionnalité \"%%s\", qui est utilisée pour détecter le temps " "d'inactivité, ne peut pas être activée!\n" "Le temps inactif / inactif peut ne pas être pris en compte lorsque l'écran " "est verrouillé!" #: common/constants/messages.py:273 #, python-format msgid "UNEXPECTED ERROR: %%s" msgstr "ERREUR INATTENDUE: %%S" #: common/constants/messages.py:274 #, python-format msgid "PARAMETER PARSE ERROR (please check parameter validity): %%s" msgstr "" "ERREUR D'ANALYSE DE PARAMÈTRE (veuillez vérifier la validité du paramètre): " "%%s" #: common/constants/messages.py:275 msgid "Command FAILED: access denied" msgstr "ÉCHEC de l'opération: accès interdit" #: common/constants/messages.py:276 msgid "Command FAILED: communication was not accepted" msgstr "ÉCHEC de l'opération: communication refusée" #: common/constants/messages.py:277 msgid "n/a" msgstr "n/a" #: resource/client/forms/about.glade:7 msgid "About Timekpr-nExT" msgstr "À propos de Timekpr-nExT" #: resource/client/forms/about.glade:16 msgid "Copyright (c) 2018-2021 Eduards Bezverhijs" msgstr "Copyright (c) 2018-2021 Eduards Bezverhijs" #: resource/client/forms/about.glade:19 msgid "Timekpr-nExT" msgstr "Timekpr-nExT" #. Please enter GPL3 licence text in your language #: resource/client/forms/about.glade:20 msgctxt "timekpr-next" msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details.\n" "\n" "You should have received a copy of the GNU General Public License along with " "this program. If not, see . In Debian, see " "file /usr/share/common-licenses/GPL-3" msgstr "" "Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le " "modifier suivant les termes de la GNU General Public License telle que " "publiée par la Free Software Foundation , soit la version 3 de la Licence, " "soit (à votre gré)\n" "toute version ultérieure.\n" "\n" "Ce programme est distribué dans l’espoir qu’il sera utile, mais SANS AUCUNE " "GARANTIE : sans même la garantie implicite de COMMERCIALISABILITÉ\n" "16 ni d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez la GNU General " "Public License pour plus de détails.\n" "\n" "Vous devriez avoir reçu une copie de la GNU General Public License avec ce " "programme ; si ce n’est pas le cas, consultez : . Sur Debian, consultez /usr/share/common-licenses/GPL-3" #. Please fill in translator credits, each person in new line in format: name.surname@mail.xy, name@mail.xy, nick@mail.xy or so... #: resource/client/forms/about.glade:26 msgid "" "Eduards Bezverhijs \n" "(Translations fine-tuning by JP Lord )\n" "(English fine-tuning by Phil Hudson )" msgstr "JP Lord " #: resource/client/forms/admin.glade:155 msgid "Remove excluded session type" msgstr "Retirez le type de session exclue" #: resource/client/forms/admin.glade:385 msgid "Timekpr-nExT administration" msgstr "Gestion de Timekpr-nExT" #: resource/client/forms/admin.glade:403 resource/client/forms/admin.glade:409 #: resource/client/forms/client.glade:261 msgid "Icon, isn't it?" msgstr "Icône, n'est-ce pas?" #: resource/client/forms/admin.glade:432 msgid "Notes, read carefully ;)" msgstr "Notes à lire attentivement" #: resource/client/forms/admin.glade:435 msgid "" "This is the configuration app for Timekpr-nExT. It allows you to set time " "limits for your individual users as well as general Timekpr-nExT options.\n" "To use this application, you either have to execute it as superuser or have " "to be part of the timekpr group.\n" "Please note that the \"Timekpr-nExT Configuration\" is available in " "superuser (administrator) mode only!\n" "\n" "Please configure carefully: do not lock yourself out!" msgstr "" "Vous êtes dans l'app de configuration pour Timekpr-nExT. Elle vous permet " "de régler les limites de temps pour chaque utilisateur ainsi que les options " "générales de Timekpr-nExT.\n" "Vous devez exécuter cette application en tant que superutilisateur ou faire " "partie du groupe timekpr.\n" "Notez que \"Configuration de Timekpr-nExT\" est disponible seulement en mode " "superutilisateur (administrateur).\n" "\n" "Configurez prudemment : ne bloquez pas votre accès!" #: resource/client/forms/admin.glade:465 resource/client/forms/admin.glade:3016 msgid "Users related configuration" msgstr "Paramètres reliés aux utilisateurs" #: resource/client/forms/admin.glade:476 resource/client/forms/client.glade:298 msgid "Username:" msgstr "Nom d’utilisateur :" #: resource/client/forms/admin.glade:504 resource/client/forms/admin.glade:516 msgid "List of usernames registered on the system" msgstr "Liste des noms d'utilisateur disponibles sur le système" #: resource/client/forms/admin.glade:530 msgid "Restore" msgstr "Rétablir" #: resource/client/forms/admin.glade:535 msgid "Restore configuration from saved state" msgstr "Rétablir les paramètres de la version enregistrée" #: resource/client/forms/admin.glade:586 msgid "Information about time left / spent" msgstr "Information sur le temps restant / utilisé" #: resource/client/forms/admin.glade:610 msgid "" "Continuous time left. May span more than the current day (realtime, " "available when user is logged in)" msgstr "" "Temps disponible en continu. Peut être utilisé sur plus que le jour courant " "(la valeur réelle est disponible quand la session de l'utilisateur est " "ouverte)" #: resource/client/forms/admin.glade:612 msgid "Time left (actual):" msgstr "Temps restant (réel):" #: resource/client/forms/admin.glade:626 resource/client/forms/admin.glade:657 #: resource/client/forms/admin.glade:688 resource/client/forms/admin.glade:732 #: resource/client/forms/admin.glade:763 resource/client/forms/admin.glade:794 #: resource/client/forms/client.glade:411 #: resource/client/forms/client.glade:425 #: resource/client/forms/client.glade:456 #: resource/client/forms/client.glade:502 #: resource/client/forms/client.glade:728 #: resource/client/forms/client.glade:786 #: resource/client/forms/client.glade:857 #: resource/client/forms/client.glade:885 #: resource/client/forms/client.glade:985 #: resource/client/forms/client.glade:1011 msgid "Format: " msgstr "Format : " #: resource/client/forms/admin.glade:641 msgid "" "How long the user was inactive since last login (realtime, available when " "user is logged in)" msgstr "" "Durée d'inactivité de l'utilisateur depuis la dernière ouverture de session " "(la valeur réelle est disponible quand la session de l'utilisateur est " "ouverte)" #: resource/client/forms/admin.glade:643 msgid "Time inactive (actual):" msgstr "Temps inactif (réel):" #: resource/client/forms/admin.glade:672 msgid "Time available today (saved stated, not real-time)" msgstr "Temps disponible aujourd'hui (enregistré déclaré, pas en temps réel)" #: resource/client/forms/admin.glade:674 msgid "Time left (today):" msgstr "Temps restant (aujourd'hui):" #: resource/client/forms/admin.glade:716 msgid "Time spent today (saved stated, not real-time)" msgstr "Temps d'utilisation aujourd'hui (pas en temps réel)" #: resource/client/forms/admin.glade:718 msgid "Time spent (today):" msgstr "Temps d'utilisation (aujourd'hui) :" #: resource/client/forms/admin.glade:747 msgid "Time spent this week (saved stated, not real-time)" msgstr "Temps d'utilisation cette semaine (pas en temps réel)" #: resource/client/forms/admin.glade:749 resource/client/forms/client.glade:717 msgid "Time spent (week):" msgstr "Temps d'utilisation (semaine) :" #: resource/client/forms/admin.glade:777 msgid "Time spent this month (saved stated, not real-time)" msgstr "Temps d'utilisation ce mois-ci (pas en temps réel)" #: resource/client/forms/admin.glade:779 resource/client/forms/client.glade:744 msgid "Time spent (month):" msgstr "Temps d'utilisation (mois) :" #: resource/client/forms/admin.glade:861 msgid "Allowance adjustments" msgstr "Ajustements des allocations" #: resource/client/forms/admin.glade:885 msgid "today's time" msgstr "le temps aujourd'hui" #: resource/client/forms/admin.glade:889 msgid "Choose this to adjust user's time allowance for today" msgstr "" "Choisissez ceci pour ajuster l'allocation de temps de l'utilisateur pour " "aujourd'hui" #: resource/client/forms/admin.glade:901 msgid "PlayTime" msgstr "TempsLibre" #: resource/client/forms/admin.glade:905 msgid "Choose this to adjust user's PlayTime allowance for today" msgstr "" "Choisissez ceci pour ajuster l'allocation de TempsLibre de l'utilisateur " "pour aujourd'hui" #: resource/client/forms/admin.glade:934 msgid "hr" msgstr "h" #: resource/client/forms/admin.glade:945 msgid "The number of minutes to be adjusted for today's limit" msgstr "Nombre de minute(s) à ajuster à la limite d'aujourd'hui" #: resource/client/forms/admin.glade:961 msgid "The number of hours to be adjusted for today's limit" msgstr "Nombre d'heure(s) à ajuster à la limite d'aujourd'hui" #: resource/client/forms/admin.glade:977 msgid "min" msgstr "min" #: resource/client/forms/admin.glade:1004 msgid "Add specified time (reward)" msgstr "Ajouter la quantité spécifiée (récompense)" #: resource/client/forms/admin.glade:1020 msgid "Subtract specified time (penalty)" msgstr "Soustraire la quantité spécifiée (punition)" #: resource/client/forms/admin.glade:1036 msgid "Set this specific time limit" msgstr "Régler la limite de temps exacte" #: resource/client/forms/admin.glade:1101 msgid "Information about PlayTime" msgstr "Information sur TempsLibre" #: resource/client/forms/admin.glade:1134 msgid "" "Actual PlayTime available today (realtime, available when user is logged in)" msgstr "" "TempsLibre disponible aujourd'hui (véritable, disponible à l'ouverture de la " "session)" #: resource/client/forms/admin.glade:1136 msgid "PlayTime left (actual):" msgstr "TempsLibre restant :" #: resource/client/forms/admin.glade:1150 #: resource/client/forms/admin.glade:1181 #: resource/client/forms/admin.glade:1269 msgid "Format: " msgstr "Format : " #: resource/client/forms/admin.glade:1165 msgid "PlayTime available today (saved stated, not real-time)" msgstr "TempsLibre disponible aujourd'hui (enregistré, peut différer)" #: resource/client/forms/admin.glade:1167 msgid "PlayTime left (today):" msgstr "TempsLibre restant (aujourd'hui) :" #: resource/client/forms/admin.glade:1196 #: resource/client/forms/admin.glade:1212 msgid "" "Active PlayTime activity count (realtime, available when user is logged in)" msgstr "" "Compteur d'activité en TempsLibre (véritable, disponible à l'ouverture de la " "session)" #: resource/client/forms/admin.glade:1198 msgid "Running activities (actual):" msgstr "Activités en cours (véritable) :" #: resource/client/forms/admin.glade:1253 msgid "PlayTime spent today (saved stated, not real-time)" msgstr "TempsLibre utilisé aujourd'hui (enregistré, peut différer)" #: resource/client/forms/admin.glade:1255 msgid "PlayTime spent (today):" msgstr "TempsLibre utilisé (aujourd'hui) :" #: resource/client/forms/admin.glade:1306 msgid "" "Brief information about time spent and everything related to time management " "for this day" msgstr "" "Information brève sur l'utilisation du temps et sur la gestion du temps pour " "aujourd'hui" #: resource/client/forms/admin.glade:1307 msgid "Info & Today" msgstr "Infos et aujourd'hui" #: resource/client/forms/admin.glade:1348 msgid "This lets you configure time limits." msgstr "Vous permet de configurer les limites de temps." #: resource/client/forms/admin.glade:1350 msgid "Week day limits" msgstr "Limites des jours de semaine" #. This is meant for very short (e.g. one letter) abbreviation of hours #: resource/client/forms/admin.glade:1370 #: resource/client/forms/admin.glade:1865 #: resource/client/forms/admin.glade:2265 msgid "h" msgstr "h" #: resource/client/forms/admin.glade:1374 #: resource/client/forms/admin.glade:2269 msgid "Choose hours to be adjusted for selected days." msgstr "Choisissez les heures à ajuster pour les jours sélectionnés" #. This is meant for very short (e.g. one letter) abbreviation of minutes #: resource/client/forms/admin.glade:1386 #: resource/client/forms/admin.glade:1881 #: resource/client/forms/admin.glade:2281 msgid "m" msgstr "m" #: resource/client/forms/admin.glade:1390 #: resource/client/forms/admin.glade:2285 msgid "Choose minutes to be adjusted for selected days." msgstr "Choisissez les minutes à ajuster pour les jours sélectionnés" #: resource/client/forms/admin.glade:1410 msgid "" "Increase daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Augmenter les limites quotidiennes par l'unité de temps choisie (heures ou " "minutes) pour le jour sélectionné.\n" "\n" "Notez que vous pouvez choisir plus d'une journée!" #: resource/client/forms/admin.glade:1427 msgid "" "Decrease daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Réduire les limites quotidiennes par l'unité de temps choisie (heures ou " "minutes) pour le jour sélectionné.\n" "\n" "Notez que vous pouvez choisir plus d'une journée!" #: resource/client/forms/admin.glade:1474 msgid "" "Lists day of the week and additional information about the day's limit.\n" "\n" "Please enable / disable days for the user." msgstr "" "Liste des jours de la semaine et informations supplémentaires à propos des " "limites quotidiennes.\n" "\n" "Veuillez activer / désactiver les jours pour l'utilisateur." #: resource/client/forms/admin.glade:1550 msgid "" "Hour intervals for selected day available to the user.\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead.\n" "\n" "Please note that if the day's limit ends at 24:00 and the next day's limit " "starts at 00:00, then the user can work continuously past midnight.\n" "\n" "Please note that multiple intervals cannot be configured within the same " "hour.\n" "An interval can start or end or contain a specific hour, but not more than " "once. This is by design, not a bug.\n" "\n" msgstr "" "Intervalles en heure pour le jour sélectionné et pour l'utilisateur.\n" "L'option \"∞\" indique que le temps utilisé durant cet intervalle ne sera " "pas comptabilisé dans la limite quotidienne. Il sera comptabilisé comme " "temps inactif.\n" "\n" "Notez que si la limite se termine à 24:00 et que la limite du jour suivant " "commence à 00:00, alors l'utilisateur peut continuer à travailler sans " "interruption à minuit.\n" "\n" "Notez que des intervalles multiples ne peuvent pas être configurés à " "l'intérieur de la même heure.\n" "Un intervalle peut commencer ou se terminer ou contenir une heure " "spécifique, mais pas plus d'une fois. C'est un comportement voulu, pas un " "bug.\n" "\n" #: resource/client/forms/admin.glade:1581 msgid "Hour intervals" msgstr "Périodes horaires" #: resource/client/forms/admin.glade:1603 msgid "" "Create a new time interval that will be available to the user.\n" "\n" "After creating the interval, please edit its start and end times directly in " "interval list." msgstr "" "Créer un nouvel intervalle qui sera disponible à l'utilisateur.\n" "\n" "Après la création de l'intervalle, veuillez éditer son temps de début et de " "fin directement dans la liste des intervalles." #: resource/client/forms/admin.glade:1620 msgid "Delete the selected time interval from the available list of intervals." msgstr "" "Effacer l'intervalle de temps sélectionné de la liste des intervalles " "disponibles." #: resource/client/forms/admin.glade:1688 msgid "enter hour intervals" msgstr "entrez les intervalles en heures" #: resource/client/forms/admin.glade:1742 msgid "verify" msgstr "vérifier" #: resource/client/forms/admin.glade:1746 msgid "" "Verify configured time intervals. This is a mandatory step to ensure that " "intervals are correct.\n" "\n" "Intervals which have problems will be highlighted." msgstr "" "Vérifier les intervalles de temps configurés est une étape nécessaire pour " "assurer que les intervalles sont valides.\n" "\n" "Les intervalles non conformes seront mis en évidence." #: resource/client/forms/admin.glade:1821 msgid "Weekly and monthly limits" msgstr "Limites hebdomadaires et mensuelles" #. This is meant for very short (e.g. one letter) abbreviation of days #: resource/client/forms/admin.glade:1849 msgid "d" msgstr "j" #: resource/client/forms/admin.glade:1853 msgid "Choose days to be adjusted for selected period." msgstr "Choisissez les jours qui seront ajustés pour la période sélectionnée." #: resource/client/forms/admin.glade:1869 msgid "Choose hours to be adjusted for selected period." msgstr "" "Choisissez les heures qui seront ajustées pour la période sélectionnée." #: resource/client/forms/admin.glade:1885 msgid "Choose minutes to be adjusted for selected period." msgstr "Choisissez les jours qui seront ajustés pour la période sélectionnée." #: resource/client/forms/admin.glade:1913 msgid "" "Increase weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" "Augmenter l'allocation hebdomadaire ou mensuelle en utilisant l'unité de " "temps choisie (jours, heures ou minutes) pour la période sélectionnée." #: resource/client/forms/admin.glade:1927 msgid "" "Decrease weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" "Réduire l'allocation hebdomadaire ou mensuelle en utilisant l'unité de temps " "choisie (jours, heures ou minutes) pour la période sélectionnée." #: resource/client/forms/admin.glade:1976 msgid "" "Weekly and monthly limits for the user.\n" "\n" "These limits are applied to user together with the rest of limit " "configuration." msgstr "" "Limites hebdomadaire et mensuelle pour l'utilisateur.\n" "\n" "Ces limites sont appliquées pour l'utilisateur en plus des autres limites " "configurées." #: resource/client/forms/admin.glade:2016 msgid "Apply daily limits" msgstr "Appliquez les limites quotidiennes" #: resource/client/forms/admin.glade:2021 msgid "Apply limit all changes made in this page" msgstr "Appliquer toutes les modifications effectuées sur cette page" #: resource/client/forms/admin.glade:2042 msgid "Daily limit configuration for all week days" msgstr "Configuration des limites pour tous les jours de la semaine" #: resource/client/forms/admin.glade:2043 msgid "Limit configuration" msgstr "Configuration de la limite" #: resource/client/forms/admin.glade:2064 msgid "Settings for PlayTime activities" msgstr "Réglages des activités TempsLibre" #: resource/client/forms/admin.glade:2084 msgid "PlayTime options" msgstr "Options du TempsLibre" #: resource/client/forms/admin.glade:2108 #: resource/client/forms/admin.glade:2147 msgid "Enable PlayTime for selected user" msgstr "Activer TempsLibre pour l'utilisateur sélectionné" #: resource/client/forms/admin.glade:2110 msgid "Enable PlayTime:" msgstr "Activer TempsLibre" #: resource/client/forms/admin.glade:2124 #: resource/client/forms/admin.glade:2161 msgid "" "Enable PlayTime override for selected user.\n" "\n" "This setting overrides time accounting in a way that time is accounted only " "when at least one of the applications on the PlayTime activity list are " "running!\n" "\n" "This affects only time accounting, intervals are still fully enforced!\n" "\n" "If no processes are running, time is accounted as idle thus effectively it's " "free time for user!" msgstr "" "Activer le contournement du TempsLibre pour l'utilisateur sélectionné.\n" "\n" "Ce réglage a préséance sur la comptabilisation du temps de sorte que le " "temps est comptabilisé seulement lorsqu'une application sur la liste des " "activités TempsLibre est activée!\n" "\n" "Ce réglage influence seulement la comptabilisation du temps. Les " "intervalles de temps sont toujours considérés.\n" "\n" "Si aucun processus n'est en cours d'utilisation, le temps est comptabilisé " "comme du temps inactif par l'utilisateur (non comptabilisé)!" #: resource/client/forms/admin.glade:2132 msgid "Enable PlayTime override:" msgstr "Activer le contournement du TempsLibre:" #: resource/client/forms/admin.glade:2180 #: resource/client/forms/admin.glade:2201 msgid "" "Allow PlayTime activities during unaccounted (\"∞\") time intervals for " "selected user.\n" "\n" "This setting allows the user to use applications configured in his PlayTime " "activity list during time intervals which are marked as unaccounted (\"∞" "\").\n" "\n" "If this setting is enabled, the use of activities will not be accounted " "towards PlayTime limits, otherwise applications in PlayTime activity list " "will be terminated as soon as they are started during unaccounted (\"∞\") " "time intervals." msgstr "" "Permettre les activités TempsLibre pendant les intervalles de temps non " "comptabilisés (\"∞\") pour l'utilisateur sélectionné.\n" "\n" "Ce réglage permet à l'utilisateur d'utiliser les applications configurées " "dans la liste des activités TempsLibre pendant les intervalles de temps " "indiqués comme non comptabilisés (\"∞\").\n" "\n" "Si ce réglage est activé, les activités utilisées ne seront pas " "comptabilisées dans la limite du TempsLibre, sinon les applications dans la " "liste des activités TempsLibre seront fermées aussitôt qu'elles sont lancées " "pendant les intervalles non comptabilisés (\"∞\")." #: resource/client/forms/admin.glade:2186 msgid "Allowed during \"∞\" intervals:" msgstr "Permises pendant les intervalles (\"∞\") :" #: resource/client/forms/admin.glade:2245 msgid "This lets you configure PlayTime limits." msgstr "Vous permet de configurer les limites du TempsLibre" #: resource/client/forms/admin.glade:2247 #: resource/client/forms/client.glade:1253 msgid "PlayTime limits" msgstr "Limites du TempsLibre" #: resource/client/forms/admin.glade:2305 msgid "" "Increase daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Augmenter l'allocation quotidienne de TempsLibre par l'unité de temps " "sélectionnée (heures ou minutes) pour les jours sélectionnés.\n" "\n" "Notez que vous pouvez sélectionner plus d'un jour!" #: resource/client/forms/admin.glade:2322 msgid "" "Decrease daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Réduire l'allocation quotidienne de TempsLibre par l'unité de temps " "sélectionnée (heures ou minutes) pour les jours sélectionnés.\n" "\n" "Notez que vous pouvez sélectionner plus d'un jour!" #: resource/client/forms/admin.glade:2374 msgid "" "Lists day of the week and additional information about the day's PlayTime " "limit.\n" "\n" "Please enable / disable days for the user and set time allowance for " "PlayTime activities." msgstr "" "Listes des jours de la semaine an informations supplémentaires du TempsLibre " "du jour.\n" "\n" "Veuillez activer / désactiver les jours pour l'utilisateur et régler " "l'allocation de temps pour les activités TempsLibre." #: resource/client/forms/admin.glade:2423 msgid "PlayTime activities" msgstr "Activités TempsLibre" #: resource/client/forms/admin.glade:2445 msgid "" "Add new PlayTime activity.\n" "\n" "Please specify activity mask and user friendly description in the activity " "list directly." msgstr "" "Ajouter une nouvelle activité TempsLibre.\n" "\n" "Veuillez spécifier le masque d'activité et une description conviviale " "directement dans la liste des activités." #: resource/client/forms/admin.glade:2462 msgid "Remove selected entry from PlayTime activities." msgstr "Retirer l'item sélectionné de la liste des activités TempsLibre." #: resource/client/forms/admin.glade:2506 msgid "" "Please specify a list of full process (executable) names without path as " "case sensitive strings to be monitored in the system.\n" "\n" "It's possible to specify RegExp masks for processes too, but please be very " "careful about them as misusing this setting may lead to killing unwanted " "processes for the user!\n" "\n" "NOTE: RegExp is an expert setting!" msgstr "" "Veuillez spécifier la liste complète des noms des processus (exécutables) " "sans leur chemin de répertoire en tenant comptes des majuscules. Cette " "liste sera considérée prise en compte dans l'observation du système.\n" "\n" "Il est également possible d'utiliser des masques de RegExp, mais soyez " "prudent puisque ces expressions peuvent arrêter des processus valides pour " "l'utilisateur!\n" "\n" "NOTE : l'utilisation des RegExp est réservée aux utilisateurs expérimentés!" #: resource/client/forms/admin.glade:2546 msgid "Apply PlayTime configuration" msgstr "Appliquer la configuration du TempsLibre" #: resource/client/forms/admin.glade:2550 msgid "Apply PlayTime limits and configuration changes on this page" msgstr "Appliquer les limites et la configuration du TempsLibre sur cette page" #: resource/client/forms/admin.glade:2569 msgid "PlayTime configuration" msgstr "Configuration du TempsLibre" #: resource/client/forms/admin.glade:2594 msgid "Additional configuration options" msgstr "Options de configuration supplémentaires" #: resource/client/forms/admin.glade:2629 #: resource/client/forms/admin.glade:2652 msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account. This " "varies among desktop environments." msgstr "" "Déterminer si le temps de session inactif est comptabilisé.\n" "\n" "Si ce réglage n'est pas coché, le temps passé en mode console (excluant " "l'émulateur du terminal) et pendant le verrouillage de l'écran n'est PAS " "comptabilisé. L'effet varie selon les environnements de bureau (desktop " "environments)." #: resource/client/forms/admin.glade:2633 msgid "Track inactive sessions:" msgstr "Suivi des sessions inactives :" #: resource/client/forms/admin.glade:2669 #: resource/client/forms/admin.glade:2692 msgid "" "Select whether to show Timekpr-next's padlock icon and notifications to the " "user.\n" "\n" "Please note that unchecking this will disable showing all information and " "notifications to the user!" msgstr "" "Choisir d'afficher l'icône du cadenas de Timekpr-nExT et les avertissements " "à l'utilisateur.\n" "\n" "Notez que désactiver cette option empêchera toute information de parvenir à " "l'utilisateur!" #: resource/client/forms/admin.glade:2673 msgid "Hide icon and notifications:" msgstr "Masquer l'icône et les notifications:" #: resource/client/forms/admin.glade:2744 msgid "" "Select a restriction / lockout type for the user.\n" "\n" "NOTE: please be very careful, think ahead and read every options description " "when changing this setting from default value!" msgstr "" "Choisir une restriction / type de verrouillage pour l'utilisateur.\n" "\n" "NOTE : soyez prudent, réfléchissez bien et lisez chacune des options en " "modifiant la valeur par défaut de ce réglage!" #: resource/client/forms/admin.glade:2748 msgid "Restriction / lockout type:" msgstr "Type de contrainte / verrouillage:" #: resource/client/forms/admin.glade:2770 msgid "terminate sessions" msgstr "interrompre les sessions" #: resource/client/forms/admin.glade:2774 msgid "" "When time ends, user sessions will be terminated.\n" "\n" "This option is a restriction!\n" "\n" "This is the default option and most likely is the one you need!" msgstr "" "À l'expiration du temps, la session de l'utilisateur sera fermée.\n" "\n" "Cette options est une restriction!\n" "\n" "Cette option est la valeur par défaut et probablement celle que vous voulez " "utiliser!" #: resource/client/forms/admin.glade:2792 msgid "shutdown computer" msgstr "extinction de l'ordinateur" #: resource/client/forms/admin.glade:2796 msgid "" "When time ends, computer will be shut down.\n" "\n" "This option is a restriction!\n" "\n" "Please evaluate whether you need this type of restriction!" msgstr "" "À l'expiration du temps, l'ordinateur sera arrêté.\n" "\n" "Cette option est une restriction!\n" "\n" "Veuillez évaluer avec soin si vous avez besoin d'utiliser cette restriction!" #: resource/client/forms/admin.glade:2814 msgid "suspend computer" msgstr "mise en veille de l'ordinateur" #: resource/client/forms/admin.glade:2818 msgid "" "When time ends, computer will be suspended (put to sleep).\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "À l'expiration du temps, l'ordinateur sera mis en veille.\n" "\n" "Cette option est une restriction!\n" "\n" "Au réveil de l'ordinateur, s'il n'y a toujours plus de temps disponible, " "l'écran demeurera verrouillé et l'ordinateur sera remis en veille après un " "moment." #: resource/client/forms/admin.glade:2836 msgid "suspend / wakeup computer" msgstr "mise en veille / rallumage de l'ordinateur" #: resource/client/forms/admin.glade:2840 msgid "" "When time ends, computer will be suspended (put to sleep) and will be woken " "up at start of next available time interval for the user.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "À l'expiration du temps, l'ordinateur sera mis en veille et réveillé au " "début du prochain intervalle disponible pour l'utilisateur.\n" "\n" "Cette option est une restriction et est mieux adaptée pour gérer l'auto-" "restriction de son ordinateur!\n" "\n" "Au réveil, s'il n'y a plus de temps disponible, l'écran sera verrouillé et " "l'ordinateur sera remis en veille après un moment." #: resource/client/forms/admin.glade:2858 msgid "lock screen" msgstr "verrouillage de l'écran" #: resource/client/forms/admin.glade:2862 msgid "" "When time ends, computer screen will be locked.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes." msgstr "" "À l'expiration du temps, l'écran de l'ordinateur sera verrouillé.\n" "\n" "Cette option est une restriction et est mieux adaptée pour gérer l'auto-" "restriction de son ordinateur!" #: resource/client/forms/admin.glade:2893 msgid "" "Select a time interval when computer can be woken up automatically.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Choisir un intervalle de temps où l'ordinateur peut être réveillé " "automatiquement.\n" "\n" "Notez que ce réglage fonctionne uniquement si le réveil par l'horloge du " "système est supporté et activé dans le BIOS / UEFI!" #: resource/client/forms/admin.glade:2897 msgid "Wakeup hour interval:" msgstr "Délai de réveil:" #: resource/client/forms/admin.glade:2909 msgid "" "Enter start hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Entrer le début l'heure de mise en fonction du réveil automatique.\n" "\n" "Notez que ce réglage fonctionne uniquement si le réveil par l'horloge du " "système est supporté et activé dans le BIOS / UEFI!" #: resource/client/forms/admin.glade:2928 msgid "" "Enter end hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Entrer la fin l'heure de mise en fonction du réveil automatique.\n" "\n" "Notez que ce réglage fonctionne uniquement si le réveil par l'horloge du " "système est supporté et activé dans le BIOS / UEFI!" #: resource/client/forms/admin.glade:2966 msgid "Apply configuration" msgstr "Appliquer la configuration" #: resource/client/forms/admin.glade:2970 msgid "Apply additional configuration changes on this page" msgstr "Appliquer les changements supplémentaires effectués sur cette page" #: resource/client/forms/admin.glade:2989 msgid "Additional configuration" msgstr "Configuration supplémentaire" #: resource/client/forms/admin.glade:2990 #: resource/client/forms/admin.glade:3661 msgid "Additional options" msgstr "Options supplémentaires" #: resource/client/forms/admin.glade:3017 msgid "User Configuration" msgstr "Configuration de l'utilisateur trouvée" #: resource/client/forms/admin.glade:3027 msgid "Timekpr-nExT related configuration" msgstr "Configuration associée à Timekpr-nExT" #: resource/client/forms/admin.glade:3054 msgid "Control Timekpr-nExT Settings" msgstr "Paramètres de Timekpr-nExT" #: resource/client/forms/admin.glade:3081 #: resource/client/forms/admin.glade:3233 msgid "" "Timekpr-nExT log level.\n" "\n" "Please do not change this unless you have to. You likely won't find anything " "pretty in the log files.\n" "\n" "Values are: 1 - standard, 2 - debug, 3 - extra debug" msgstr "" "Niveau de journalisation de Timekpr-nExT.\n" "\n" "Évitez de changer ce réglage à moins que ça ne soit nécessaire. Vous " "risquez de ne rien trouver d'utile dans les logs.\n" "\n" "Valeurs possibles : 1- standard, 2- debug, 3- extra debut" #: resource/client/forms/admin.glade:3101 #: resource/client/forms/admin.glade:3149 msgid "" "Session polling time granularity which specifies how often user sessions and " "activity are checked and accounted.\n" "\n" "3 - 5 seconds are optimal, don't change this if unsure." msgstr "" "Fréquence de vérification de la comptabilisation des sessions utilisateurs.\n" "\n" "3 à 5 secondes représente une valeur optimale. Ne changez pas ce réglage " "sans savoir ce que vous faites." #: resource/client/forms/admin.glade:3105 msgid "Poll interval" msgstr "Intervalle de rafraîchissement" #: resource/client/forms/admin.glade:3117 #: resource/client/forms/admin.glade:3220 msgid "" "Specify the time in seconds when Timekpr-nExT starts continuous real-time " "countdown before enforcing a restriction / lockout to user's sessions." msgstr "" "Spécifier le temps en secondes où Timekpr-nExT débute le compte à rebours en " "temps réel avant d'appliquer la restriction / le verrouillage de la session " "de l'utilisateur." #: resource/client/forms/admin.glade:3133 #: resource/client/forms/admin.glade:3183 msgid "" "This specifies the rate in seconds at which actual user state is saved to " "disk.\n" "\n" "To improve performance and still have great accuracy, Timekpr-nExT accounts " "time in memory at \"Poll interval\" frequency, this setting defines a " "frequency at which user state is saved to disk for permanent storage." msgstr "" "Spécifie la fréquence en secondes d'enregistrement de l'état de " "l'utilisateur sur le disque.\n" "\n" "Pour améliorer la performance en maintenant une bonne précision, Timekpr-" "nExT ajuste l'état de l'utilisateur en mémoire vive à la \"fréquenced de " "vérification\". Ce réglage spécifie uniquement la fréquence à laquelle " "l'information est consignée sur le disque dur." #: resource/client/forms/admin.glade:3137 msgid "Save time" msgstr "Enregistrer le temps" #: resource/client/forms/admin.glade:3167 #: resource/client/forms/admin.glade:3202 msgid "" "Number of seconds left for user before enforcing a configured restriction / " "lockout to his sessions.\n" "\n" "After this is reached and user is still active, the user's sessions will be " "handled according to specified restriction / lockout, and almost nothing can " "be done to prevent it." msgstr "" "Nombre de secondes restantes avant d'appliquer la restriction / le " "verrouillage configuré pour la session.\n" "\n" "À la fin du compte à rebours, si l'utilisateur est toujours actif, la " "session sera prise en charge selon le réglage programmé dans le champ " "restriction / verrouillage et rien ne pourra être fait pour l'empêcher." #: resource/client/forms/admin.glade:3171 msgid "Termination time" msgstr "Temps de fin de session" #: resource/client/forms/admin.glade:3222 msgid "Countdown time" msgstr "Compte à rebours" #: resource/client/forms/admin.glade:3239 msgid "Log level" msgstr "Niveau du journal" #: resource/client/forms/admin.glade:3250 #: resource/client/forms/admin.glade:3266 msgid "" "Number of seconds left for user's available time before sending a final " "critical notification that time is about to run out.\n" "\n" "NOTE: the rest of the notification times are configurable per user by user " "in client application!" msgstr "" "Nombre de secondes restantes avant d'envoyer un avertissement critique et " "final que le temps est sur le point d'expirer.\n" "\n" "NOTE : le moment des autres avertissements est réglable par utilisateur et " "par application!" #: resource/client/forms/admin.glade:3254 msgid "Final notification" msgstr "Avertissement final" #: resource/client/forms/admin.glade:3308 msgid "Control Timekpr-nExT tracking items" msgstr "Contrôle des éléments de suivi de Timekpr-nExT" #: resource/client/forms/admin.glade:3341 msgid "Tracked Sessions" msgstr "Sessions suivies" #: resource/client/forms/admin.glade:3364 msgid "Add tracked session type to the list" msgstr "Ajouter le type de session suivie à la liste" #: resource/client/forms/admin.glade:3379 msgid "Remove tracked session type from the list" msgstr "Retirer le type de session suivie de la liste" #: resource/client/forms/admin.glade:3408 msgid "" "List of session types to be tracked.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Liste des sessions à vérifier.\n" "\n" "Veuillez ne pas changer ou expérimenter d'autres valeurs à moins de bien " "comprendre ce que vous faites (pas seulement pour essayer)." #: resource/client/forms/admin.glade:3442 msgid "Excluded Sessions" msgstr "Sessions exclues" #: resource/client/forms/admin.glade:3465 msgid "Add an excluded session type to the list" msgstr "Ajouter le type de session exclue à la liste" #: resource/client/forms/admin.glade:3480 msgid "Remove an excluded session type from the list" msgstr "Retirer le type de session exclue de la liste" #: resource/client/forms/admin.glade:3509 msgid "" "List of sessions to be excluded from tracking.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Liste des sessions exclues de la vérification.\n" "\n" "Veuillez indiquer les noms d'utilisateur, par les noms réels. Par exemple, " "\"jsmith\", pas \"John Smith\"." #: resource/client/forms/admin.glade:3543 msgid "Excluded Users" msgstr "Utilisateurs exclus" #: resource/client/forms/admin.glade:3566 msgid "Add a user to the exclusion list" msgstr "Ajouter l'utilisateur à la liste d'exclusion" #: resource/client/forms/admin.glade:3581 msgid "Remove a user from the exclusion list" msgstr "Retirer l'utilisateur de la liste d'exclusion" #: resource/client/forms/admin.glade:3610 msgid "" "List of users excluded from tracking.\n" "\n" "Please specify actual usernames, not real names here. For example, \"jsmith" "\", not \"John Smith\"." msgstr "" "Liste des utilisateurs exclus de la vérification.\n" "\n" "Veuillez indiquer les noms d'utilisateur, par les noms réels. Par exemple, " "\"jsmith\", pas \"John Smith\"." #: resource/client/forms/admin.glade:3688 #: resource/client/forms/admin.glade:3707 #: resource/client/forms/admin.glade:3743 msgid "" "This setting controls whether PlayTime functionality is enabled.\n" "\n" "This is a PlayTime master switch, if it's turned off, it's turned off for " "everyone regardless of individual settings!" msgstr "" "Ce réglage contrôle si la fonction TempsLibre est activée ou non.\n" "\n" "Ce réglage est le commutateur principal de la fonction TempsLibre. S'il est " "désactivé, TempsLibre sera désactivé pour tous les utilisateurs peu importe " "leurs configurations individuelles." #: resource/client/forms/admin.glade:3692 msgid "PlayTime enabled:" msgstr "TempsLibre activé :" #: resource/client/forms/admin.glade:3722 msgid "" "This setting controls whether PlayTime activity monitor will use process " "command line, including arguments, for monitoring processes (by default only " "uses the process name).\n" "\n" "When this setting is enabled Timekpr-nExT will perform a match against full " "command line up to 512 characters enabling enhanced process monitoring " "capabilities.\n" "\n" "Please be careful and double check your RegExp patterns in each individual " "user's PlayTime activity masks!" msgstr "" "L'activation de ce réglage activera la vérification des arguments des " "processus lancés par ligne de commande (la vérification par défaut utilise " "uniquement le nom du processus).\n" "\n" "Lorsque ce réglage est activé, Timekpr-nExT vérifiera toute la ligne de " "commande jusqu'à 512 caractères pour mieux cibler les processus.\n" "\n" "Soyez prudent et vérifiez deux fois les expression RegExp pour chacun des " "masques des utilisateurs de TempsLibre." #: resource/client/forms/admin.glade:3728 msgid "Enhanced activity monitor:" msgstr "Vérification améliorée des activités :" #: resource/client/forms/admin.glade:3777 msgid "Apply Timekpr-nExT settings" msgstr "Appliquer les réglages de Timekpr-nExT" #: resource/client/forms/admin.glade:3782 msgid "Apply all Timekpr-nExT settings at once" msgstr "Appliquer TOUS les réglages de Timekpr-nExT" #: resource/client/forms/admin.glade:3802 msgid "Timekpr-nExT Administration Configuration" msgstr "Paramètre de gestion de Timekpr-nExT" #: resource/client/forms/admin.glade:3803 msgid "Timekpr-nExT Configuration" msgstr "La configuration de Timekpr-nExT a été enregistrée" #: resource/client/forms/admin.glade:3832 #: resource/client/forms/admin.glade:3849 msgid "Status of Timekpr-nExT admin client" msgstr "État du client de gestion de Timekpr-nExT" #. This is one of the notification priorities #: resource/client/forms/client.glade:27 msgid "Information" msgstr "Informations" #. This is one of the notification priorities #: resource/client/forms/client.glade:31 msgid "Warning" msgstr "Attention" #. This is one of the notification priorities #: resource/client/forms/client.glade:35 msgid "Severe" msgstr "Sévère" #. This is one of the notification priorities #: resource/client/forms/client.glade:39 msgid "Critical" msgstr "Critique" #: resource/client/forms/client.glade:133 msgid "Timekpr-nExT client" msgstr "Client de Timekpr-nExT" #: resource/client/forms/client.glade:164 msgid "Status of Timekpr-nExT client" msgstr "État du client de Timekpr-nExT" #: resource/client/forms/client.glade:196 msgid "Save all changes" msgstr "Enregistrer tous les changements" #: resource/client/forms/client.glade:213 msgid "Close the window" msgstr "Fermer la fenêtre" #: resource/client/forms/client.glade:297 #: resource/client/forms/client.glade:314 msgid "Current effective username" msgstr "Nom d'utilisateur actif" #: resource/client/forms/client.glade:371 msgid "Current statistics" msgstr "Statistiques actuelles" #: resource/client/forms/client.glade:396 msgid "Time spent this session or after Timekpr-nExT has been restarted" msgstr "" "Temps d'utilisation de la session ou depuis le redémarrage de Timekpr-nExT" #: resource/client/forms/client.glade:398 msgid "Time spent (session):" msgstr "Temps d'utilisation (session) :" #: resource/client/forms/client.glade:441 msgid "Time inactive this session or after Timekpr-nExT has been restarted" msgstr "" "Temps d'inactivité de la session ou depuis le redémarrage de Timekpr-nExT" #: resource/client/forms/client.glade:443 msgid "Time inactive:" msgstr "Temps d'inactivité :" #: resource/client/forms/client.glade:469 msgid "Continuous time left to you. May span more than the current day." msgstr "Temps restant. Peut s'étaler sur plus d'un jour." #: resource/client/forms/client.glade:471 msgid "Continuous time left:" msgstr "Temps restant :" #: resource/client/forms/client.glade:487 msgid "Total time available left today in a row, up to the end of the day" msgstr "Temps total consécutif disponible (aujourd'hui)" #: resource/client/forms/client.glade:489 #: resource/client/forms/client.glade:974 msgid "Time left today:" msgstr "Temps restant aujourd'hui :" #: resource/client/forms/client.glade:548 msgid "These are the days and limits that are available to you" msgstr "Jours et limites qui sont associés à l'utilisateur" #: resource/client/forms/client.glade:573 #: resource/client/forms/client.glade:1171 msgid "Days & Limits" msgstr "Jours et limites" #: resource/client/forms/client.glade:609 msgid "" "This shows the time intervals that are available for use.\n" "\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead." msgstr "" "Afficher les intervalles de temps configurés et disponibles.\n" "\n" "L'option \"∞\" indique que le temps utilisé pendant l'intervalle ne sera pas " "comptabilisé dans la limite quotidienne. Il sera comptabilisé comme temps " "inactif." #: resource/client/forms/client.glade:634 msgid "Intervals" msgstr "Intervalles" #: resource/client/forms/client.glade:663 msgid "Daily limits" msgstr "Limites quotidiennes" #: resource/client/forms/client.glade:691 msgid "Additional statistics" msgstr "Statistiques supplémentaires" #: resource/client/forms/client.glade:715 msgid "Time spent this week" msgstr "Temps utilisé cette semaine" #: resource/client/forms/client.glade:742 msgid "Time spent this month" msgstr "Temps utilisé ce mois-ci" #: resource/client/forms/client.glade:755 msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account.\n" "This varies among desktop environments." msgstr "" "Choisir si le temps inactif est comptabilisé.\n" "\n" "Si ce réglage n'est pas coché, le temps passé en console (pas en émulateur " "de terminal) et pendant le verrouillage de l'écran ne sera PAS " "comptabilisé.\n" "L'effet de ce réglage varie selon les environnements de bureau (desktop " "environnment)." #: resource/client/forms/client.glade:760 msgid "Track inactive:" msgstr "Suivi inactif :" #: resource/client/forms/client.glade:773 msgid "" "Select whether inactive session time is counted. If this is unchecked, time " "spent in console (not terminal emulator) login sessions and while the screen " "is locked is NOT taken into account. This varies among desktop environments." msgstr "" "Si le temps pour les sessions inactives est compté, si cette option est " "désactivée, le temps passé dans la console (pas le terminal) et si l'écran " "est verrouillé, n'est PAS pris en compte (ceci varie beaucoup selon les " "environments de bureau)" #: resource/client/forms/client.glade:820 #: resource/client/forms/client.glade:918 msgid "Additional limits" msgstr "Limites supplémentaires" #: resource/client/forms/client.glade:844 msgid "Time limit for this week available to you" msgstr "Limite de temps pour la semaine" #: resource/client/forms/client.glade:846 msgid "Time limit (week):" msgstr "Limite de temps (semaine) :" #: resource/client/forms/client.glade:872 msgid "Time limit for this month available to you" msgstr "Limite de temps pour le mois" #: resource/client/forms/client.glade:874 msgid "Time limit (month):" msgstr "Limite de temps (mois) :" #: resource/client/forms/client.glade:948 msgid "Current PlayTime statistics" msgstr "Statistiques de TempsLibre" #: resource/client/forms/client.glade:972 msgid "Total PlayTime available left today" msgstr "Durée de TempsLibre disponible aujourd'hui" #: resource/client/forms/client.glade:998 msgid "Total PlayTime spent today" msgstr "Durée de TempsLibre utilisée aujourd'hui" #: resource/client/forms/client.glade:1000 msgid "Time spent today:" msgstr "Temps utilisé aujourd'hui :" #: resource/client/forms/client.glade:1027 #: resource/client/forms/client.glade:1042 msgid "" "This option overrides the default time accounting.\n" "\n" "If it's checked, the time is accounted only when activities in \"Activity / " "application list\" are running, the rest of the time is considered idle." msgstr "" "Cette option contourne la comptabilisation du temps par défaut.\n" "\n" "Si elle est cochée, le temps n'est comptabilisé que les activités de la " "liste d'activités sont en cours. Le reste du temps est considéré comme " "inactif." #: resource/client/forms/client.glade:1046 msgid "Time limit override:" msgstr "Contournement de la limite de temps :" #: resource/client/forms/client.glade:1060 #: resource/client/forms/client.glade:1073 msgid "Number of currently active PlayTime activities" msgstr "Nombre d'acvitiés TempsLibre en cours" #: resource/client/forms/client.glade:1062 msgid "Running activities:" msgstr "Activités en cours :" #: resource/client/forms/client.glade:1086 #: resource/client/forms/client.glade:1106 msgid "" "Allow activities during unaccounted (\"∞\") time intervals.\n" "\n" "This setting allows to use applications listed in \"Activity / application " "list\" during time intervals which are marked as unaccounted (\"∞\"), if the " "setting is not enabled, none of activities are allowed to run!" msgstr "" "Permettre les activités pendant les intervalles non comptabilisés (\"∞\").\n" "\n" "Ce réglage permet l'utilisation des activités de la liste d'activités " "pendant les intervalles indiqués comme non comptabilisés (\"∞\"). Si ce " "réglage n'est pas activé, aucune activité ne sera autorisée!" #: resource/client/forms/client.glade:1090 msgid "Allowed during \"∞\":" msgstr "Permettre durant \"∞\" :" #: resource/client/forms/client.glade:1148 msgid "" "These are days and limits that available to you as part of PlayTime activity " "restrictions" msgstr "" "Voici les jours et les limites disponibles pour la restriction des activités " "TempsLibre" #: resource/client/forms/client.glade:1205 msgid "" "This shows activities / applications which are part of PlayTime restrictions" msgstr "" "Affiche les activités / applications qui font partie des restrictions du " "TempsLibre" #: resource/client/forms/client.glade:1228 msgid "Activity / application list" msgstr "Liste des activités / applications" #: resource/client/forms/client.glade:1292 msgid "" "Configuration for personalized notifications about available time.\n" "\n" "Please configure notifications as you see fit. However, please keep in mind " "that there will be two types of notifications that cannot be personalized: a " "final warning some time before time ends and a countdown notifications when " "time is about to end.\n" "\n" "The configuration \"Time\" value indicates a value of time left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" "Avertissements (temps restant) personnalisés.\n" "\n" "Veuillez configurer ces réglages selon vos préférences. Cependant, souvenez-" "vous que deux types d'avertissements ne peuvent être personnalisés : " "l'avertissement final avant que le temps ne soit écoulé et le compte à " "rebours quand le temps est presque écoulé.\n" "\n" "Information - un icône vert et un avertissement d'information est affiché.\n" "Attention - un icône jaune et n avertissement d'information est affiché.\n" "Sévère - un icône rouge et un avertissement important est affiché.\n" "Critique - un icône rouge et un avertissement critique est affiché. Ce type " "d'avertissement est généralement affiché par-dessus outtes les applications " "ouvertes et reste affiché jusqu'à ce qu'il soit manuellement fermé, mais " "reste dépendant de l'environnement de bureau (desktop environnment) utilisé." #: resource/client/forms/client.glade:1324 msgid "Notification configuration" msgstr "Réglage des avertissements" #: resource/client/forms/client.glade:1346 msgid "Add new notification threshold to the list" msgstr "Ajouter un niveau d'avertissement à la liste" #: resource/client/forms/client.glade:1361 msgid "Remove notification threshold from the list" msgstr "Retirer un niveau d'avertissement de la liste" #: resource/client/forms/client.glade:1410 msgid "" "Configuration for personalized notifications about available PlayTime.\n" "\n" "Please configure notifications as you see fit.\n" "\n" "The configuration \"Time\" value indicates a value of PlayTime left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" "Réglage des avertissements (temps restant) du TempsLibre personnalisés.\n" "\n" "Veuillez configurer ces réglages selon vos préférences.\n" "\n" "Le point de réglage \"Temps\" indique le TempsLibre restant au moment de " "l'affichage de l'avertissement. Le point \"Importance\" gère les propriétés " "suivantes de l'avertissement:\n" "\n" "Information - un icône vert et un avertissement d'information est affiché.\n" "Attention - un icône jaune et n avertissement d'information est affiché.\n" "Sévère - un icône rouge et un avertissement important est affiché.\n" "Critique - un icône rouge et un avertissement critique est affiché. Ce type " "d'avertissement est généralement affiché par-dessus outtes les applications " "ouvertes et reste affiché jusqu'à ce qu'il soit manuellement fermé, mais " "reste dépendant de l'environnement de bureau (desktop environnment) utilisé." #: resource/client/forms/client.glade:1442 msgid "PlayTime notification configuration" msgstr "Réglage des avertissements du TempsLibre" #: resource/client/forms/client.glade:1464 msgid "Add new PlayTime notification threshold to the list" msgstr "Ajouter un niveau d'avertissement du TempsLibre à la liste" #: resource/client/forms/client.glade:1479 msgid "Remove PlayTime notification threshold from the list" msgstr "Retirer un niveau d'avertissement du TempsLibre de la liste" #: resource/client/forms/client.glade:1538 msgid "Notifications" msgstr "Avertissements" #: resource/client/forms/client.glade:1562 msgid "" "Select whether to use speech notifications, if available.\n" "\n" "You may be able to make speech notifications available by installing package " "\"python3-espeak\"." msgstr "" "Activer les avertissements vocaux, s'ils sont disponibles.\n" "\n" "Il peut être possible d'activer les avertissements vocaux disponibles en " "installant le paquet \"python3-espeak\"." #: resource/client/forms/client.glade:1572 msgid "Use speech notifications" msgstr "Utiliser des avertissements vocaux" #: resource/client/forms/client.glade:1591 #: resource/client/forms/client.glade:1613 msgid "" "This sets the logging level.\n" "\n" "Please do not change this unless you know what you're doing." msgstr "" "Régler le niveau de journalisation.\n" "\n" "Veuillez ne pas modifier ce paramètre à moins de savoir ce que vous faites." #: resource/client/forms/client.glade:1617 msgid "Logging level" msgstr "Niveau du journal" #: resource/client/forms/client.glade:1639 msgid "" "Specify whether to show a notification when limit configurations or " "allowance changes" msgstr "" "Activation des avertissements quand les limites ou les allocations changent" #: resource/client/forms/client.glade:1647 msgid "Show limit changes" msgstr "Afficher les changements de limite" #: resource/client/forms/client.glade:1663 msgid "" "Specify whether to show all notifications.\n" "\n" "If unchecked, then only important ones are shown." msgstr "" "Afficher tous les avertissements.\n" "\n" "Si ce réglage n'est pas coché, seuls les avertissements importants seront " "affichés." #: resource/client/forms/client.glade:1673 msgid "Show all notifications" msgstr "Afficher tous les avertissements" #: resource/client/forms/client.glade:1689 msgid "" "Specify whether to show seconds in notification area.\n" "\n" "Some desktop environments, like KDE5, do not support text besides " "notification icons." msgstr "" "Afficher les secondes dans les avertissements.\n" "\n" "Des environnements de bureau (KDE par exemple) ne supportent pas le texte " "sur les icônes d'avertissement." #: resource/client/forms/client.glade:1699 msgid "Show seconds in notification area" msgstr "Afficher les secondes dans la zone d'avertissement" #: resource/client/forms/client.glade:1718 #: resource/client/forms/client.glade:1742 msgid "" "This sets how long a notification is shown for regular notifications about " "time left and configuration changes.\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed (not recommended for regular " "notifications).\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Délai d'affichage d'un avertissement pour un avertissement normal à propos " "du temps restant et d'un changement de réglage.\n" "\n" "Cette valeur est en secondes.\n" "Une valeur de 0 indique que l'avertissement sera affiché jusqu'à ce qu'il " "soit manuellement fermé (n'est pas recommandé pour les avertissements non " "critiques).\n" "\n" "Notez que l'environnement du bureau peut contourner ce délai. Dans ce cas, " "ce réglage n'a aucun effet." #: resource/client/forms/client.glade:1749 msgid "Notification timeout (sec)" msgstr "Délai de notification (sec)" #: resource/client/forms/client.glade:1774 #: resource/client/forms/client.glade:1799 msgid "" "This sets how long a notification is shown for \"Critical\" notifications " "about time left (when the icon turns red).\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed.\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Délai d'affichage d'un avertissement pour un avertissement critique à propos " "du temps restant (icône rouge).\n" "\n" "Cette valeur est en secondes.\n" "Une valeur de 0 indique que l'avertissement sera affiché jusqu'à ce qu'il " "soit manuellement fermé.\n" "\n" "Notez que l'environnement du bureau peut contourner ce délai. Dans ce cas, " "ce réglage n'a aucun effet." #: resource/client/forms/client.glade:1806 msgid "Critical notification timeout (sec)" msgstr "Délai d'expiration des notifications critiques (s)" #: resource/client/forms/client.glade:1828 msgid "" "Select whether to use sound \"bell\" (short notification sound) to announce " "a new notification from Timekpr-nExT.\n" "\n" "This works only for enabled notifications.\n" "\n" "If this setting is not editable, your environment does not advertise sound " "notification support." msgstr "" "Activer le beep du système à l'affichage d'un nouvel avertissement de " "Timekpr-nExT.\n" "\n" "Cette option fonctionne uniquement pour les avertissements actifs.\n" "\n" "Si vous ne pouvez modifier ce réglage, c'est que votre environnement de " "bureau ne supporte pas l'utilisation du son dans les avertissements." #: resource/client/forms/client.glade:1840 msgid "Use sound \"bell\" for notifications" msgstr "Utiliser un \"bip\" sonore pour les notifications" #: resource/client/forms/client.glade:1860 msgid "Configuration" msgstr "Réglages" #~ msgid "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Main test (ex): Rinalds Dobelis\n" #~ "Beta test: SanskritFritz" #~ msgstr "" #~ "Copyright (c) 2018-2021 Eduards Bezverhijs\n" #~ "Tests principaux (ex) : Rinalds Dobelis\n" #~ "Test beta : SanskritFritz" #~ msgid "" #~ "==> set time left for the user at current moment, example (add one hour)" #~ msgstr "" #~ "==> régler le temps restant pour l'utilisateur à partir de maintenant, " #~ "exemple (ajouter une heure)" #~ msgid "==> set time limits per all allowed days, example" #~ msgstr "==> régler la durée pour tous les jours permis, exemple" #~ msgid "" #~ "==> set allowed hours per specified day or ALL for every day, example" #~ msgstr "" #~ "==> régler les heures permises pour le jour choisi ou TOUS pour tous les " #~ "jours, exemple" #~ msgid "==> get user configuration from the server, example" #~ msgstr "" #~ "==> obtenir la configuration de l'utilisateur à partir du serveur, exemple" #~ msgid "Excluded session types list is not correct and can not be set" #~ msgstr "" #~ "La liste des types de sessions exclues est incorrecte et ne peux être " #~ "réglée" #~ msgid "Control sessions types list is not correct and can not be set" #~ msgstr "" #~ "La liste des types de sessions de contrôle est incorrecte et ne peux être " #~ "réglée" #~ msgid "Excluded user list is not correct and can not be set" #~ msgstr "" #~ "La liste des utilisateurs exclus est incorrecte et ne peux être réglée" #, python-format #~ msgid "Final warning time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "L'avertissement de temps écoulé \"%%s\" est incorrect et ne peut être " #~ "réglé" #, python-format #~ msgid "Termination time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "L'heure de fin de session \"%%s\" est incorrecte et ne peut être réglée" #, python-format #~ msgid "Track inactive \"%%s\" is not correct and can not be set" #~ msgstr "Le suivi d'inactivité \"%%s\" est incorrect et ne peut être réglé" #, python-format #~ msgid "Log level \"%%s\" is not correct and can not be set" #~ msgstr "Le niveau de journal \"%%s\" est incorrect et the peut être réglé" #, python-format #~ msgid "Poll time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "La période de rafraîchissement \"%%s\" est incorrecte et ne peut être " #~ "réglée" #, python-format #~ msgid "Save time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Le temps d'enregistrement \"%%s\" est incorrect et ne peut être réglé" #, python-format #~ msgid "User's \"%%s\" allowed hours are not correct and can not be set" #~ msgstr "" #~ "Les heures permises de l'utilisateur \"%%s\" sont incorrectes et ne " #~ "peuvent être réglées" #, python-format #~ msgid "User's \"%%s\" day list is not correct and can not be set" #~ msgstr "" #~ "La liste de jour de l'utilisateur \"%%s\" est incorrecte et ne peut être " #~ "réglée" #, python-format #~ msgid "User's \"%%s\" day limits list is not correct and can not be set" #~ msgstr "" #~ "La liste des limites quotidiennes de l'utilisateur \"%%s\" est incorrecte " #~ "et ne peut être réglée" #, python-format #~ msgid "User's \"%%s\" set time operation can be one of these: -+=" #~ msgstr "" #~ "L'opération de réglage du temps de l'utilisateur \"%%s\" doit être choisi " #~ "parmi : -+=" #, python-format #~ msgid "User's \"%%s\" monthly allowance is not correct and can not be set" #~ msgstr "" #~ "L'allocation mensuelle de l'utilisateur \"%%s\" est incorrecte et ne peut " #~ "être réglée" #, python-format #~ msgid "User's \"%%s\" set time limit is not correct" #~ msgstr "La limite de temps de l'utilisateur \"%%s\" est incorrecte" #, python-format #~ msgid "User's \"%%s\" set time limit is not correct and can not be set" #~ msgstr "" #~ "La limite de temps de l'utilisateur \"%%s\" est incorrecte et ne peut " #~ "être réglée" #, python-format #~ msgid "User's \"%%s\" weekly allowance is not correct and can not be set" #~ msgstr "" #~ "L'allocation hebdomadaire de l'utilisateur \"%%s\" est incorrecte et ne " #~ "peut être réglée" #, python-format #~ msgid "User's \"%%s\" track inactive flag is not correct and can not be set" #~ msgstr "" #~ "Le témoin de suivi d'inactivité de l'utilisateur \"%%s\" est incorrect et " #~ "ne peut être réglé" #~ msgid "Time limits for days for user have been processed" #~ msgstr "Les limites quotidiennes pour l'utilisateur ont été traitées" #~ msgid "Please select a hour interval to remove" #~ msgstr "Veuillez choisir un intervalle de temps à retirer" #~ msgid "Interval start can not be the same as end" #~ msgstr "" #~ "Le début de l'intervalle ne peut être identique à la fin de l'intervalle" #~ msgid "Interval start or end duplicates existing interval" #~ msgstr "" #~ "Le début ou la fin de l'intervalle est un doublon de l'intervalle existant" #~ msgid "Interval end conflicts with existing one" #~ msgstr "La fin de l'intervalle est en conflit avec la valeur existante" #~ msgid "Interval start conflicts with existing one" #~ msgstr "Le début de l'intervalle est en conflit avec la valeur existante" #~ msgid "Interval overlaps with existing one" #~ msgstr "L'intervalle chevauche l'intervalle existant" #~ msgid "please-enter-translator-credits" #~ msgstr "jplord@gmail.com" #~ msgid "00:00:00:00" #~ msgstr "00:00:00:00" #~ msgid "Time spent for this week (saved stated, not real-time)" #~ msgstr "Temps d'utilisation cette semaine (pas en temps réel)" #~ msgid "Subtract specified amount (penalty)" #~ msgstr "Soustraire la quantité spécifiée (punition)" #~ msgid "Amount:" #~ msgstr "Quantité :" #~ msgid "Add specified amount (reward)" #~ msgstr "Ajouter la quantité spécifiée (récompense)" #~ msgid "Set track inactive sessions" #~ msgstr "Activer le suivi des sessions inactives" #~ msgid "Set exacly specified limit" #~ msgstr "Régler exactement la limite spécifiée" #~ msgid "Specify day's limit" #~ msgstr "Spécifiez la limite quotidienne" #~ msgid "Specify START minute of the allowed hour interval" #~ msgstr "Réglez la minute de DÉBUT de l'intervalle" #~ msgid "Specify START hour of the allowed hour interval" #~ msgstr "Réglez l'heure de DÉBUT de l'intervalle" #~ msgid "from" #~ msgstr "de" #~ msgid "Set the amount of hours to limit available time for particular day" #~ msgstr "" #~ "Réglez le nombre d'heures pour limiter le temps disponible pour un " #~ "certain jour" #~ msgid "to" #~ msgstr "à" #~ msgid "Time limit (month)" #~ msgstr "Limite de temps (mois)" #~ msgid "Time limit for the month" #~ msgstr "Limites de temps pour le mois" #~ msgid "Apply all changes made in this page" #~ msgstr "Appliquer les changements faits sur cette page" #~ msgid "Specify END minute of the allowed hour interval" #~ msgstr "Réglez la minute de FIN de l'intervalle permis" #~ msgid "Specify END hour of the allowed hour interval" #~ msgstr "Réglez l'heure de FIN de l'intervalle permis" #~ msgid "Time limit (week)" #~ msgstr "Limite de temps (semaine)" #~ msgid "Time limit for the week is enabled" #~ msgstr "Limite de temps pour la semaine activée" #~ msgid "Time limit for the month is enabled" #~ msgstr "Limite de temps pour le mois activée" #~ msgid "Time limit for the week" #~ msgstr "Limite de temps hebdomadaire" #~ msgid "Week limit amount (hours part)" #~ msgstr "Limite hebdomadaire (heures)" #~ msgid "Week limit amount (minutes part)" #~ msgstr "Limite hebdomadaire (minutes)" #~ msgid "day" #~ msgstr "jour" #~ msgid "Week limit amount (days part)" #~ msgstr "Limite hebdomadaire (jours)" #~ msgid "Month limit amount (days part)" #~ msgstr "Limite mensuelle (jours)" #~ msgid "Month limit amount (hours part)" #~ msgstr "Limite mensuelle (heures)" #~ msgid "Apply weekly and monthly limits" #~ msgstr "Appliquer les limites hebdomadaires et mensuelles" #~ msgid "Month limit amount (minutes part)" #~ msgstr "Limite mensuelle (minutes)" #~ msgid "This specifies the time interval at which actual user state is saved" #~ msgstr "" #~ "Règle l'intervalle de temps auquel l'état d'un utilisateur est enregistré" #~ msgid "Warning time" #~ msgstr "Délai d'avertissement" #~ msgid "" #~ "Specify session polling time granularity (at which interval user sessions " #~ "and activity are polled).\n" #~ "3 -5 seconds are optimal, don't change this if unsure." #~ msgstr "" #~ "Réglez la granularité du rafraîchissement du temps (intervalle de " #~ "rafraîchissement des données utilisateur).\n" #~ "3-5 secondes est idéal, ne changez pas ce paramètre si vous ne savez pas " #~ "ce que vous faites." #~ msgid "Remove excluded session type from the list" #~ msgstr "Retirer le type de session exclue de la liste" #~ msgid "Enter session type to be tracked" #~ msgstr "Entrez le type de session à suivre" #~ msgid "Enter session type to be excluded from tracking" #~ msgstr "Entrez le type de session à exclure du suivi" #~ msgid "Add excluded session type to the list" #~ msgstr "Ajouter le type de session exclue à la liste" #~ msgid "Remove user from the exclusion list" #~ msgstr "Retirer l'utilisateur de la liste d'exclusion" #~ msgid "Add user to the exclusion list" #~ msgstr "Ajouter l'utilisateur à la liste d'exclusion" #~ msgid "Enter username to be excluded from tracking" #~ msgstr "Ajoutez le nom d'utilisateur à exclure du suivi" #~ msgid "Apply Timekpr-nExT setings" #~ msgstr "Appliquer les réglages de Timekpr-nExT" #~ msgid "Continous time left to You which may span to more than a current day" #~ msgstr "Temps restant (peut s'étendre sur plus d'un jour)" #~ msgid "Continous time left:" #~ msgstr "Temps restant :" #~ msgid "These are days and limits that available to You" #~ msgstr "Jours et limites qui sont associés à l'utilisateur" #~ msgid "This shows time intervals that are available for Your use" #~ msgstr "Intervalles d'utilisation qui sont associés à l'utilisateur" #~ msgid "Time spent for this month" #~ msgstr "Temps utilisé ce mois-ci" #~ msgid "TIme spent for this week" #~ msgstr "Temps utilisé cette semaine" #~ msgid "Time limit for month available to You" #~ msgstr "Limite de temps pour le mois" #~ msgid "Time limit for week available to You" #~ msgstr "Limite de temps pour la semaine" #~ msgid "" #~ "This sets logging level (please do not change this unless You know what " #~ "You're doing)" #~ msgstr "" #~ "Réglage du niveau du journal (veuillez ne pas modifier si vous ne savez " #~ "pas ce que vous faîtes)" #~ msgid "Weekly and monthly limit configuration" #~ msgstr "Réglages des limites hebdomadaires et mensuelles" #~ msgid "This allows You to set up weekly & monthly limits" #~ msgstr "Réglages des limites hebdomadaires et mensuelles" #~ msgid "Configure time limits for week days" #~ msgstr "Configuration de limites de temps pour les jours de la semaine" #, python-format #~ msgid "Config for %s:" #~ msgstr "Configuration pour %s :" #~ msgid "" #~ "This is Timekpr-nExT configuration app. It allows you to configure time " #~ "for your users as well as the Timekpr-nExT parameters.\n" #~ "\n" #~ "To use this application, you either have to execute it as superuser or " #~ "have to be part of the timekpr group.\n" #~ "Please note that the \"Timekpr-nExT Configuration\" is available in " #~ "superuser (administrator) mode only!\n" #~ "\n" #~ "Please configure carefully: do not lock yourself out!" #~ msgstr "" #~ "Voici l'outil de gestion de Timekpr-nExT. Il permet de configurer des " #~ "limites de temps pour vos utilisateurs ainsi que les paramètres de " #~ "Timekpr-nExT.\n" #~ "\n" #~ "Vous pouvez utiliser ce logiciel en tant que super utilisateur ou en " #~ "faisant partie du groupe timekpr. Veuillez noter que les paramètres de " #~ "Timekpr-nExT sont disponibles seulement en tant que super utilisateur!\n" #~ "\n" #~ "Veuillez prendre soin de ne pas vous verrouillez en dehors de votre " #~ "session!" #~ msgid "" #~ "This allows you to change time for today as well as inactive session " #~ "tracking" #~ msgstr "" #~ "Paramètres de temps pour aujourd'hui ainsi que le suivi de session " #~ "inactive" #~ msgid "The amount of minutes to be adjusted for today's limit" #~ msgstr "Nombre de minute(s) à ajuster à la limite d'aujourd'hui" #~ msgid "The amount of hours to be adjusted for today's limit" #~ msgstr "Nombre d'heure(s) à ajuster à la limite d'aujourd'hui" #~ msgid "Add" #~ msgstr "Ajouter" #~ msgid "Subtract" #~ msgstr "Soustraire" #~ msgid "" #~ "Select whether time for inactive sessions are counted. If this is " #~ "unchecked, time spent in console (not terminal) and while screen is " #~ "locked is NOT taken into account (this very much varies from DE to DE)" #~ msgstr "" #~ "Si le temps pour les sessions inactives est compté, si cette option est " #~ "désactivée, le temps passé dans la console (pas le terminal) et si " #~ "l'écran est verrouillé, n'est PAS pris en compte (ceci varie beaucoup " #~ "selon les environments de bureau)" #~ msgid "" #~ "Lists day of the week and additional information about the day's limit, " #~ "please enable / disable days for the user" #~ msgstr "" #~ "Liste des jours de la semaine et informations sur les limites " #~ "quotidiennes. Veuillez activer / désactiver les jours pour l'utilisateur" #~ msgid "" #~ "Set specified hours and minutes for particular day at user's disposal (do " #~ "not forget to hit the button)" #~ msgstr "" #~ "Réglez les heures et minutes disponibles pour un certain jour (n'oubliez " #~ "pas de cliquer sur le bouton " #~ "button)" #~ msgstr "" #~ "Retirer l'intervalle choisi de la liste (n'oubliez pas de cliquer sur " #~ ")" #~ msgid "" #~ "Add specified hour interval to the list (do not forget to hit th e " #~ "button)" #~ msgstr "" #~ "Ajoutez l'intervalle de temps à la liste (n'oubliez pas de cliquer sur " #~ ")" #~ msgid "Apply" #~ msgstr "Appliquer" #~ msgid "Weekly & Monthly limits" #~ msgstr "Limites hebdomadaires et mensuelles" #~ msgid "" #~ "Timekpr-nExT log level. Please do not change this unless asked (you " #~ "likely won't find anything pretty in the log files)\n" #~ "1 - standard, 2 - debug, 3 - extra debug" #~ msgstr "" #~ "Niveau du journal de Timekpr-nExT, veuillez ne pas modifier sans en avoir " #~ "reçu la demande\n" #~ "1- standard, 2- debug, 3- extra debug" #~ msgid "" #~ "Specify the time in seconds when Timekpr-nExT starts continuous real-time " #~ "countdown before terminating the session" #~ msgstr "" #~ "Réglez le temps en seconde à partir duquel Timekpr-nExT débute le compte " #~ "à rebours en temps réel avant la fermeture de la session" #~ msgid "" #~ "Amount of seconds before terminating user sessions. After this is " #~ "reached, user will be terminated, nothing can be done to prevent it.\n" #~ "Adding time does not help in this case. Do that before reaching this " #~ "point..." #~ msgstr "" #~ "Nombre de secondes avant de fermer la session de l'utilisateur. Une fois " #~ "cette valeur passée, la session sera fermée et rien ne pourra l'arrêter.\n" #~ "Ajouter du temps ne changera pas l'état de la session. Le temps doit " #~ "être ajouté avant d'arriver à ce moment." #~ msgid "" #~ "List of session types to be tracked.\n" #~ "Please, do not change or experiment with this unless you actually (not " #~ "wishfully) know what you are doing." #~ msgstr "" #~ "Liste des types de sessions à suivre.\n" #~ "Veuillez ne pas modifier sans savoir ce que vous faîtes." #~ msgid "" #~ "List of sessions to be excluded from tracking.\n" #~ "Please, do not change or experiment with this unless you actually (not " #~ "wishfully) know what you are doing." #~ msgstr "" #~ "Liste des sessions à exclure du suivi.\n" #~ "Veuillez ne pas modifier sans savoir ce que vous faîtes." #~ msgid "" #~ "List of users excluded from tracking.\n" #~ "Please specify actual usernames, not real names here (e.g please specify " #~ "jsmith, not John Smith)" #~ msgstr "" #~ "Liste des utilisateurs exclus du suivi.\n" #~ "Veuillez utiliser les et non pas les vrais noms (par " #~ "ex: jsmith, pas John Smith)" #~ msgid "" #~ "Specify whether to show notification when limit configurations or " #~ "allowance changes" #~ msgstr "" #~ "Activation des avertissements quand les limites ou les allocations " #~ "changent" #~ msgid "" #~ "Specify whether to show all notifications. If unchecked, then only " #~ "important ones are shown" #~ msgstr "" #~ "Activation de tous les avertissements. Si désactivé, seulement les " #~ "avertissements importants seront montrés" #~ msgid "" #~ "Specify whether to show seconds in notification area (some DE, like KDE5, " #~ "do not support text besides notification icons)" #~ msgstr "" #~ "Activation de l'affichage des secondes dans la zone d'avertissement (ne " #~ "fonctionne pas sur tous les environnement, incluant par exemple KDE5)" #, python-format #~ msgid "Icon inititalization error (%%s)!" #~ msgstr "Erreur d'initialisation de l'icône (%%s)" #, python-format #~ msgid "" #~ "Feature \"%%s\", which is used to detect idle time, can not be enabled!\n" #~ "Idle / inactive time might not be accounted when screen is locked!" #~ msgstr "" #~ "La fonctionnalité \"%%s\", qui est utilisée pour détecter le temps " #~ "d'inactivité, ne peut pas être activée!\n" #~ "Le temps inactif / inactif peut ne pas être pris en compte lorsque " #~ "l'écran est verrouillé!" #~ msgid "Set" #~ msgstr "Appliquer" #~ msgid "Hide tray icon is not passed" #~ msgstr "L'icône Masquer la barre d'état n'est pas transmise" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct" #~ msgstr "L'icône de masquage de la barre d'état \"%%s\" n'est pas correcte" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "L'icône de masquage de la barre d'état \"%%s\" n'est pas correcte et ne " #~ "peut pas être définie" #, python-format #~ msgid "User's \"%%s\" hide tray icon flag is not correct and can not be set" #~ msgstr "" #~ "L'indicateur de l'icône de masquage de la barre d'état \"%%s\" de " #~ "l'utilisateur n'est pas correct et ne peut pas être défini" #~ msgid "" #~ "Unexpected ERROR getting confguration. Please inspect Timekpr-nExT log " #~ "files" #~ msgstr "ERREUR inattendue (obtenir la config). Vérifiez le journal" #~ msgid "" #~ "Unexpected ERROR getting user confguration. Please inspect Timekpr-nExT " #~ "log files" #~ msgstr "" #~ "ERREUR inattendue (obtenir la config utilisateur). Vérifiez le journal" #~ msgid "" #~ "Unexpected ERROR updating confguration. Please inspect Timekpr-nExT log " #~ "files" #~ msgstr "ERREUR inattendue (mise à jour de la config). Vérifiez le journal" #~ msgid "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Super tester: Rinalds Dobelis\n" #~ "Beta tester: SanskritFritz" #~ msgstr "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Super testeur: Rinalds Dobelis\n" #~ "Testeur de la version Beta: SanskritFritz" #~ msgid "This shows information about time left / spent" #~ msgstr "Informations sur le temps restant / passé" #~ msgid "" #~ "Continuous time left to user which may span to more than a current day " #~ "(realtime, available when user is logged in)" #~ msgstr "" #~ "Temps continu laissé à l'utilisateur qui peut s'étendre sur plus d'un " #~ "jour en cours (temps réel, disponible lorsque l'utilisateur est connecté)" #~ msgid "" #~ "How long user was inactive since last login (realtime, available when " #~ "user is logged in)" #~ msgstr "" #~ "Depuis combien de temps l'utilisateur était inactif depuis la dernière " #~ "connexion (en temps réel, disponible lorsque l'utilisateur est connecté)" #~ msgid "Set preference for showing icon to user" #~ msgstr "Définir la préférence pour afficher l'icône à l'utilisateur" #~ msgid "" #~ "Select whether to show padlock icon and notifications to user.\n" #~ "Please note that this will disable showing all information and " #~ "notifications to the user!" #~ msgstr "" #~ "Choisissez d'afficher l'icône du cadenas et les notifications à " #~ "l'utilisateur.\n" #~ "Veuillez noter que cela désactivera l'affichage de toutes les " #~ "informations et notifications à l'utilisateur!" #~ msgid "" #~ "Select whether to use speech notifications (if not available, this will " #~ "be greyed out). If usage of speech is very much needed, please install " #~ "python3-espeak package" #~ msgstr "" #~ "Activation des avertissements vocaux (grisé si non disponible). Requiert " #~ "l'installation du paquet python3-espeak" timekpr-next/resource/locale/de/000775 001750 001750 00000000000 13476006650 020662 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/de/LC_MESSAGES/000775 001750 001750 00000000000 14017261747 022451 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/de/LC_MESSAGES/timekpr.mo000664 001750 001750 00000061231 14017261747 024464 0ustar00bezvfedubezvfedu000000 000000 % @A\$w*0H V*n%3$YD~8 (6_${+)*'IqY.  <J b lz#%*<##`+  %*<!N3p '_9 * */Zi y1( !*8 cm0 <NT%( 0P%h-) & 2 C M 0l  !!!!!U!J"#R"v"!""%"7"%#+D#2p#4#7#$4*$6_$5$7$;%7@%6x%2%%C%>&M&a&t& &&&D&*&))'S'g'}'''3'@'/(2D(.w( ()((())()'R)z))B)#)5)*4*_*|****I*H+S_+"++%+$,:,R,e,<,+,=,*)-$T-6y-#-/-'./,..\.-.?.,./&/AV/./,/>/+30_0 h0r0061(F1o131G1 2 22"282W4657*7&G73n7797W7K87h88+X9+9i9O:j:p:):E:-:/!;Q;e;/~;2;5;4<"L<Ho<<+<=< 5=C= Z= d=%q=(=5=0=3'>U[>0>">?5? P?]?a?w? ? ??6?:@\@@5@\@:0AkAA5IBWB4B- C:C'>CGfCCC C@C'D2:D mD"xD DD*D D!DDE!YE{E$E ERE^)F/F7FF$GF'G#nG+GGG(H1/HaH2rHHH)HKH(EInI `J mJJ%JOJ K$)KNK'mKK%KGK$L?9L@yLDLDL&DM>kM>M6M@ NBaN&N8N5O:OVRO OOOOPP0P]CP+P+PPQ'Q=Q(SQ9|QZQ(R8:R1sR R>RR S(S,8\`w\C\ ])]>]^]B^9R^%^>^R^D_F_J_4[__Y?bo'!P.`Z9t(e#j Ol"-varA?q$n|b+*M,DQ&us/mTk>}@]zCWG Kc28N<S[4 xIRB3i_XpHV 0g)6;fhd%JU=~ L 7yw5F{1^:\YE%(n)s minute%(n)s minutes%(n)s second%(n)s seconds%(n)s second left%(n)s seconds left%(n)s user in total:%(n)s users in total:---=== NOTICE ===---==> get saved user list from the server, example==> get user configuration and time information from the server, example==> print help, example==> set allowed days for the user, example==> set time left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set time limit per month, example==> set time limit per week, example==> set whether to hide tray icon and prevent notifications, example==> set whether to track inactive user sessions, exampleAboutAbout Timekpr-nExTAdd a user to the exclusion listAdd an excluded session type to the listAdd specified time (reward)Add tracked session type to the listAdditional limitsAdditional statisticsAdditional time for user has been processedAllowed days for user have been processedAllowed hours for user have been processedApply all Timekpr-nExT settings at onceApply daily limitsBrief information about time spent and everything related to time management for this dayClose the windowCommand FAILED: access deniedCommand FAILED: communication was not acceptedConfigurationConfiguration retrievedConnectedConnecting...Continuous time left:Control Timekpr-nExT SettingsControl Timekpr-nExT tracking itemsControl sessions types are not passedControl sessions types list is not correctControl sessions types list is not correct and cannot be setCritical notification timeout (sec)Current effective usernameCurrent statisticsDaily limit configuration for all week daysDaily limitsDayDays & LimitsEduards Bezverhijs (Translations fine-tuning by JP Lord ) (English fine-tuning by Phil Hudson )EnabledExcluded SessionsExcluded UsersExcluded session types are not passedExcluded session types list is not correctExcluded session types list is not correct and cannot be setExcluded user list is not correctExcluded user list is not correct and cannot be setExcluded user list is not passedFailed to connectFeature "%%s", which is used to detect idle time, cannot be enabled! Idle / inactive time might not be accounted when screen is locked!Final warning time "%%s" is not correctFinal warning time "%%s" is not correct and cannot be setFinal warning time is not passedFormat: FromHide icon and notifications:Hide tray icon for user has been processedHour intervalsIcon, isn't it?Info & TodayInternal connection error, please check log filesInterval removedInterval start cannot be the same as endIntervalsKeep control of computer usageLimitLimits & ConfigurationList of usernames registered on the systemLog levelLog level "%%s" is not correctLog level "%%s" is not correct and cannot be setLog level is not passedLogging levelNotes, read carefully ;)Notification timeout (sec)PARAMETER PARSE ERROR (please check parameter validity): %%sPlease reopen the application if you are superuser and Timekpr-nExT is runningPlease select a day to set the limitsPlease select an hour interval to removePoll intervalPoll time "%%s" is not correctPoll time "%%s" is not correct and cannot be setPoll time is not passedRemove a user from the exclusion listRemove an excluded session type from the listRemove excluded session typeRemove tracked session type from the listRestoreRestore configuration from saved stateSave all changesSave timeSave time "%%s" is not correctSave time "%%s" is not correct and cannot be setSave time is not passedSelect whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Session typeShow all notificationsShow limit changesShow seconds in notification areaSpecify whether to show a notification when limit configurations or allowance changesStartedStatus of Timekpr-nExT admin clientStatus of Timekpr-nExT clientSubtract specified time (penalty)Termination timeTermination time "%%s" is not correctTermination time "%%s" is not correct and cannot be setTermination time is not passedThat interval overlaps with an existing oneThat interval's end conflicts with an existing oneThat interval's start conflicts with an existing oneThat interval's start or end duplicates an existing oneThe command is incorrect:The number of hours to be adjusted for today's limitThe number of minutes to be adjusted for today's limitThe usage of Timekpr-nExT admin client is as follows:There is a problem communicating to Timekpr-nExT (%%s)!There is a problem connecting to Timekpr-nExT daemon (%%s)!These are the days and limits that are available to youTime allowance has changed, please note new time left!Time available today (saved stated, not real-time)Time inactive (actual):Time inactive this session or after Timekpr-nExT has been restartedTime inactive:Time left (actual):Time left (today):Time left today:Time left...Time limit (month):Time limit (week):Time limit configuration has changed, please note new configuration!Time limit for this month available to youTime limit for this week available to youTime spent (month):Time spent (session):Time spent (today):Time spent (week):Time spent this monthTime spent this month (saved stated, not real-time)Time spent this session or after Timekpr-nExT has been restartedTime spent this weekTime spent this week (saved stated, not real-time)Time spent today (saved stated, not real-time)Timekpr-nExTTimekpr-nExT Administration ConfigurationTimekpr-nExT ConfigurationTimekpr-nExT administrationTimekpr-nExT clientTimekpr-nExT configuration has been savedTimekpr-nExT interface is not yet readyTimekpr-nExT notificationToTotal time available left today in a row, up to the end of the dayTrack inactive "%%s" is not correctTrack inactive "%%s" is not correct and cannot be setTrack inactive for user has been processedTrack inactive is not passedTrack inactive sessions:Track inactive:Tracked SessionsUNEXPECTED ERROR: %%sUnexpected ERROR getting user list. Please inspect Timekpr-nExT log filesUnexpected ERROR updating control. Please inspect Timekpr-nExT log filesUnexpected ERROR while loading configuration. Please inspect Timekpr-nExT log filesUse sound "bell" for notificationsUse speech notificationsUser "%%s" configuration is not foundUser "%%s" control file is not foundUser "%%s" is not foundUser ConfigurationUser configuration retrievedUser's "%%s" allowed hours are not correct and cannot be setUser's "%%s" day limits list is not correctUser's "%%s" day limits list is not correct and cannot be setUser's "%%s" day limits list is not passedUser's "%%s" day list is not correctUser's "%%s" day list is not correct and cannot be setUser's "%%s" day list is not passedUser's "%%s" day number must be between 1 and 7User's "%%s" day number must be presentUser's "%%s" hide tray icon flag is not correctUser's "%%s" hide tray icon flag is not passedUser's "%%s" monthly allowance is not correctUser's "%%s" monthly allowance is not correct and cannot be setUser's "%%s" monthly allowance is not passedUser's "%%s" track inactive flag is not correctUser's "%%s" track inactive flag is not correct and cannot be setUser's "%%s" track inactive flag is not passedUser's "%%s" weekly allowance is not correctUser's "%%s" weekly allowance is not correct and cannot be setUser's "%%s" weekly allowance is not passedUsernameUsername:Users related configurationWARNING: Timekpr-nExT administration utility was asked to run in GUI mode, but no displays are available, thus running in CLI...Weekly and monthly limits for user have been processedYou have %(n)s hourYou have %(n)s hoursYour time is not limited todayYour time is up, you will be forcibly logged out inhours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)hrminn/anumeric time values are in secondstimekpr-nextThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . In Debian, see file /usr/share/common-licenses/GPL-3weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, format: 1-7)Project-Id-Version: Timekpr nExT Report-Msgid-Bugs-To: PO-Revision-Date: 2021-03-01 22:14+0200 Last-Translator: Eduards Bezverhijs Language-Team: Ulle Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2020-10-10 15:24+0000 X-Generator: Poedit 2.4.1 X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __:1,2 %(n)s Minute%(n)s Minuten%(n)s Sekunde%(n)s Sekundennoch %(n)s Sekundenoch %(n)s SekundenInsgesamt %(n)s Benutzer:Insgesamt %(n)s Benutzer:---=== BEACHTEN ===---==> Gespeicherte Benutzerliste vom Server holen, Beispiel==> Gespeicherte Benutzerkonfiguration und Zeitinformationen vom Server holen, Beispiel==> Hilfe ausgeben, Beispiel==> Erlaubte Tage für den Benutzer festlegen, Beispiel==> Restzeit festlegen ab jetzt für momentanen Benutzer: "+" (Zeit hinzufügen), "-" (Zeit subtrahieren), "=" (genaue verfügbare Zeit einstellen), Beispiel (eine Stunde hinzufügen)==> Zeitlimit pro Monat festlegen, Beispiel==> Zeitlimit pro Woche festlegen, Beispiel==> Legen Sie fest, ob das Taskleistensymbol ausgeblendet und Benachrichtigungen verhindert werden sollen==> Festlegen, ob inaktive Benutzer-Sitzungen beachtet werden sollen, BeispielÜberÜber Timekpr-nExTBenutzer zur Ausschluss-Liste hinzufügenSitzungs-Typ, der nicht überwacht werden soll, zur Liste hinzufügenDie angegebene Anzahl hinzufügen (Belohnung)Überwachten Sitzungs-Typ zur Liste hinzufügenZusätzliche LimitsZusätzliche StatistikenZusatz-Zeit für den Benutzer wurde verarbeitetErlaubte Tage für den Benutzer wurden verarbeitetErlaubte Stunden für den Benutzer wurden verarbeitetAnwenden aller Timekpr-nExT Einstellungen auf einmalListe der Tages-Limits übernehmenKurze Zusammenfassung zur heute bestehenden und verwendeten NutzungszeitFenster schließenKommando fehlgeschlagen: Zugriff verweigertKommando fehlgeschlagen: Kommunikation wurde nicht angenommenKonfigurationKonfiguration erhaltenVerbundenVerbinden...Verbleibende Zeit ohne Unterbrechung:Verwalten der Timekpr-nExT EinstellungenVerwalten der von Timekpr-nExT überwachten ZuständeTyp der Sitzungssteuerung wurde nicht übergebenListe der Sitzungssteuerung-Typen ist nicht korrektListe der Sitzungssteuerung-Typen ist nicht korrekt und kann nicht verarbeitet werdenZeitlimit für kritische Benachrichtigung (Sek.)Momentaner effektiver BenutzernameAktuelle StatistikenKonfigurieren der Tages-Limits für die gesamte WocheTages-LimitsTagNutzungstage & Limitsulle@o2online.deAktiviertNicht überwachte Sitzungs-TypenNicht überwachte BenutzerAusgeschlossene Sitzungs-Typen wurden nicht übergebenListe der ausgeschlossenen Sitzungstypen ist nicht korrektListe der ausgeschlossenen Sitzungstypen ist nicht korrekt und kann nicht verarbeitet werdenListe der ausgeschlossenen Benutzer ist nicht korrektListe der ausgeschlossenen Benutzer wurde nicht übergeben und kann nicht verarbeitet werdenListe der ausgeschlossenen Benutzer wurde nicht übergebenVerbindung fehlgeschlagenDie Funktion "%%s", mit der die Leerlaufzeit erkannt wird, kann nicht aktiviert werden! Leerlauf- / Inaktivitätszeit wird möglicherweise nicht berücksichtigt, wenn der Bildschirm gesperrt ist!Zeitpunkt der letzten Warnung "%%s" ist nicht korrektZeitpunkt der letzten Warnung "%%s" ist nicht korrekt und kann nicht verarbeitet werdenZeitpunkt der letzten Warnung wurde nicht übergebenFormat: VonVerberge Symbol und Benachrichtigungen:Das Symbol zum Ausblenden des Fachs für den Benutzer wurde verarbeitetStunden-IntervalleIst DAS nicht ein Icon?Info & HeuteInterner Verbindungsfehler. Bitte schauen Sie in die log-DateienIntervall entferntIntervall-Beginn muss ungleich Intervall-Ende seinIntervalleComputer-Nutzung im Griff behaltenBegrenzungLimits & KonfigurationListe der im System registrierten BenutzerLog-StufeLog level "%%s" ist nicht korrektLog level "%%s" ist nicht korrekt und kann nicht verarbeitet werdenLog level wurde nicht übergebenLog-AusführlichkeitHinweise, bitte sorgfältig lesen ;)Benachrichtigungs-Timeout (Sek.)PARAMETERANALYSEFEHLER (bitte überprüfen Sie die Gültigkeit der Parameter): %%sBitte öffnen Sie die Anwendung erneut wenn Sie Superuser sind und Timekpr-nExT bereits läuftBitte wählen Sie einen Tag für die BegrenzungBitte wählen Sie einen Stunden-Intervall zum EntfernenAbfrage-IntervallAbfrage-Zeit "%%s" ist nicht korrektAbfrage-Zeit "%%s" ist nicht korrekt und kann nicht verarbeitet werdenAbfrage-Zeit wurde nicht übergebenBenutzer von der Ausschluss-Liste entfernenSitzungs-Typ, der nicht überwacht werden soll, von der Liste entfernenAusgeschlossene Sitzungs-Typen entfernenÜberwachten Sitzungs-Typ von der Liste entfernenWiederherstellenWiederherstellen einer gespeicherten KonfigurationAlle Änderungen speichernZeit speichernSpeicherzeitpunkt "%%s" ist nicht korrektSpeicherzeitpunkt "%%s" ist nicht korrekt und kann nicht verarbeitet werdenSpeicherzeitpunkt wurde nicht übergebenNutzungszeit mit gesperrtem Bildschirm oder ohne aktives Fenster (sogenannte console) wird nicht mitgezählt (abhängig von gewählter Desktopumgebung). Ist das Häkchen gesetzt, zählt alles vom Einloggen bis zum Ausloggen als Nutzungszeit.Sitzungs-TypAlle Benachrichtigungen anzeigenLimit-Änderungen anzeigenBenachrichtigungen enthalten SekundenSollen Änderungen an Limits oder der erlaubten Nutzungszeiten angezeigt werdenGestartetStatus des Timekpr-nExT Admin ClientStatus des Timekpr-nExT ClientDie angegebene Anzahl abziehen (Strafe)Beendigungs-ZeitEnd-Zeitpunkt "%%s" ist nicht korrektEnd-Zeitpunkt "%%s" ist nicht korrekt und kann nicht verarbeitet werdenEnd-Zeitpunkt wurde nicht übergebenIntervall überschneidet sich mit bereits vorhandenem IntervallIntervall-Ende kollidiert mit bereits vorhandenem Intervall-EndeIntervall-Beginn kollidiert mit bereits vorhandenem Intervall-BeginnIntervall-Beginn oder -Ende duploziert bereits vorhandenen IntervallDer folgende Befehl ist nicht korrekt:Die Anzahl der Stunden der Anpassung des heutigen Tages-LimitsDie Anzahl der Minuten der Anpassung des heutigen Tages-LimitsBenutzung von Timekpr-nExT Admin-Client ist wie folgt:Es gibt ein Problem mit der Kommunikation zu Timekpr-nExT (%%s)!Es gibt ein Problem beim Verbinden zum Timekpr-nExT Service (%%s)!Ihnen erlaubte Nutzungstage und LimitsErlaubte Zeit wurde geändert, bitte neue Zeit beachten!Heute verfügbare Zeit (gespeichert, nicht real-time)Zeit inaktiv (aktuell):Passive Nutzungszeit in der Benutzersitzung oder seit Timekpr-nExT neu gestartet wurdePassive Zeit:Verbleibende Zeit (aktuell):Verbleibende Zeit (heute):Verbleibende Zeit heute:Verbleibende Zeit...Zeitlimit (Monat):Zeitlimit (Woche):Konfiguration der Zeitbeschränkung wurde geändert, bitte neue Zeitbeschränkungen beachten!Ihnen erlaubte Nutzungszeit in diesem MonatIhnen erlaubte Nutzungszeit in dieser WocheNutzungszeit (Monat):Nutzungszeit (Sitzung):Nutzungszeit (heute):Nutzungszeit (Woche):Verbrauchte Nutzungszeit in diesem MonatNutzungszeit dieses Monats (gespeichert, nicht real-time)Verbrauchte Nutzungszeit in der Benutzersitzung oder seit Timekpr-nExT neu gestartet wurdeVerbrauchte Nutzungszeit in dieser WocheNutzungszeit dieser Woche (gespeichert, nicht real-time)Nutzungszeit heute (gespeichert, nicht real-time)Timekpr-nExTKonfigurieren, wie Timekpr-nExT arbeiten soll (Administration)Timekpr-nExT-KonfigurationTimekpr-nExT AdministrationTimekpr-nExT ClientTimekpr-nExT-Konfiguration wurde gespeichertTimekpr-nExT-Schnittstelle ist noch nicht bereitTimekpr-nExT HinweisZuVerbleibende Zeit insgesamt bis zum Ende des TagesBeachtung von Inaktivität "%%s" ist nicht korrektBeachtung von Inaktivität "%%s" ist nicht korrekt und kann nicht verarbeitet werdenInaktivitäts-Verfolgung für den Benutzer wurde verarbeitetBeachtung von Inaktivität wurde nicht übergebenPassive Nutzungszeit mitzählen:Passive Nutzung überwachen:Überwachte SitzungenUnerwarteter Fehler: %%sUnerwarteter Fehler beim Holen der Benutzer-Liste. Bitte schauen Sie in die Timekpr-nExT log-DateienUnerwarteter Fehler beim Aktualisieren der Steuerung. Bitte schauen Sie in die Timekpr-nExT log-DateienUnerwarteter Fehler beim Laden der Konfiguration. Bitte schauen Sie in die Timekpr-nExT log-DateienSound "Piepton" für BenachrichtigungenSprach-Hinweise verwendenKonfiguration für Benutzer "%%s" nicht gefundenSteuerungs-Datei für Benutzer "%%s" nicht gefundenBenutzer "%%s" nicht gefundenBenutzer-KonfigurationBenutzer-Konfiguration wurde geladenErlaubte Stunden für Benutzer "%%s" sind nicht korrekt und können nicht verarbeitet werdenListe der Tages-Limits für Benutzer "%%s" ist nicht korrektListe der Tages-Limits für Benutzer "%%s" ist nicht korrekt und kann nicht verarbeitet werdenListe der Tages-Limits für Benutzer "%%s" wurde nicht übergebenListe der Tage für Benutzer "%%s" ist nicht korrektListe der Tage für Benutzer "%%s" ist nicht korrekt und kann nicht verarbeitet werdenListe der Tage für Benutzer "%%s" wurde nicht übergebenAnzahl der Tage für Benutzer "%%s" kann nur 1 bis 7 seinAnzahl der Tage für Benutzer "%%s" muss vorhanden seinDas Flag "%%s" des Benutzers zum Ausblenden des Tray-Symbols ist nicht korrektDas Flag "%%s" des Benutzers wird nicht übergebenMonatliches Zeitlimit für Benutzer "%%s" ist nicht korrektMonatliches Zeitlimit für Benutzer "%%s" ist nicht korrekt und kann nicht verarbeitet werdenMonatliches Zeitlimit für Benutzer "%%s" wurde nicht übergebenDer Schalter für Inaktivitäts-Beachtung "%%s" ist nicht korrektDer Schalter für Inaktivitäts-Beachtung "%%s" ist nicht korrekt und kann nicht verarbeitet werdenDer Schalter für Inaktivitäts-Beachtung "%%s" wurde nicht übergebenWöchentliches Zeitlimit für Benutzer "%%s" ist nicht korrektWöchentliches Zeitlimit für Benutzer "%%s" ist nicht korrekt und kann nicht verarbeitet werdenWöchentliches Zeitlimit für Benutzer "%%s" wurde nicht übergebenBenutzernameBenutzer auswählen:Benutzer-bezogene KonfigurationWarnhinweis: Timekpr-nExT-Administrationstool soll im GUI-Modus gestartet werden, es sind aber keine grafischen Fenster möglich. Daher wird der Kommandozeilen-Modus gestartet.Wochen- und Monats-Zeitlimits für den Benutzer wurden verarbeitetEs bleibt noch %(n)s StundeEs bleiben noch %(n)s StundenHeute gibt es keine ZeitbeschränkungDie erlaubte Nutzungszeit ist vorbei, das Ausloggen erfolgt inDie Stunden sind gemäß ISO 8601 nummeriert (d. h. 24-Stunden-Uhr, Format: 0-23).hminnicht verfügbarDie numerischen Zeitwerte sind in Sekunden angegebenDieses Programm ist Freie Software: Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation, Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren veröffentlichten Version, weiter verteilen und/oder modifizieren. Dieses Programm wird in der Hoffnung bereitgestellt, dass es nützlich sein wird, jedoch OHNE JEDE GEWÄHR,; sogar ohne die implizite Gewähr der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU General Public License für weitere Einzelheiten. Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Wenn nicht, siehe Wochentage sind gemäß ISO 8601 nummeriert (d. h. Montag ist der erste Tag, Format: 1-7)timekpr-next/resource/locale/de/LC_MESSAGES/timekpr.po000664 001750 001750 00000352070 14017261747 024473 0ustar00bezvfedubezvfedu000000 000000 msgid "" msgstr "" "Project-Id-Version: Timekpr nExT\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-03-01 22:11+0200\n" "PO-Revision-Date: 2021-03-01 22:14+0200\n" "Last-Translator: Eduards Bezverhijs \n" "Language-Team: Ulle \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2020-10-10 15:24+0000\n" "X-Generator: Poedit 2.4.1\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __:1,2\n" #: common/constants/messages.py:31 msgid "==> print help, example" msgstr "==> Hilfe ausgeben, Beispiel" #: common/constants/messages.py:32 msgid "==> get saved user list from the server, example" msgstr "==> Gespeicherte Benutzerliste vom Server holen, Beispiel" #: common/constants/messages.py:33 msgid "" "==> get user configuration and time information from the server, example" msgstr "" "==> Gespeicherte Benutzerkonfiguration und Zeitinformationen vom Server " "holen, Beispiel" #: common/constants/messages.py:34 msgid "==> set allowed days for the user, example" msgstr "==> Erlaubte Tage für den Benutzer festlegen, Beispiel" #. TRANSLATORS: please DO NOT translate the keyword "ALL" #: common/constants/messages.py:36 #, fuzzy msgid "" "==> set allowed hours for the specified day, or \"ALL\" for every day, " "optionally specify start and end minutes in brackets like this [x-y], " "additionally specify ! in front of hour if it doesn't have to be accounted " "(free time for user), example" msgstr "" "==> Festlegen der erlaubten Stunden für bestimmten Tag oder \"ALL\" für jedn " "Tag (optional Start- und Endminuten in Klammern angeben), Beispiel" #: common/constants/messages.py:37 #, fuzzy msgid "" "==> set time limits for all allowed days, the number of values must not " "exceed the allowed days for the user, example" msgstr "" "==> Festlegen des Zeitlimits für erlaubte Tage (Die Anzahl der Werte muss " "mit der Anzahl der zulässigen Tage übereinstimmen), Beispiel" #: common/constants/messages.py:38 msgid "==> set time limit per week, example" msgstr "==> Zeitlimit pro Woche festlegen, Beispiel" #: common/constants/messages.py:39 msgid "==> set time limit per month, example" msgstr "==> Zeitlimit pro Monat festlegen, Beispiel" #: common/constants/messages.py:40 msgid "==> set whether to track inactive user sessions, example" msgstr "" "==> Festlegen, ob inaktive Benutzer-Sitzungen beachtet werden sollen, " "Beispiel" #: common/constants/messages.py:41 msgid "==> set whether to hide tray icon and prevent notifications, example" msgstr "" "==> Legen Sie fest, ob das Taskleistensymbol ausgeblendet und " "Benachrichtigungen verhindert werden sollen" #. TRANSLATORS: please DO NOT translate the keywords: "lock", "suspend", "suspendwake", "terminate", "shutdown" #: common/constants/messages.py:43 #, fuzzy msgid "" "==> set restriction / lockout type (\"lock\" - lock session, \"suspend\" - " "suspend the computer, \"suspendwake\" - suspend and wake up, \"terminate\" - " "terminate sessions, \"shutdown\" - shutdown the computer), examples" msgstr "" "==> Restriktions- / Sperrtyp einstellen (\"lock\", \"suspend\", \"suspendwake" "\", \"terminate\", \"shutdown\"), Beispiel" #: common/constants/messages.py:44 msgid "" "==> set time left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> Restzeit festlegen ab jetzt für momentanen Benutzer: \"+\" (Zeit " "hinzufügen), \"-\" (Zeit subtrahieren), \"=\" (genaue verfügbare Zeit " "einstellen), Beispiel (eine Stunde hinzufügen)" #: common/constants/messages.py:45 #, fuzzy #| msgid "==> set allowed days for the user, example" msgid "==> set whether PlayTime is enabled for the user, example" msgstr "==> Erlaubte Tage für den Benutzer festlegen, Beispiel" #: common/constants/messages.py:46 #, fuzzy #| msgid "==> set whether to hide tray icon and prevent notifications, example" msgid "" "==> set whether PlayTime must be accounted instead of normal activity, " "example" msgstr "" "==> Legen Sie fest, ob das Taskleistensymbol ausgeblendet und " "Benachrichtigungen verhindert werden sollen" #: common/constants/messages.py:47 msgid "" "==> set whether PlayTime activities are allowed during unaccounted (\"∞\") " "intervals, example" msgstr "" #: common/constants/messages.py:48 #, fuzzy #| msgid "==> set allowed days for the user, example" msgid "==> set allowed days for PlayTime activities, example" msgstr "==> Erlaubte Tage für den Benutzer festlegen, Beispiel" #: common/constants/messages.py:49 #, fuzzy msgid "" "==> set PlayTime limits for all allowed days, the number of values must not " "exceed the allowed PlayTime allowed days for the user, example" msgstr "" "==> Festlegen des Zeitlimits für erlaubte Tage (Die Anzahl der Werte muss " "mit der Anzahl der zulässigen Tage übereinstimmen), Beispiel" #: common/constants/messages.py:50 msgid "" "==> set PlayTime activity process masks, for which the time is accounted, " "example" msgstr "" #: common/constants/messages.py:51 #, fuzzy #| msgid "" #| "==> set time left for the user at the current moment of time: \"+\" (add " #| "time), \"-\" (subtract time), \"=\" (set exact time available), example " #| "(add one hour)" msgid "" "==> set PlayTime left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> Restzeit festlegen ab jetzt für momentanen Benutzer: \"+\" (Zeit " "hinzufügen), \"-\" (Zeit subtrahieren), \"=\" (genaue verfügbare Zeit " "einstellen), Beispiel (eine Stunde hinzufügen)" #: common/constants/messages.py:54 msgid "Control sessions types are not passed" msgstr "Typ der Sitzungssteuerung wurde nicht übergeben" #: common/constants/messages.py:55 msgid "Control sessions types list is not correct" msgstr "Liste der Sitzungssteuerung-Typen ist nicht korrekt" #: common/constants/messages.py:56 msgid "Control sessions types list is not correct and cannot be set" msgstr "" "Liste der Sitzungssteuerung-Typen ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:57 msgid "Excluded session types are not passed" msgstr "Ausgeschlossene Sitzungs-Typen wurden nicht übergeben" #: common/constants/messages.py:58 msgid "Excluded session types list is not correct" msgstr "Liste der ausgeschlossenen Sitzungstypen ist nicht korrekt" #: common/constants/messages.py:59 msgid "Excluded session types list is not correct and cannot be set" msgstr "" "Liste der ausgeschlossenen Sitzungstypen ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:60 msgid "Excluded user list is not passed" msgstr "Liste der ausgeschlossenen Benutzer wurde nicht übergeben" #: common/constants/messages.py:61 msgid "Excluded user list is not correct" msgstr "Liste der ausgeschlossenen Benutzer ist nicht korrekt" #: common/constants/messages.py:62 msgid "Excluded user list is not correct and cannot be set" msgstr "" "Liste der ausgeschlossenen Benutzer wurde nicht übergeben und kann nicht " "verarbeitet werden" #: common/constants/messages.py:63 msgid "Final warning time is not passed" msgstr "Zeitpunkt der letzten Warnung wurde nicht übergeben" #: common/constants/messages.py:64 #, python-format msgid "Final warning time \"%%s\" is not correct" msgstr "Zeitpunkt der letzten Warnung \"%%s\" ist nicht korrekt" #: common/constants/messages.py:65 #, python-format msgid "Final warning time \"%%s\" is not correct and cannot be set" msgstr "" "Zeitpunkt der letzten Warnung \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:66 #, fuzzy #| msgid "Final warning time is not passed" msgid "Final notification time is not passed" msgstr "Zeitpunkt der letzten Warnung wurde nicht übergeben" #: common/constants/messages.py:67 #, fuzzy, python-format #| msgid "Final warning time \"%%s\" is not correct" msgid "Final notification time \"%%s\" is not correct" msgstr "Zeitpunkt der letzten Warnung \"%%s\" ist nicht korrekt" #: common/constants/messages.py:68 #, fuzzy, python-format #| msgid "Final warning time \"%%s\" is not correct and cannot be set" msgid "Final notification time \"%%s\" is not correct and cannot be set" msgstr "" "Zeitpunkt der letzten Warnung \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:69 msgid "Termination time is not passed" msgstr "End-Zeitpunkt wurde nicht übergeben" #: common/constants/messages.py:70 #, python-format msgid "Termination time \"%%s\" is not correct" msgstr "End-Zeitpunkt \"%%s\" ist nicht korrekt" #: common/constants/messages.py:71 #, python-format msgid "Termination time \"%%s\" is not correct and cannot be set" msgstr "" "End-Zeitpunkt \"%%s\" ist nicht korrekt und kann nicht verarbeitet werden" #: common/constants/messages.py:72 msgid "Track inactive is not passed" msgstr "Beachtung von Inaktivität wurde nicht übergeben" #: common/constants/messages.py:73 #, python-format msgid "Track inactive \"%%s\" is not correct" msgstr "Beachtung von Inaktivität \"%%s\" ist nicht korrekt" #: common/constants/messages.py:74 #, python-format msgid "Track inactive \"%%s\" is not correct and cannot be set" msgstr "" "Beachtung von Inaktivität \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:75 msgid "Log level is not passed" msgstr "Log level wurde nicht übergeben" #: common/constants/messages.py:76 #, python-format msgid "Log level \"%%s\" is not correct" msgstr "Log level \"%%s\" ist nicht korrekt" #: common/constants/messages.py:77 #, python-format msgid "Log level \"%%s\" is not correct and cannot be set" msgstr "Log level \"%%s\" ist nicht korrekt und kann nicht verarbeitet werden" #: common/constants/messages.py:78 msgid "Poll time is not passed" msgstr "Abfrage-Zeit wurde nicht übergeben" #: common/constants/messages.py:79 #, python-format msgid "Poll time \"%%s\" is not correct" msgstr "Abfrage-Zeit \"%%s\" ist nicht korrekt" #: common/constants/messages.py:80 #, python-format msgid "Poll time \"%%s\" is not correct and cannot be set" msgstr "" "Abfrage-Zeit \"%%s\" ist nicht korrekt und kann nicht verarbeitet werden" #: common/constants/messages.py:81 msgid "Save time is not passed" msgstr "Speicherzeitpunkt wurde nicht übergeben" #: common/constants/messages.py:82 #, python-format msgid "Save time \"%%s\" is not correct" msgstr "Speicherzeitpunkt \"%%s\" ist nicht korrekt" #: common/constants/messages.py:83 #, python-format msgid "Save time \"%%s\" is not correct and cannot be set" msgstr "" "Speicherzeitpunkt \"%%s\" ist nicht korrekt und kann nicht verarbeitet werden" #: common/constants/messages.py:84 #, fuzzy #| msgid "Poll time is not passed" msgid "PlayTime flag is not passed" msgstr "Abfrage-Zeit wurde nicht übergeben" #: common/constants/messages.py:85 #, fuzzy, python-format #| msgid "Poll time \"%%s\" is not correct" msgid "PlayTime flag \"%%s\" is not correct" msgstr "Abfrage-Zeit \"%%s\" ist nicht korrekt" #: common/constants/messages.py:86 #, fuzzy, python-format #| msgid "Poll time \"%%s\" is not correct and cannot be set" msgid "PlayTime flag \"%%s\" is not correct and cannot be set" msgstr "" "Abfrage-Zeit \"%%s\" ist nicht korrekt und kann nicht verarbeitet werden" #: common/constants/messages.py:87 msgid "PlayTime enhanced activity monitor flag is not passed" msgstr "" #: common/constants/messages.py:88 #, fuzzy, python-format #| msgid "Track inactive \"%%s\" is not correct" msgid "PlayTime enhanced activity monitor flag \"%%s\" is not correct" msgstr "Beachtung von Inaktivität \"%%s\" ist nicht korrekt" #: common/constants/messages.py:89 #, fuzzy, python-format #| msgid "Track inactive \"%%s\" is not correct and cannot be set" msgid "" "PlayTime enhanced activity monitor flag \"%%s\" is not correct and cannot be " "set" msgstr "" "Beachtung von Inaktivität \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:92 #, python-format msgid "User's \"%%s\" day number must be present" msgstr "Anzahl der Tage für Benutzer \"%%s\" muss vorhanden sein" #: common/constants/messages.py:93 #, python-format msgid "User's \"%%s\" day number must be between 1 and 7" msgstr "Anzahl der Tage für Benutzer \"%%s\" kann nur 1 bis 7 sein" #: common/constants/messages.py:94 #, python-format msgid "User's \"%%s\" allowed hours are not correct and cannot be set" msgstr "" "Erlaubte Stunden für Benutzer \"%%s\" sind nicht korrekt und können nicht " "verarbeitet werden" #: common/constants/messages.py:95 #, python-format msgid "User's \"%%s\" day list is not passed" msgstr "Liste der Tage für Benutzer \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:96 #, python-format msgid "User's \"%%s\" day list is not correct" msgstr "Liste der Tage für Benutzer \"%%s\" ist nicht korrekt" #: common/constants/messages.py:97 #, python-format msgid "User's \"%%s\" day list is not correct and cannot be set" msgstr "" "Liste der Tage für Benutzer \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:98 #, python-format msgid "User's \"%%s\" day limits list is not passed" msgstr "Liste der Tages-Limits für Benutzer \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:99 #, python-format msgid "User's \"%%s\" day limits list is not correct" msgstr "Liste der Tages-Limits für Benutzer \"%%s\" ist nicht korrekt" #: common/constants/messages.py:100 #, python-format msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgstr "" "Liste der Tages-Limits für Benutzer \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:101 #, fuzzy, python-format #| msgid "User's \"%%s\" set time operation can be one of these: -+=" msgid "User's \"%%s\" time operation can be one of these: - + =" msgstr "Das Zusammensetzen der Zeit für Benutzer \"%%s\" geht nur mit: -+=" #: common/constants/messages.py:102 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct" msgid "User's \"%%s\" time limit is not correct" msgstr "Das Zeit-Limit für Benutzer \"%%s\" ist nicht korrekt" #: common/constants/messages.py:103 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct and cannot be set" msgid "User's \"%%s\" time limit is not correct and cannot be set" msgstr "" "Das Zeit-Limit für Benutzer \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:104 #, python-format msgid "User's \"%%s\" monthly allowance is not passed" msgstr "Monatliches Zeitlimit für Benutzer \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:105 #, python-format msgid "User's \"%%s\" monthly allowance is not correct" msgstr "Monatliches Zeitlimit für Benutzer \"%%s\" ist nicht korrekt" #: common/constants/messages.py:106 #, python-format msgid "User's \"%%s\" monthly allowance is not correct and cannot be set" msgstr "" "Monatliches Zeitlimit für Benutzer \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:107 #, python-format msgid "User's \"%%s\" track inactive flag is not passed" msgstr "Der Schalter für Inaktivitäts-Beachtung \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:108 #, python-format msgid "User's \"%%s\" track inactive flag is not correct" msgstr "Der Schalter für Inaktivitäts-Beachtung \"%%s\" ist nicht korrekt" #: common/constants/messages.py:109 #, python-format msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgstr "" "Der Schalter für Inaktivitäts-Beachtung \"%%s\" ist nicht korrekt und kann " "nicht verarbeitet werden" #: common/constants/messages.py:110 #, python-format msgid "User's \"%%s\" hide tray icon flag is not passed" msgstr "Das Flag \"%%s\" des Benutzers wird nicht übergeben" #: common/constants/messages.py:111 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct" msgstr "" "Das Flag \"%%s\" des Benutzers zum Ausblenden des Tray-Symbols ist nicht " "korrekt" #: common/constants/messages.py:112 #, fuzzy, python-format msgid "User's \"%%s\" hide tray icon flag is not correct and cannot be set" msgstr "" "Das Flag \"%%s\" des Benutzers zum Ausblenden des Taskleistensymbols ist " "nicht korrekt und kann nicht festgelegt werden" #: common/constants/messages.py:113 #, fuzzy, python-format msgid "User's \"%%s\" restriction / lockout type is not passed" msgstr "" "Der Restriktions- / Sperrtyp \"%%s\" des Benutzers wird nicht übergeben" #: common/constants/messages.py:114 #, fuzzy, python-format msgid "User's \"%%s\" restriction / lockout type is not correct" msgstr "Der Restriktions- / Sperrtyp \"%%s\" des Benutzers ist nicht korrekt" #: common/constants/messages.py:115 #, fuzzy, python-format msgid "" "User's \"%%s\" restriction / lockout type is not correct and cannot be set" msgstr "" "Der Restriktions- / Sperrtyp \"%%s\" des Benutzers ist nicht korrekt und " "kann nicht festgelegt werden" #: common/constants/messages.py:116 #, python-format msgid "User's \"%%s\" weekly allowance is not passed" msgstr "Wöchentliches Zeitlimit für Benutzer \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:117 #, python-format msgid "User's \"%%s\" weekly allowance is not correct" msgstr "Wöchentliches Zeitlimit für Benutzer \"%%s\" ist nicht korrekt" #: common/constants/messages.py:118 #, python-format msgid "User's \"%%s\" weekly allowance is not correct and cannot be set" msgstr "" "Wöchentliches Zeitlimit für Benutzer \"%%s\" ist nicht korrekt und kann " "nicht verarbeitet werden" #: common/constants/messages.py:119 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not passed" msgid "User's \"%%s\" PlayTime enable flag is not passed" msgstr "Der Schalter für Inaktivitäts-Beachtung \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:120 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct" msgid "User's \"%%s\" PlayTime enable flag is not correct" msgstr "Der Schalter für Inaktivitäts-Beachtung \"%%s\" ist nicht korrekt" #: common/constants/messages.py:121 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgid "User's \"%%s\" PlayTime enable flag is not correct and cannot be set" msgstr "" "Der Schalter für Inaktivitäts-Beachtung \"%%s\" ist nicht korrekt und kann " "nicht verarbeitet werden" #: common/constants/messages.py:122 #, fuzzy, python-format #| msgid "User's \"%%s\" hide tray icon flag is not passed" msgid "User's \"%%s\" PlayTime override flag is not passed" msgstr "Das Flag \"%%s\" des Benutzers wird nicht übergeben" #: common/constants/messages.py:123 #, fuzzy, python-format #| msgid "User's \"%%s\" hide tray icon flag is not correct" msgid "User's \"%%s\" PlayTime override flag is not correct" msgstr "" "Das Flag \"%%s\" des Benutzers zum Ausblenden des Tray-Symbols ist nicht " "korrekt" #: common/constants/messages.py:124 #, fuzzy, python-format msgid "User's \"%%s\" PlayTime override flag is not correct and cannot be set" msgstr "" "Das Flag \"%%s\" des Benutzers zum Ausblenden des Taskleistensymbols ist " "nicht korrekt und kann nicht festgelegt werden" #: common/constants/messages.py:125 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not passed" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "passed" msgstr "Der Schalter für Inaktivitäts-Beachtung \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:126 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct" msgstr "Der Schalter für Inaktivitäts-Beachtung \"%%s\" ist nicht korrekt" #: common/constants/messages.py:127 #, fuzzy, python-format #| msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct and cannot be set" msgstr "" "Der Schalter für Inaktivitäts-Beachtung \"%%s\" ist nicht korrekt und kann " "nicht verarbeitet werden" #: common/constants/messages.py:128 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not passed" msgid "User's \"%%s\" PlayTime day list is not passed" msgstr "Liste der Tage für Benutzer \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:129 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not correct" msgid "User's \"%%s\" PlayTime day list is not correct" msgstr "Liste der Tage für Benutzer \"%%s\" ist nicht korrekt" #: common/constants/messages.py:130 #, fuzzy, python-format #| msgid "User's \"%%s\" day list is not correct and cannot be set" msgid "User's \"%%s\" PlayTime day list is not correct and cannot be set" msgstr "" "Liste der Tage für Benutzer \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:131 common/constants/messages.py:134 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not passed" msgid "User's \"%%s\" PlayTime day limits list is not passed" msgstr "Liste der Tages-Limits für Benutzer \"%%s\" wurde nicht übergeben" #: common/constants/messages.py:132 common/constants/messages.py:135 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not correct" msgid "User's \"%%s\" PlayTime day limits list is not correct" msgstr "Liste der Tages-Limits für Benutzer \"%%s\" ist nicht korrekt" #: common/constants/messages.py:133 common/constants/messages.py:136 #, fuzzy, python-format #| msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgid "" "User's \"%%s\" PlayTime day limits list is not correct and cannot be set" msgstr "" "Liste der Tages-Limits für Benutzer \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #: common/constants/messages.py:137 #, fuzzy, python-format #| msgid "User's \"%%s\" set time operation can be one of these: -+=" msgid "User's \"%%s\" PlayTime operation can be one of these: - + =" msgstr "Das Zusammensetzen der Zeit für Benutzer \"%%s\" geht nur mit: -+=" #: common/constants/messages.py:138 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct" msgid "User's \"%%s\" set PlayTime limit is not correct" msgstr "Das Zeit-Limit für Benutzer \"%%s\" ist nicht korrekt" #: common/constants/messages.py:139 #, fuzzy, python-format #| msgid "User's \"%%s\" set time limit is not correct and cannot be set" msgid "User's \"%%s\" PlayTime time limit is not correct and cannot be set" msgstr "" "Das Zeit-Limit für Benutzer \"%%s\" ist nicht korrekt und kann nicht " "verarbeitet werden" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:143 msgid "" "Unexpected ERROR while loading configuration. Please inspect Timekpr-nExT " "log files" msgstr "" "Unerwarteter Fehler beim Laden der Konfiguration. Bitte schauen Sie in die " "Timekpr-nExT log-Dateien" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:145 #, fuzzy #| msgid "" #| "Unexpected ERROR getting confguration. Please inspect Timekpr-nExT log " #| "files" msgid "" "Unexpected ERROR getting configuration. Please inspect Timekpr-nExT log files" msgstr "" "Unerwarteter Fehler beim Holen der Konfiguration. Bitte schauen Sie in die " "Timekpr-nExT log-Dateien" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:147 #, fuzzy #| msgid "" #| "Unexpected ERROR getting user confguration. Please inspect Timekpr-nExT " #| "log files" msgid "" "Unexpected ERROR getting user configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "Unerwarteter Fehler beim Holen der Benutzer-Konfiguration. Bitte schauen Sie " "in die Timekpr-nExT log-Dateien" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:149 msgid "" "Unexpected ERROR getting user list. Please inspect Timekpr-nExT log files" msgstr "" "Unerwarteter Fehler beim Holen der Benutzer-Liste. Bitte schauen Sie in die " "Timekpr-nExT log-Dateien" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:151 #, fuzzy #| msgid "" #| "Unexpected ERROR updating confguration. Please inspect Timekpr-nExT log " #| "files" msgid "" "Unexpected ERROR updating configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "Unerwarteter Fehler beim Aktualisieren der Konfiguration. Bitte schauen Sie " "in die Timekpr-nExT log-Dateien" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:153 msgid "" "Unexpected ERROR updating control. Please inspect Timekpr-nExT log files" msgstr "" "Unerwarteter Fehler beim Aktualisieren der Steuerung. Bitte schauen Sie in " "die Timekpr-nExT log-Dateien" #: common/constants/messages.py:154 #, python-format msgid "User \"%%s\" configuration is not found" msgstr "Konfiguration für Benutzer \"%%s\" nicht gefunden" #: common/constants/messages.py:155 #, python-format msgid "User \"%%s\" control file is not found" msgstr "Steuerungs-Datei für Benutzer \"%%s\" nicht gefunden" #: common/constants/messages.py:156 #, python-format msgid "User \"%%s\" is not found" msgstr "Benutzer \"%%s\" nicht gefunden" #: common/constants/messages.py:159 msgid "Connected" msgstr "Verbunden" #: common/constants/messages.py:160 msgid "Connecting..." msgstr "Verbinden..." #: common/constants/messages.py:161 msgid "Failed to connect" msgstr "Verbindung fehlgeschlagen" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:163 msgid "" "Please reopen the application if you are superuser and Timekpr-nExT is " "running" msgstr "" "Bitte öffnen Sie die Anwendung erneut wenn Sie Superuser sind und Timekpr-" "nExT bereits läuft" #: common/constants/messages.py:164 msgid "Started" msgstr "Gestartet" #: common/constants/messages.py:165 msgid "User configuration retrieved" msgstr "Benutzer-Konfiguration wurde geladen" #: common/constants/messages.py:166 msgid "Configuration retrieved" msgstr "Konfiguration erhalten" #: common/constants/messages.py:167 msgid "Track inactive for user has been processed" msgstr "Inaktivitäts-Verfolgung für den Benutzer wurde verarbeitet" #: common/constants/messages.py:168 msgid "Hide tray icon for user has been processed" msgstr "Das Symbol zum Ausblenden des Fachs für den Benutzer wurde verarbeitet" #: common/constants/messages.py:169 #, fuzzy msgid "Restriction / lockout type for user has been processed" msgstr "Der Einschränkungstyp / Sperrtyp für den Benutzer wurde verarbeitet" #: common/constants/messages.py:170 msgid "Additional time for user has been processed" msgstr "Zusatz-Zeit für den Benutzer wurde verarbeitet" #: common/constants/messages.py:171 #, fuzzy #| msgid "Additional time for user has been processed" msgid "Additional PlayTime for user has been processed" msgstr "Zusatz-Zeit für den Benutzer wurde verarbeitet" #: common/constants/messages.py:172 msgid "Weekly and monthly limits for user have been processed" msgstr "Wochen- und Monats-Zeitlimits für den Benutzer wurden verarbeitet" #: common/constants/messages.py:173 msgid "Allowed days for user have been processed" msgstr "Erlaubte Tage für den Benutzer wurden verarbeitet" #: common/constants/messages.py:174 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "Day time limits for user have been processed" msgstr "Tageweise Zeitlimits für den Benutzer wurden verarbeitet" #: common/constants/messages.py:175 msgid "Allowed hours for user have been processed" msgstr "Erlaubte Stunden für den Benutzer wurden verarbeitet" #: common/constants/messages.py:176 msgid "Timekpr-nExT configuration has been saved" msgstr "Timekpr-nExT-Konfiguration wurde gespeichert" #: common/constants/messages.py:177 #, fuzzy #| msgid "==> set time limit per week, example" msgid "User time limits have been saved" msgstr "==> Zeitlimit pro Woche festlegen, Beispiel" #: common/constants/messages.py:178 #, fuzzy #| msgid "Time limit for the week is enabled" msgid "User PlayTime limits have been saved" msgstr "Wöchentliches Zeit-Limit ist eingeschaltet" #: common/constants/messages.py:179 #, fuzzy #| msgid "Additional time for user has been processed" msgid "User additional options have been saved" msgstr "Zusatz-Zeit für den Benutzer wurde verarbeitet" #: common/constants/messages.py:180 #, fuzzy #| msgid "Additional time for user has been processed" msgid "Enable PlayTime for the user has been processed" msgstr "Zusatz-Zeit für den Benutzer wurde verarbeitet" #: common/constants/messages.py:181 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime override flag for the user has been processed" msgstr "Tageweise Zeitlimits für den Benutzer wurden verarbeitet" #: common/constants/messages.py:182 #, fuzzy #| msgid "Track inactive for user has been processed" msgid "" "PlayTime allowed during unaccounted intervals flag for the user has been " "processed" msgstr "Inaktivitäts-Verfolgung für den Benutzer wurde verarbeitet" #: common/constants/messages.py:183 #, fuzzy #| msgid "Allowed days for user have been processed" msgid "PlayTime allowed days for user have been processed" msgstr "Erlaubte Tage für den Benutzer wurden verarbeitet" #: common/constants/messages.py:184 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime day limits for user have been processed" msgstr "Tageweise Zeitlimits für den Benutzer wurden verarbeitet" #: common/constants/messages.py:185 #, fuzzy #| msgid "Time limits for days for user have been processed" msgid "PlayTime activities for user have been processed" msgstr "Tageweise Zeitlimits für den Benutzer wurden verarbeitet" #: common/constants/messages.py:186 msgid "Please select a day to set the limits" msgstr "Bitte wählen Sie einen Tag für die Begrenzung" #: common/constants/messages.py:187 msgid "That interval overlaps with an existing one" msgstr "Intervall überschneidet sich mit bereits vorhandenem Intervall" #: common/constants/messages.py:188 msgid "That interval's start conflicts with an existing one" msgstr "Intervall-Beginn kollidiert mit bereits vorhandenem Intervall-Beginn" #: common/constants/messages.py:189 msgid "That interval's end conflicts with an existing one" msgstr "Intervall-Ende kollidiert mit bereits vorhandenem Intervall-Ende" #: common/constants/messages.py:190 msgid "That interval's start or end duplicates an existing one" msgstr "Intervall-Beginn oder -Ende duploziert bereits vorhandenen Intervall" #: common/constants/messages.py:191 msgid "Interval start cannot be the same as end" msgstr "Intervall-Beginn muss ungleich Intervall-Ende sein" #: common/constants/messages.py:192 #, fuzzy #| msgid "Interval start cannot be the same as end" msgid "Interval's start cannot be later than end" msgstr "Intervall-Beginn muss ungleich Intervall-Ende sein" #: common/constants/messages.py:193 msgid "Please select an hour interval to remove" msgstr "Bitte wählen Sie einen Stunden-Intervall zum Entfernen" #: common/constants/messages.py:194 msgid "Interval removed" msgstr "Intervall entfernt" #: common/constants/messages.py:195 msgid "Timekpr-nExT interface is not yet ready" msgstr "Timekpr-nExT-Schnittstelle ist noch nicht bereit" #: common/constants/messages.py:198 msgid "" "WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, " "but no displays are available, thus running in CLI..." msgstr "" "Warnhinweis: Timekpr-nExT-Administrationstool soll im GUI-Modus gestartet " "werden, es sind aber keine grafischen Fenster möglich. Daher wird der " "Kommandozeilen-Modus gestartet." #: common/constants/messages.py:199 msgid "The command is incorrect:" msgstr "Der folgende Befehl ist nicht korrekt:" #: common/constants/messages.py:200 msgid "The usage of Timekpr-nExT admin client is as follows:" msgstr "Benutzung von Timekpr-nExT Admin-Client ist wie folgt:" #: common/constants/messages.py:201 msgid "---=== NOTICE ===---" msgstr "---=== BEACHTEN ===---" #: common/constants/messages.py:202 msgid "numeric time values are in seconds" msgstr "Die numerischen Zeitwerte sind in Sekunden angegeben" #: common/constants/messages.py:203 msgid "" "weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, " "format: 1-7)" msgstr "" "Wochentage sind gemäß ISO 8601 nummeriert (d. h. Montag ist der erste Tag, " "Format: 1-7)" #: common/constants/messages.py:204 msgid "hours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)" msgstr "" "Die Stunden sind gemäß ISO 8601 nummeriert (d. h. 24-Stunden-Uhr, Format: " "0-23)." #: common/constants/messages.py:206 #, python-format msgid "%(n)s user in total:" msgid_plural "%(n)s users in total:" msgstr[0] "Insgesamt %(n)s Benutzer:" msgstr[1] "Insgesamt %(n)s Benutzer:" #: common/constants/messages.py:207 #, fuzzy, python-format #| msgid "Config for %s:" msgid "Configuration for user %s:" msgstr "Konfiguration für %s:" #: common/constants/messages.py:210 msgid "Time left..." msgstr "Verbleibende Zeit..." #: common/constants/messages.py:211 msgid "Limits & Configuration" msgstr "Limits & Konfiguration" #: common/constants/messages.py:212 msgid "About" msgstr "Über" #: common/constants/messages.py:215 resource/client/forms/about.glade:17 msgid "Keep control of computer usage" msgstr "Computer-Nutzung im Griff behalten" #: common/constants/messages.py:216 msgid "Day" msgstr "Tag" #: common/constants/messages.py:217 msgid "Enabled" msgstr "Aktiviert" #: common/constants/messages.py:218 common/constants/messages.py:224 msgid "Limit" msgstr "Begrenzung" #: common/constants/messages.py:219 msgid "From" msgstr "Von" #: common/constants/messages.py:220 #, fuzzy #| msgid "from" msgid "from..." msgstr "von" #: common/constants/messages.py:221 msgid "To" msgstr "Zu" #: common/constants/messages.py:222 msgid "to..." msgstr "" #: common/constants/messages.py:223 msgid "Period" msgstr "" #: common/constants/messages.py:225 msgid "Weekly" msgstr "" #: common/constants/messages.py:226 msgid "Monthly" msgstr "" #: common/constants/messages.py:227 common/constants/messages.py:229 msgid "Session type" msgstr "Sitzungs-Typ" #: common/constants/messages.py:228 common/constants/messages.py:230 #, fuzzy #| msgid "Session type" msgid "session type..." msgstr "Sitzungs-Typ" #: common/constants/messages.py:231 msgid "Username" msgstr "Benutzername" #: common/constants/messages.py:232 #, fuzzy #| msgid "Username" msgid "username..." msgstr "Benutzername" #: common/constants/messages.py:233 msgid "Process mask" msgstr "" #: common/constants/messages.py:234 msgid "executable mask..." msgstr "" #: common/constants/messages.py:235 msgid "Process description" msgstr "" #: common/constants/messages.py:236 msgid "process description..." msgstr "" #: common/constants/messages.py:237 msgid "Time" msgstr "" #: common/constants/messages.py:238 msgid "time..." msgstr "" #: common/constants/messages.py:239 msgid "Importance" msgstr "" #: common/constants/messages.py:240 msgid "importance..." msgstr "" #: common/constants/messages.py:243 msgid "Timekpr-nExT notification" msgstr "Timekpr-nExT Hinweis" #: common/constants/messages.py:244 #, fuzzy #| msgid "Timekpr-nExT notification" msgid "Timekpr-nExT PlayTime notification" msgstr "Timekpr-nExT Hinweis" #: common/constants/messages.py:245 msgid "Your time is not limited today" msgstr "Heute gibt es keine Zeitbeschränkung" #: common/constants/messages.py:246 msgid "Time allowance has changed, please note new time left!" msgstr "Erlaubte Zeit wurde geändert, bitte neue Zeit beachten!" #: common/constants/messages.py:247 msgid "Time limit configuration has changed, please note new configuration!" msgstr "" "Konfiguration der Zeitbeschränkung wurde geändert, bitte neue " "Zeitbeschränkungen beachten!" #: common/constants/messages.py:248 #, python-format msgid "There is a problem connecting to Timekpr-nExT daemon (%%s)!" msgstr "Es gibt ein Problem beim Verbinden zum Timekpr-nExT Service (%%s)!" #: common/constants/messages.py:249 #, python-format msgid "There is a problem communicating to Timekpr-nExT (%%s)!" msgstr "Es gibt ein Problem mit der Kommunikation zu Timekpr-nExT (%%s)!" #: common/constants/messages.py:250 #, fuzzy, python-format #| msgid "Icon inititalization error (%%s)!" msgid "Icon initialization error (%%s)!" msgstr "Fehler beim Initialisieren der Icons (%%s)!" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:252 msgid "Your time is up, you will be forcibly logged out in" msgstr "Die erlaubte Nutzungszeit ist vorbei, das Ausloggen erfolgt in" #. TRANSLATORS: this is a part of message "Your time is up, your computer will be forcibly shutdown in %s seconds", please translate accordingly #: common/constants/messages.py:254 #, fuzzy msgid "Your time is up, your computer will be forcibly shutdown in" msgstr "" "Ihre Zeit ist abgelaufen, Ihr Computer wird zwangsweise heruntergefahren" #. TRANSLATORS: this is a part of message "Your time is up, your session will be forcibly locked in %s seconds", please translate accordingly #: common/constants/messages.py:256 #, fuzzy msgid "Your time is up, your session will be forcibly locked in" msgstr "Ihre Zeit ist abgelaufen, Ihre Sitzung wird zwangsweise gesperrt" #. TRANSLATORS: this is a part of message ", Your computer will be forcibly suspended in %s seconds", please translate accordingly #: common/constants/messages.py:258 #, fuzzy msgid "Your time is up, your computer will be forcibly suspended in" msgstr "Ihre Zeit ist abgelaufen, Ihr Computer wird gewaltsam gesperrt" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:260 #, python-format msgid "%(n)s second" msgid_plural "%(n)s seconds" msgstr[0] "%(n)s Sekunde" msgstr[1] "%(n)s Sekunden" #: common/constants/messages.py:261 msgid "Internal connection error, please check log files" msgstr "Interner Verbindungsfehler. Bitte schauen Sie in die log-Dateien" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:263 #, python-format msgid "You have %(n)s hour" msgid_plural "You have %(n)s hours" msgstr[0] "Es bleibt noch %(n)s Stunde" msgstr[1] "Es bleiben noch %(n)s Stunden" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:265 #, python-format msgid "%(n)s minute" msgid_plural "%(n)s minutes" msgstr[0] "%(n)s Minute" msgstr[1] "%(n)s Minuten" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) of PlayTime left" please translate accordingly #: common/constants/messages.py:267 common/constants/messages.py:269 #, python-format msgid "%(n)s second left" msgid_plural "%(n)s seconds left" msgstr[0] "noch %(n)s Sekunde" msgstr[1] "noch %(n)s Sekunden" #: common/constants/messages.py:269 #, fuzzy, python-format #| msgid "%(n)s second left" #| msgid_plural "%(n)s seconds left" msgid "%(n)s second of PlayTime left" msgid_plural "%(n)s seconds of PlayTime left" msgstr[0] "noch %(n)s Sekunde" msgstr[1] "noch %(n)s Sekunden" #: common/constants/messages.py:270 #, python-format msgid "" "Feature \"%%s\", which is used to detect idle time, cannot be enabled!\n" "Idle / inactive time might not be accounted when screen is locked!" msgstr "" "Die Funktion \"%%s\", mit der die Leerlaufzeit erkannt wird, kann nicht " "aktiviert werden!\n" "Leerlauf- / Inaktivitätszeit wird möglicherweise nicht berücksichtigt, wenn " "der Bildschirm gesperrt ist!" #: common/constants/messages.py:273 #, python-format msgid "UNEXPECTED ERROR: %%s" msgstr "Unerwarteter Fehler: %%s" #: common/constants/messages.py:274 #, python-format msgid "PARAMETER PARSE ERROR (please check parameter validity): %%s" msgstr "" "PARAMETERANALYSEFEHLER (bitte überprüfen Sie die Gültigkeit der Parameter): " "%%s" #: common/constants/messages.py:275 msgid "Command FAILED: access denied" msgstr "Kommando fehlgeschlagen: Zugriff verweigert" #: common/constants/messages.py:276 msgid "Command FAILED: communication was not accepted" msgstr "Kommando fehlgeschlagen: Kommunikation wurde nicht angenommen" #: common/constants/messages.py:277 msgid "n/a" msgstr "nicht verfügbar" #: resource/client/forms/about.glade:7 msgid "About Timekpr-nExT" msgstr "Über Timekpr-nExT" #: resource/client/forms/about.glade:16 msgid "Copyright (c) 2018-2021 Eduards Bezverhijs" msgstr "" #: resource/client/forms/about.glade:19 msgid "Timekpr-nExT" msgstr "Timekpr-nExT" # Copied from https://www.gnu.org/licenses/gpl-howto.de.html #. Please enter GPL3 licence text in your language #: resource/client/forms/about.glade:20 msgctxt "timekpr-next" msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details.\n" "\n" "You should have received a copy of the GNU General Public License along with " "this program. If not, see . In Debian, see " "file /usr/share/common-licenses/GPL-3" msgstr "" "Dieses Programm ist Freie Software: Sie können es unter den Bedingungen\n" "der GNU General Public License, wie von der Free Software Foundation,\n" "Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren\n" "veröffentlichten Version, weiter verteilen und/oder modifizieren.\n" "\n" "Dieses Programm wird in der Hoffnung bereitgestellt, dass es nützlich sein " "wird, jedoch\n" "OHNE JEDE GEWÄHR,; sogar ohne die implizite\n" "Gewähr der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.\n" "Siehe die GNU General Public License für weitere Einzelheiten.\n" "\n" "Sie sollten eine Kopie der GNU General Public License zusammen mit diesem\n" "Programm erhalten haben. Wenn nicht, siehe " #. Please fill in translator credits, each person in new line in format: name.surname@mail.xy, name@mail.xy, nick@mail.xy or so... #: resource/client/forms/about.glade:26 msgid "" "Eduards Bezverhijs \n" "(Translations fine-tuning by JP Lord )\n" "(English fine-tuning by Phil Hudson )" msgstr "ulle@o2online.de" #: resource/client/forms/admin.glade:155 msgid "Remove excluded session type" msgstr "Ausgeschlossene Sitzungs-Typen entfernen" #: resource/client/forms/admin.glade:385 msgid "Timekpr-nExT administration" msgstr "Timekpr-nExT Administration" #: resource/client/forms/admin.glade:403 resource/client/forms/admin.glade:409 #: resource/client/forms/client.glade:261 msgid "Icon, isn't it?" msgstr "Ist DAS nicht ein Icon?" #: resource/client/forms/admin.glade:432 msgid "Notes, read carefully ;)" msgstr "Hinweise, bitte sorgfältig lesen ;)" #: resource/client/forms/admin.glade:435 #, fuzzy #| msgid "" #| "This is the configuration app for Timekpr-nExT. It allows you to set time " #| "limits for your individual users as well as general Timekpr-nExT " #| "options.\n" #| "\n" #| "To use this application, you either have to execute it as superuser or " #| "have to be part of the timekpr group.\n" #| "Please note that the \"Timekpr-nExT Configuration\" is available in " #| "superuser (administrator) mode only!\n" #| "\n" #| "Please configure carefully: do not lock yourself out!" msgid "" "This is the configuration app for Timekpr-nExT. It allows you to set time " "limits for your individual users as well as general Timekpr-nExT options.\n" "To use this application, you either have to execute it as superuser or have " "to be part of the timekpr group.\n" "Please note that the \"Timekpr-nExT Configuration\" is available in " "superuser (administrator) mode only!\n" "\n" "Please configure carefully: do not lock yourself out!" msgstr "" "Das ist die Timekpr-nExT Konfigurations-App, damit können die Nutzungszeiten " "der Computer-Benutzer sowie auch Timekpr-nExT selbst konfiguriert werden.\n" "\n" "Bitte beachten Sie, dass \"Timekpr-nExT Konfiguration\" nur im Superuser-" "Modus (Administrator) möglich ist.\n" "Sie müssen entweder Superuser oder Mitglied der Gruppe timekpr sein, um die " "App vollständig verwenden zu können!\n" "\n" "Bitte seien Sie bei der Einrichtung sorgsam, Sie könnten sich selbst " "aussperren!" #: resource/client/forms/admin.glade:465 resource/client/forms/admin.glade:3016 msgid "Users related configuration" msgstr "Benutzer-bezogene Konfiguration" #: resource/client/forms/admin.glade:476 resource/client/forms/client.glade:298 msgid "Username:" msgstr "Benutzer auswählen:" #: resource/client/forms/admin.glade:504 resource/client/forms/admin.glade:516 msgid "List of usernames registered on the system" msgstr "Liste der im System registrierten Benutzer" #: resource/client/forms/admin.glade:530 msgid "Restore" msgstr "Wiederherstellen" #: resource/client/forms/admin.glade:535 msgid "Restore configuration from saved state" msgstr "Wiederherstellen einer gespeicherten Konfiguration" #: resource/client/forms/admin.glade:586 #, fuzzy #| msgid "This shows information about time left / spent" msgid "Information about time left / spent" msgstr "" "Hier werden Informationen zur verbleibenden / verbrachten Zeit angezeigt" #: resource/client/forms/admin.glade:610 #, fuzzy msgid "" "Continuous time left. May span more than the current day (realtime, " "available when user is logged in)" msgstr "" "Dem Benutzer verbleibende Zeit, die mehr als einen aktuellen Tag umfassen " "kann (Echtzeit, verfügbar, wenn der Benutzer angemeldet ist)" #: resource/client/forms/admin.glade:612 msgid "Time left (actual):" msgstr "Verbleibende Zeit (aktuell):" #: resource/client/forms/admin.glade:626 resource/client/forms/admin.glade:657 #: resource/client/forms/admin.glade:688 resource/client/forms/admin.glade:732 #: resource/client/forms/admin.glade:763 resource/client/forms/admin.glade:794 #: resource/client/forms/client.glade:411 #: resource/client/forms/client.glade:425 #: resource/client/forms/client.glade:456 #: resource/client/forms/client.glade:502 #: resource/client/forms/client.glade:728 #: resource/client/forms/client.glade:786 #: resource/client/forms/client.glade:857 #: resource/client/forms/client.glade:885 #: resource/client/forms/client.glade:985 #: resource/client/forms/client.glade:1011 msgid "Format: " msgstr "Format: " #: resource/client/forms/admin.glade:641 #, fuzzy msgid "" "How long the user was inactive since last login (realtime, available when " "user is logged in)" msgstr "" "Wie lange war der Benutzer seit der letzten Anmeldung inaktiv (Echtzeit, " "verfügbar, wenn der Benutzer angemeldet ist)" #: resource/client/forms/admin.glade:643 msgid "Time inactive (actual):" msgstr "Zeit inaktiv (aktuell):" #: resource/client/forms/admin.glade:672 msgid "Time available today (saved stated, not real-time)" msgstr "Heute verfügbare Zeit (gespeichert, nicht real-time)" #: resource/client/forms/admin.glade:674 msgid "Time left (today):" msgstr "Verbleibende Zeit (heute):" #: resource/client/forms/admin.glade:716 msgid "Time spent today (saved stated, not real-time)" msgstr "Nutzungszeit heute (gespeichert, nicht real-time)" #: resource/client/forms/admin.glade:718 msgid "Time spent (today):" msgstr "Nutzungszeit (heute):" #: resource/client/forms/admin.glade:747 msgid "Time spent this week (saved stated, not real-time)" msgstr "Nutzungszeit dieser Woche (gespeichert, nicht real-time)" #: resource/client/forms/admin.glade:749 resource/client/forms/client.glade:717 msgid "Time spent (week):" msgstr "Nutzungszeit (Woche):" #: resource/client/forms/admin.glade:777 msgid "Time spent this month (saved stated, not real-time)" msgstr "Nutzungszeit dieses Monats (gespeichert, nicht real-time)" #: resource/client/forms/admin.glade:779 resource/client/forms/client.glade:744 msgid "Time spent (month):" msgstr "Nutzungszeit (Monat):" #: resource/client/forms/admin.glade:861 msgid "Allowance adjustments" msgstr "" #: resource/client/forms/admin.glade:885 #, fuzzy #| msgid "Set day's time limit" msgid "today's time" msgstr "Tages-Limits festlegen" #: resource/client/forms/admin.glade:889 msgid "Choose this to adjust user's time allowance for today" msgstr "" #: resource/client/forms/admin.glade:901 msgid "PlayTime" msgstr "" #: resource/client/forms/admin.glade:905 msgid "Choose this to adjust user's PlayTime allowance for today" msgstr "" #: resource/client/forms/admin.glade:934 msgid "hr" msgstr "h" #: resource/client/forms/admin.glade:945 msgid "The number of minutes to be adjusted for today's limit" msgstr "Die Anzahl der Minuten der Anpassung des heutigen Tages-Limits" #: resource/client/forms/admin.glade:961 msgid "The number of hours to be adjusted for today's limit" msgstr "Die Anzahl der Stunden der Anpassung des heutigen Tages-Limits" #: resource/client/forms/admin.glade:977 msgid "min" msgstr "min" #: resource/client/forms/admin.glade:1004 msgid "Add specified time (reward)" msgstr "Die angegebene Anzahl hinzufügen (Belohnung)" #: resource/client/forms/admin.glade:1020 msgid "Subtract specified time (penalty)" msgstr "Die angegebene Anzahl abziehen (Strafe)" #: resource/client/forms/admin.glade:1036 #, fuzzy #| msgid "Set this specific limit" msgid "Set this specific time limit" msgstr "Exaktes Limit setzen" #: resource/client/forms/admin.glade:1101 msgid "Information about PlayTime" msgstr "" #: resource/client/forms/admin.glade:1134 #, fuzzy #| msgid "" #| "How long user was inactive since last login (realtime, available when " #| "user is logged in)" msgid "" "Actual PlayTime available today (realtime, available when user is logged in)" msgstr "" "Wie lange war der Benutzer seit der letzten Anmeldung inaktiv (Echtzeit, " "verfügbar, wenn der Benutzer angemeldet ist)" #: resource/client/forms/admin.glade:1136 #, fuzzy #| msgid "Time left (actual):" msgid "PlayTime left (actual):" msgstr "Verbleibende Zeit (aktuell):" #: resource/client/forms/admin.glade:1150 #: resource/client/forms/admin.glade:1181 #: resource/client/forms/admin.glade:1269 #, fuzzy #| msgid "Format: " msgid "Format: " msgstr "Format: " #: resource/client/forms/admin.glade:1165 #, fuzzy #| msgid "Time available today (saved stated, not real-time)" msgid "PlayTime available today (saved stated, not real-time)" msgstr "Heute verfügbare Zeit (gespeichert, nicht real-time)" #: resource/client/forms/admin.glade:1167 #, fuzzy #| msgid "Time left (today):" msgid "PlayTime left (today):" msgstr "Verbleibende Zeit (heute):" #: resource/client/forms/admin.glade:1196 #: resource/client/forms/admin.glade:1212 #, fuzzy #| msgid "" #| "How long user was inactive since last login (realtime, available when " #| "user is logged in)" msgid "" "Active PlayTime activity count (realtime, available when user is logged in)" msgstr "" "Wie lange war der Benutzer seit der letzten Anmeldung inaktiv (Echtzeit, " "verfügbar, wenn der Benutzer angemeldet ist)" #: resource/client/forms/admin.glade:1198 #, fuzzy #| msgid "Time inactive (actual):" msgid "Running activities (actual):" msgstr "Zeit inaktiv (aktuell):" #: resource/client/forms/admin.glade:1253 #, fuzzy #| msgid "Time spent today (saved stated, not real-time)" msgid "PlayTime spent today (saved stated, not real-time)" msgstr "Nutzungszeit heute (gespeichert, nicht real-time)" #: resource/client/forms/admin.glade:1255 #, fuzzy #| msgid "Time spent (today):" msgid "PlayTime spent (today):" msgstr "Nutzungszeit (heute):" #: resource/client/forms/admin.glade:1306 msgid "" "Brief information about time spent and everything related to time management " "for this day" msgstr "" "Kurze Zusammenfassung zur heute bestehenden und verwendeten Nutzungszeit" #: resource/client/forms/admin.glade:1307 msgid "Info & Today" msgstr "Info & Heute" #: resource/client/forms/admin.glade:1348 #, fuzzy msgid "This lets you configure time limits." msgstr "Auf diese Weise können Sie die Fristen für heute ändern" #: resource/client/forms/admin.glade:1350 #, fuzzy #| msgid "Weekly & Monthly limits" msgid "Week day limits" msgstr "Wöchentliche & monatliche Limits" #. This is meant for very short (e.g. one letter) abbreviation of hours #: resource/client/forms/admin.glade:1370 #: resource/client/forms/admin.glade:1865 #: resource/client/forms/admin.glade:2265 #, fuzzy #| msgid "hr" msgid "h" msgstr "h" #: resource/client/forms/admin.glade:1374 #: resource/client/forms/admin.glade:2269 #, fuzzy #| msgid "The amount of hours to be adjusted for today's limit" msgid "Choose hours to be adjusted for selected days." msgstr "Die Anzahl der Stunden der Anpassung des heutigen Tages-Limits" #. This is meant for very short (e.g. one letter) abbreviation of minutes #: resource/client/forms/admin.glade:1386 #: resource/client/forms/admin.glade:1881 #: resource/client/forms/admin.glade:2281 msgid "m" msgstr "" #: resource/client/forms/admin.glade:1390 #: resource/client/forms/admin.glade:2285 #, fuzzy #| msgid "The amount of minutes to be adjusted for today's limit" msgid "Choose minutes to be adjusted for selected days." msgstr "Die Anzahl der Minuten der Anpassung des heutigen Tages-Limits" #: resource/client/forms/admin.glade:1410 msgid "" "Increase daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:1427 msgid "" "Decrease daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:1474 #, fuzzy #| msgid "" #| "Lists day of the week and additional information about the day's limit. " #| "Please enable / disable days for the user." msgid "" "Lists day of the week and additional information about the day's limit.\n" "\n" "Please enable / disable days for the user." msgstr "Verwaltung von gesamten Nutzungstagen pro Woche für den Benutzer." #: resource/client/forms/admin.glade:1550 #, fuzzy #| msgid "" #| "Hour intervals per day available to this user.\n" #| "Please note that if the day's limit ends at 24:00 and the next day's " #| "limit starts at 00:00, then the user can work continuously past " #| "midnight.\n" #| "Please note that multiple intervals cannot be configured within the same " #| "hour. An interval can start or end or contain a specific hour, but not " #| "more than once. This is by design, not a bug." msgid "" "Hour intervals for selected day available to the user.\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead.\n" "\n" "Please note that if the day's limit ends at 24:00 and the next day's limit " "starts at 00:00, then the user can work continuously past midnight.\n" "\n" "Please note that multiple intervals cannot be configured within the same " "hour.\n" "An interval can start or end or contain a specific hour, but not more than " "once. This is by design, not a bug.\n" "\n" msgstr "" "Stunden-Intervalle pro Tag mit möglicher Nutzungszeit für den Benutzer.\n" "Hinweis: Wenn ein Tag mit der 24. Stunde endet und der nächste Tag mit 0 " "beginnt, besteht die Nutzungszeit für den Benutzer über Mitternacht " "hinaus.\n" "Hinweis: Innerhalb einer Stunde kann nur ein Intervall, nicht mehrere, " "konfiguriert werden. Start und Ende dürfen innerhalb einer Stunde liegen " "(aber eben nur einmal)" #: resource/client/forms/admin.glade:1581 msgid "Hour intervals" msgstr "Stunden-Intervalle" #: resource/client/forms/admin.glade:1603 msgid "" "Create a new time interval that will be available to the user.\n" "\n" "After creating the interval, please edit its start and end times directly in " "interval list." msgstr "" #: resource/client/forms/admin.glade:1620 msgid "Delete the selected time interval from the available list of intervals." msgstr "" #: resource/client/forms/admin.glade:1688 #, fuzzy #| msgid "Hour intervals" msgid "enter hour intervals" msgstr "Stunden-Intervalle" #: resource/client/forms/admin.glade:1742 msgid "verify" msgstr "" #: resource/client/forms/admin.glade:1746 msgid "" "Verify configured time intervals. This is a mandatory step to ensure that " "intervals are correct.\n" "\n" "Intervals which have problems will be highlighted." msgstr "" #: resource/client/forms/admin.glade:1821 #, fuzzy #| msgid "Weekly & Monthly limits" msgid "Weekly and monthly limits" msgstr "Wöchentliche & monatliche Limits" #. This is meant for very short (e.g. one letter) abbreviation of days #: resource/client/forms/admin.glade:1849 msgid "d" msgstr "" #: resource/client/forms/admin.glade:1853 msgid "Choose days to be adjusted for selected period." msgstr "" #: resource/client/forms/admin.glade:1869 #, fuzzy #| msgid "The amount of hours to be adjusted for today's limit" msgid "Choose hours to be adjusted for selected period." msgstr "Die Anzahl der Stunden der Anpassung des heutigen Tages-Limits" #: resource/client/forms/admin.glade:1885 #, fuzzy #| msgid "The amount of minutes to be adjusted for today's limit" msgid "Choose minutes to be adjusted for selected period." msgstr "Die Anzahl der Minuten der Anpassung des heutigen Tages-Limits" #: resource/client/forms/admin.glade:1913 msgid "" "Increase weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" #: resource/client/forms/admin.glade:1927 msgid "" "Decrease weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" #: resource/client/forms/admin.glade:1976 msgid "" "Weekly and monthly limits for the user.\n" "\n" "These limits are applied to user together with the rest of limit " "configuration." msgstr "" #: resource/client/forms/admin.glade:2016 msgid "Apply daily limits" msgstr "Liste der Tages-Limits übernehmen" #: resource/client/forms/admin.glade:2021 #, fuzzy #| msgid "Apply all changes made in this page" msgid "Apply limit all changes made in this page" msgstr "Alle Änderungen auf dieser Seite übernehmen" #: resource/client/forms/admin.glade:2042 msgid "Daily limit configuration for all week days" msgstr "Konfigurieren der Tages-Limits für die gesamte Woche" #: resource/client/forms/admin.glade:2043 #, fuzzy #| msgid "Limits & Configuration" msgid "Limit configuration" msgstr "Limits & Konfiguration" #: resource/client/forms/admin.glade:2064 msgid "Settings for PlayTime activities" msgstr "" #: resource/client/forms/admin.glade:2084 msgid "PlayTime options" msgstr "" #: resource/client/forms/admin.glade:2108 #: resource/client/forms/admin.glade:2147 msgid "Enable PlayTime for selected user" msgstr "" #: resource/client/forms/admin.glade:2110 msgid "Enable PlayTime:" msgstr "" #: resource/client/forms/admin.glade:2124 #: resource/client/forms/admin.glade:2161 msgid "" "Enable PlayTime override for selected user.\n" "\n" "This setting overrides time accounting in a way that time is accounted only " "when at least one of the applications on the PlayTime activity list are " "running!\n" "\n" "This affects only time accounting, intervals are still fully enforced!\n" "\n" "If no processes are running, time is accounted as idle thus effectively it's " "free time for user!" msgstr "" #: resource/client/forms/admin.glade:2132 msgid "Enable PlayTime override:" msgstr "" #: resource/client/forms/admin.glade:2180 #: resource/client/forms/admin.glade:2201 msgid "" "Allow PlayTime activities during unaccounted (\"∞\") time intervals for " "selected user.\n" "\n" "This setting allows the user to use applications configured in his PlayTime " "activity list during time intervals which are marked as unaccounted (\"∞" "\").\n" "\n" "If this setting is enabled, the use of activities will not be accounted " "towards PlayTime limits, otherwise applications in PlayTime activity list " "will be terminated as soon as they are started during unaccounted (\"∞\") " "time intervals." msgstr "" #: resource/client/forms/admin.glade:2186 msgid "Allowed during \"∞\" intervals:" msgstr "" #: resource/client/forms/admin.glade:2245 #, fuzzy msgid "This lets you configure PlayTime limits." msgstr "Auf diese Weise können Sie die Fristen für heute ändern" #: resource/client/forms/admin.glade:2247 #: resource/client/forms/client.glade:1253 #, fuzzy #| msgid "Daily limits" msgid "PlayTime limits" msgstr "Tages-Limits" #: resource/client/forms/admin.glade:2305 msgid "" "Increase daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:2322 msgid "" "Decrease daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:2374 #, fuzzy #| msgid "" #| "Lists day of the week and additional information about the day's limit. " #| "Please enable / disable days for the user." msgid "" "Lists day of the week and additional information about the day's PlayTime " "limit.\n" "\n" "Please enable / disable days for the user and set time allowance for " "PlayTime activities." msgstr "Verwaltung von gesamten Nutzungstagen pro Woche für den Benutzer." #: resource/client/forms/admin.glade:2423 #, fuzzy #| msgid "Time inactive:" msgid "PlayTime activities" msgstr "Passive Zeit:" #: resource/client/forms/admin.glade:2445 msgid "" "Add new PlayTime activity.\n" "\n" "Please specify activity mask and user friendly description in the activity " "list directly." msgstr "" #: resource/client/forms/admin.glade:2462 msgid "Remove selected entry from PlayTime activities." msgstr "" #: resource/client/forms/admin.glade:2506 msgid "" "Please specify a list of full process (executable) names without path as " "case sensitive strings to be monitored in the system.\n" "\n" "It's possible to specify RegExp masks for processes too, but please be very " "careful about them as misusing this setting may lead to killing unwanted " "processes for the user!\n" "\n" "NOTE: RegExp is an expert setting!" msgstr "" #: resource/client/forms/admin.glade:2546 #, fuzzy #| msgid "Users related configuration" msgid "Apply PlayTime configuration" msgstr "Benutzer-bezogene Konfiguration" #: resource/client/forms/admin.glade:2550 msgid "Apply PlayTime limits and configuration changes on this page" msgstr "" #: resource/client/forms/admin.glade:2569 #, fuzzy #| msgid "Timekpr-nExT Configuration" msgid "PlayTime configuration" msgstr "Timekpr-nExT-Konfiguration" #: resource/client/forms/admin.glade:2594 #, fuzzy msgid "Additional configuration options" msgstr "Zusätzliche Konfigurationsoptionen" #: resource/client/forms/admin.glade:2629 #: resource/client/forms/admin.glade:2652 #, fuzzy #| msgid "" #| "Select whether inactive session time is counted. If this is unchecked, " #| "time spent in console (not terminal emulator) login sessions and while " #| "the screen is locked is NOT taken into account. This varies among desktop " #| "environments." msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account. This " "varies among desktop environments." msgstr "" "Nutzungszeit mit gesperrtem Bildschirm oder ohne aktives Fenster (sogenannte " "console) wird nicht mitgezählt (abhängig von gewählter Desktopumgebung). Ist " "das Häkchen gesetzt, zählt alles vom Einloggen bis zum Ausloggen als " "Nutzungszeit." #: resource/client/forms/admin.glade:2633 msgid "Track inactive sessions:" msgstr "Passive Nutzungszeit mitzählen:" #: resource/client/forms/admin.glade:2669 #: resource/client/forms/admin.glade:2692 #, fuzzy msgid "" "Select whether to show Timekpr-next's padlock icon and notifications to the " "user.\n" "\n" "Please note that unchecking this will disable showing all information and " "notifications to the user!" msgstr "" "Wählen Sie aus, ob das Vorhängeschlosssymbol und Benachrichtigungen für den " "Benutzer angezeigt werden sollen.\n" "Bitte beachten Sie, dass dadurch die Anzeige aller Informationen und " "Benachrichtigungen für den Benutzer deaktiviert wird!" #: resource/client/forms/admin.glade:2673 msgid "Hide icon and notifications:" msgstr "Verberge Symbol und Benachrichtigungen:" #: resource/client/forms/admin.glade:2744 #, fuzzy msgid "" "Select a restriction / lockout type for the user.\n" "\n" "NOTE: please be very careful, think ahead and read every options description " "when changing this setting from default value!" msgstr "" "Wählen Sie einen Einschränkungstyp für den Benutzer aus.\n" "HINWEIS: Bitte seien Sie sehr vorsichtig, denken Sie voraus und lesen Sie " "jede Optionsbeschreibung, wenn Sie diese Einstellung vom Standardwert ändern!" #: resource/client/forms/admin.glade:2748 #, fuzzy msgid "Restriction / lockout type:" msgstr "Einschränkung / Sperrart:" #: resource/client/forms/admin.glade:2770 #, fuzzy msgid "terminate sessions" msgstr "Sitzungen beenden" #: resource/client/forms/admin.glade:2774 #, fuzzy msgid "" "When time ends, user sessions will be terminated.\n" "\n" "This option is a restriction!\n" "\n" "This is the default option and most likely is the one you need!" msgstr "" "Nach Ablauf der Zeit werden Benutzersitzungen beendet.\n" "Diese Option ist eine Einschränkung!\n" "Dies ist die Standardoption und höchstwahrscheinlich die, die Sie benötigen!" #: resource/client/forms/admin.glade:2792 #, fuzzy msgid "shutdown computer" msgstr "den Computer herunterfahren" #: resource/client/forms/admin.glade:2796 #, fuzzy msgid "" "When time ends, computer will be shut down.\n" "\n" "This option is a restriction!\n" "\n" "Please evaluate whether you need this type of restriction!" msgstr "" "Nach Ablauf der Zeit wird der Computer heruntergefahren.\n" "Diese Option ist eine Einschränkung!\n" "Bitte bewerten Sie, ob Sie diese Art der Einschränkung benötigen!" #: resource/client/forms/admin.glade:2814 #, fuzzy msgid "suspend computer" msgstr "Computer anhalten" #: resource/client/forms/admin.glade:2818 #, fuzzy msgid "" "When time ends, computer will be suspended (put to sleep).\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Wenn die Zeit abgelaufen ist, wird der Computer angehalten (in den " "Ruhezustand versetzt).\n" "Diese Option ist keine Einschränkung und eignet sich eher zur " "Selbstkontrolle.\n" "Wenn der Computerbildschirm geweckt wird, wenn noch keine Zeit mehr " "vorhanden ist, wird er gesperrt und nach einiger Zeit wieder in den " "Ruhezustand versetzt." #: resource/client/forms/admin.glade:2836 #, fuzzy msgid "suspend / wakeup computer" msgstr "Computer anhalten / aufwecken" #: resource/client/forms/admin.glade:2840 #, fuzzy msgid "" "When time ends, computer will be suspended (put to sleep) and will be woken " "up at start of next available time interval for the user.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Wenn die Zeit abgelaufen ist, wird der Computer angehalten (in den " "Ruhezustand versetzt) und zu Beginn des nächsten verfügbaren Zeitintervalls " "für den Benutzer aufgeweckt.\n" "Diese Option ist keine Einschränkung und eignet sich eher zur " "Selbstkontrolle.\n" "Wenn der Computerbildschirm geweckt wird, wenn noch keine Zeit mehr " "vorhanden ist, wird er gesperrt und nach einiger Zeit wieder in den " "Ruhezustand versetzt." #: resource/client/forms/admin.glade:2858 #, fuzzy msgid "lock screen" msgstr "Sperrbildschirm" #: resource/client/forms/admin.glade:2862 #, fuzzy msgid "" "When time ends, computer screen will be locked.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes." msgstr "" "Nach Ablauf der Zeit wird der Computerbildschirm gesperrt.\n" "Diese Option ist keine Einschränkung und eignet sich eher zur " "Selbstkontrolle." #: resource/client/forms/admin.glade:2893 #, fuzzy msgid "" "Select a time interval when computer can be woken up automatically.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Wählen Sie ein Zeitintervall, in dem der Computer automatisch geweckt werden " "kann.\n" "Bitte beachten Sie, dass diese Option nur wirksam ist, wenn das Aufwecken " "mit RealTime Clock im BIOS / UEFI unterstützt und aktiviert wird!" #: resource/client/forms/admin.glade:2897 #, fuzzy msgid "Wakeup hour interval:" msgstr "Weckstundenintervall:" #: resource/client/forms/admin.glade:2909 #, fuzzy msgid "" "Enter start hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Geben Sie die Startstunde für die automatische Weckfunktion ein.\n" "Bitte beachten Sie, dass diese Option nur wirksam ist, wenn das Aufwecken " "mit RealTime Clock im BIOS / UEFI unterstützt und aktiviert wird!" #: resource/client/forms/admin.glade:2928 #, fuzzy msgid "" "Enter end hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Geben Sie die Endstunde für die automatische Weckfunktion ein.\n" "Bitte beachten Sie, dass diese Option nur wirksam ist, wenn das Aufwecken " "mit RealTime Clock im BIOS / UEFI unterstützt und aktiviert wird!" #: resource/client/forms/admin.glade:2966 #, fuzzy #| msgid "Configuration" msgid "Apply configuration" msgstr "Konfiguration" #: resource/client/forms/admin.glade:2970 #, fuzzy msgid "Apply additional configuration changes on this page" msgstr "Zusätzliche Konfigurationsoptionen" #: resource/client/forms/admin.glade:2989 #, fuzzy msgid "Additional configuration" msgstr "Zusätzliche Konfiguration" #: resource/client/forms/admin.glade:2990 #: resource/client/forms/admin.glade:3661 #, fuzzy msgid "Additional options" msgstr "Zusatzoptionen" #: resource/client/forms/admin.glade:3017 msgid "User Configuration" msgstr "Benutzer-Konfiguration" #: resource/client/forms/admin.glade:3027 #, fuzzy #| msgid "Timekpr-nExT Configuration" msgid "Timekpr-nExT related configuration" msgstr "Timekpr-nExT-Konfiguration" #: resource/client/forms/admin.glade:3054 msgid "Control Timekpr-nExT Settings" msgstr "Verwalten der Timekpr-nExT Einstellungen" #: resource/client/forms/admin.glade:3081 #: resource/client/forms/admin.glade:3233 #, fuzzy #| msgid "" #| "Timekpr-nExT log level. Please do not change this unless asked. You " #| "likely won't find anything pretty in the log files.\n" #| "1 - standard, 2 - debug, 3 - extra debug" msgid "" "Timekpr-nExT log level.\n" "\n" "Please do not change this unless you have to. You likely won't find anything " "pretty in the log files.\n" "\n" "Values are: 1 - standard, 2 - debug, 3 - extra debug" msgstr "" "Timekpr-nExT log level, bitte nur ändern falls dazu aufgeforder (Sie werden " "wahrscheinlich nichts brauchbares in den Logdateien finden)\n" "1 - standard, 2 - debug, 3 - extra debug" #: resource/client/forms/admin.glade:3101 #: resource/client/forms/admin.glade:3149 #, fuzzy #| msgid "" #| "Specify session polling time granularity (how often user sessions and " #| "activity are checked).\n" #| "3 - 5 seconds are optimal, don't change this if unsure." msgid "" "Session polling time granularity which specifies how often user sessions and " "activity are checked and accounted.\n" "\n" "3 - 5 seconds are optimal, don't change this if unsure." msgstr "" "Festlegen, in welchen Abständen die Nutzungszeit überprüft werden soll " "(Kontrollhäufigkeit für Sitzung und Aktivität).\n" "3-5 Sekunden sind optimal, im Zweifel den Wert unverändert lassen." #: resource/client/forms/admin.glade:3105 msgid "Poll interval" msgstr "Abfrage-Intervall" #: resource/client/forms/admin.glade:3117 #: resource/client/forms/admin.glade:3220 #, fuzzy #| msgid "" #| "Specify the time in seconds when Timekpr-nExT starts continuous real-time " #| "countdown before terminating the session" msgid "" "Specify the time in seconds when Timekpr-nExT starts continuous real-time " "countdown before enforcing a restriction / lockout to user's sessions." msgstr "" "Wieviele Sekunden bevor Timekpr-nExT die Sitzung beendet soll der Countdown " "eingeblendet werden" #: resource/client/forms/admin.glade:3133 #: resource/client/forms/admin.glade:3183 msgid "" "This specifies the rate in seconds at which actual user state is saved to " "disk.\n" "\n" "To improve performance and still have great accuracy, Timekpr-nExT accounts " "time in memory at \"Poll interval\" frequency, this setting defines a " "frequency at which user state is saved to disk for permanent storage." msgstr "" #: resource/client/forms/admin.glade:3137 msgid "Save time" msgstr "Zeit speichern" #: resource/client/forms/admin.glade:3167 #: resource/client/forms/admin.glade:3202 msgid "" "Number of seconds left for user before enforcing a configured restriction / " "lockout to his sessions.\n" "\n" "After this is reached and user is still active, the user's sessions will be " "handled according to specified restriction / lockout, and almost nothing can " "be done to prevent it." msgstr "" #: resource/client/forms/admin.glade:3171 msgid "Termination time" msgstr "Beendigungs-Zeit" #: resource/client/forms/admin.glade:3222 #, fuzzy #| msgid "Termination time" msgid "Countdown time" msgstr "Beendigungs-Zeit" #: resource/client/forms/admin.glade:3239 msgid "Log level" msgstr "Log-Stufe" #: resource/client/forms/admin.glade:3250 #: resource/client/forms/admin.glade:3266 msgid "" "Number of seconds left for user's available time before sending a final " "critical notification that time is about to run out.\n" "\n" "NOTE: the rest of the notification times are configurable per user by user " "in client application!" msgstr "" #: resource/client/forms/admin.glade:3254 #, fuzzy #| msgid "Show all notifications" msgid "Final notification" msgstr "Alle Benachrichtigungen anzeigen" #: resource/client/forms/admin.glade:3308 msgid "Control Timekpr-nExT tracking items" msgstr "Verwalten der von Timekpr-nExT überwachten Zustände" #: resource/client/forms/admin.glade:3341 msgid "Tracked Sessions" msgstr "Überwachte Sitzungen" #: resource/client/forms/admin.glade:3364 msgid "Add tracked session type to the list" msgstr "Überwachten Sitzungs-Typ zur Liste hinzufügen" #: resource/client/forms/admin.glade:3379 msgid "Remove tracked session type from the list" msgstr "Überwachten Sitzungs-Typ von der Liste entfernen" #: resource/client/forms/admin.glade:3408 #, fuzzy #| msgid "" #| "List of session types to be tracked.\n" #| "Please, do not change or experiment with this unless you actually (not " #| "wishfully) know what you are doing." msgid "" "List of session types to be tracked.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Liste der überwachten Sitzungs-Typen.\n" "Bitten nicht ändern oder damit herumprobieren, außer Sie wissen genau was " "sie damit verändern." #: resource/client/forms/admin.glade:3442 msgid "Excluded Sessions" msgstr "Nicht überwachte Sitzungs-Typen" #: resource/client/forms/admin.glade:3465 msgid "Add an excluded session type to the list" msgstr "Sitzungs-Typ, der nicht überwacht werden soll, zur Liste hinzufügen" #: resource/client/forms/admin.glade:3480 msgid "Remove an excluded session type from the list" msgstr "Sitzungs-Typ, der nicht überwacht werden soll, von der Liste entfernen" #: resource/client/forms/admin.glade:3509 #, fuzzy #| msgid "" #| "List of sessions to be excluded from tracking.\n" #| "Please, do not change or experiment with this unless you actually (not " #| "wishfully) know what you are doing." msgid "" "List of sessions to be excluded from tracking.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Liste der nicht überwachten Sitzungs-Typen.\n" "Bitten nicht ändern oder damit herumprobieren, außer Sie wissen genau was " "sie damit verändern." #: resource/client/forms/admin.glade:3543 msgid "Excluded Users" msgstr "Nicht überwachte Benutzer" #: resource/client/forms/admin.glade:3566 msgid "Add a user to the exclusion list" msgstr "Benutzer zur Ausschluss-Liste hinzufügen" #: resource/client/forms/admin.glade:3581 msgid "Remove a user from the exclusion list" msgstr "Benutzer von der Ausschluss-Liste entfernen" #: resource/client/forms/admin.glade:3610 #, fuzzy #| msgid "" #| "List of users excluded from tracking.\n" #| "Please specify actual usernames, not real names here. For example, " #| "\"jsmith\", not \"John Smith\"." msgid "" "List of users excluded from tracking.\n" "\n" "Please specify actual usernames, not real names here. For example, \"jsmith" "\", not \"John Smith\"." msgstr "" "Liste der Benutzer, deren Nutzungszeit nicht überwacht werden soll.\n" "Bitte die vom System verwendeten Benutzernamen statt Vorname/Nachname " "eingeben (bspw. \"mmustermann\" statt \"Max Mustermann\")" #: resource/client/forms/admin.glade:3688 #: resource/client/forms/admin.glade:3707 #: resource/client/forms/admin.glade:3743 msgid "" "This setting controls whether PlayTime functionality is enabled.\n" "\n" "This is a PlayTime master switch, if it's turned off, it's turned off for " "everyone regardless of individual settings!" msgstr "" #: resource/client/forms/admin.glade:3692 msgid "PlayTime enabled:" msgstr "" #: resource/client/forms/admin.glade:3722 msgid "" "This setting controls whether PlayTime activity monitor will use process " "command line, including arguments, for monitoring processes (by default only " "uses the process name).\n" "\n" "When this setting is enabled Timekpr-nExT will perform a match against full " "command line up to 512 characters enabling enhanced process monitoring " "capabilities.\n" "\n" "Please be careful and double check your RegExp patterns in each individual " "user's PlayTime activity masks!" msgstr "" #: resource/client/forms/admin.glade:3728 msgid "Enhanced activity monitor:" msgstr "" #: resource/client/forms/admin.glade:3777 #, fuzzy #| msgid "Apply Timekpr-nExT setings" msgid "Apply Timekpr-nExT settings" msgstr "Anwenden der Timekpr-nExT Einstellungen" #: resource/client/forms/admin.glade:3782 msgid "Apply all Timekpr-nExT settings at once" msgstr "Anwenden aller Timekpr-nExT Einstellungen auf einmal" #: resource/client/forms/admin.glade:3802 msgid "Timekpr-nExT Administration Configuration" msgstr "Konfigurieren, wie Timekpr-nExT arbeiten soll (Administration)" #: resource/client/forms/admin.glade:3803 msgid "Timekpr-nExT Configuration" msgstr "Timekpr-nExT-Konfiguration" #: resource/client/forms/admin.glade:3832 #: resource/client/forms/admin.glade:3849 msgid "Status of Timekpr-nExT admin client" msgstr "Status des Timekpr-nExT Admin Client" #. This is one of the notification priorities #: resource/client/forms/client.glade:27 #, fuzzy #| msgid "Configuration" msgid "Information" msgstr "Konfiguration" #. This is one of the notification priorities #: resource/client/forms/client.glade:31 #, fuzzy #| msgid "Warning time" msgid "Warning" msgstr "Warnungs-Zeiten" #. This is one of the notification priorities #: resource/client/forms/client.glade:35 msgid "Severe" msgstr "" #. This is one of the notification priorities #: resource/client/forms/client.glade:39 msgid "Critical" msgstr "" #: resource/client/forms/client.glade:133 msgid "Timekpr-nExT client" msgstr "Timekpr-nExT Client" #: resource/client/forms/client.glade:164 msgid "Status of Timekpr-nExT client" msgstr "Status des Timekpr-nExT Client" #: resource/client/forms/client.glade:196 msgid "Save all changes" msgstr "Alle Änderungen speichern" #: resource/client/forms/client.glade:213 msgid "Close the window" msgstr "Fenster schließen" #: resource/client/forms/client.glade:297 #: resource/client/forms/client.glade:314 msgid "Current effective username" msgstr "Momentaner effektiver Benutzername" #: resource/client/forms/client.glade:371 msgid "Current statistics" msgstr "Aktuelle Statistiken" #: resource/client/forms/client.glade:396 msgid "Time spent this session or after Timekpr-nExT has been restarted" msgstr "" "Verbrauchte Nutzungszeit in der Benutzersitzung oder seit Timekpr-nExT neu " "gestartet wurde" #: resource/client/forms/client.glade:398 msgid "Time spent (session):" msgstr "Nutzungszeit (Sitzung):" #: resource/client/forms/client.glade:441 msgid "Time inactive this session or after Timekpr-nExT has been restarted" msgstr "" "Passive Nutzungszeit in der Benutzersitzung oder seit Timekpr-nExT neu " "gestartet wurde" #: resource/client/forms/client.glade:443 msgid "Time inactive:" msgstr "Passive Zeit:" #: resource/client/forms/client.glade:469 #, fuzzy msgid "Continuous time left to you. May span more than the current day." msgstr "" "Ab jetzt noch ohne Unterbrechung bestehende Nutzungszeit - diese kann auch " "über den momentanen Tag hinausgehen." #: resource/client/forms/client.glade:471 msgid "Continuous time left:" msgstr "Verbleibende Zeit ohne Unterbrechung:" #: resource/client/forms/client.glade:487 msgid "Total time available left today in a row, up to the end of the day" msgstr "Verbleibende Zeit insgesamt bis zum Ende des Tages" #: resource/client/forms/client.glade:489 #: resource/client/forms/client.glade:974 msgid "Time left today:" msgstr "Verbleibende Zeit heute:" #: resource/client/forms/client.glade:548 msgid "These are the days and limits that are available to you" msgstr "Ihnen erlaubte Nutzungstage und Limits" #: resource/client/forms/client.glade:573 #: resource/client/forms/client.glade:1171 msgid "Days & Limits" msgstr "Nutzungstage & Limits" #: resource/client/forms/client.glade:609 msgid "" "This shows the time intervals that are available for use.\n" "\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead." msgstr "" #: resource/client/forms/client.glade:634 msgid "Intervals" msgstr "Intervalle" #: resource/client/forms/client.glade:663 msgid "Daily limits" msgstr "Tages-Limits" #: resource/client/forms/client.glade:691 msgid "Additional statistics" msgstr "Zusätzliche Statistiken" #: resource/client/forms/client.glade:715 msgid "Time spent this week" msgstr "Verbrauchte Nutzungszeit in dieser Woche" #: resource/client/forms/client.glade:742 msgid "Time spent this month" msgstr "Verbrauchte Nutzungszeit in diesem Monat" #: resource/client/forms/client.glade:755 #, fuzzy #| msgid "" #| "Select whether inactive session time is counted. If this is unchecked, " #| "time spent in console (not terminal emulator) login sessions and while " #| "the screen is locked is NOT taken into account. This varies among desktop " #| "environments." msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account.\n" "This varies among desktop environments." msgstr "" "Nutzungszeit mit gesperrtem Bildschirm oder ohne aktives Fenster (sogenannte " "console) wird nicht mitgezählt (abhängig von gewählter Desktopumgebung). Ist " "das Häkchen gesetzt, zählt alles vom Einloggen bis zum Ausloggen als " "Nutzungszeit." #: resource/client/forms/client.glade:760 msgid "Track inactive:" msgstr "Passive Nutzung überwachen:" #: resource/client/forms/client.glade:773 msgid "" "Select whether inactive session time is counted. If this is unchecked, time " "spent in console (not terminal emulator) login sessions and while the screen " "is locked is NOT taken into account. This varies among desktop environments." msgstr "" "Nutzungszeit mit gesperrtem Bildschirm oder ohne aktives Fenster (sogenannte " "console) wird nicht mitgezählt (abhängig von gewählter Desktopumgebung). Ist " "das Häkchen gesetzt, zählt alles vom Einloggen bis zum Ausloggen als " "Nutzungszeit." #: resource/client/forms/client.glade:820 #: resource/client/forms/client.glade:918 msgid "Additional limits" msgstr "Zusätzliche Limits" #: resource/client/forms/client.glade:844 msgid "Time limit for this week available to you" msgstr "Ihnen erlaubte Nutzungszeit in dieser Woche" #: resource/client/forms/client.glade:846 msgid "Time limit (week):" msgstr "Zeitlimit (Woche):" #: resource/client/forms/client.glade:872 msgid "Time limit for this month available to you" msgstr "Ihnen erlaubte Nutzungszeit in diesem Monat" #: resource/client/forms/client.glade:874 msgid "Time limit (month):" msgstr "Zeitlimit (Monat):" #: resource/client/forms/client.glade:948 #, fuzzy #| msgid "Current statistics" msgid "Current PlayTime statistics" msgstr "Aktuelle Statistiken" #: resource/client/forms/client.glade:972 msgid "Total PlayTime available left today" msgstr "" #: resource/client/forms/client.glade:998 #, fuzzy #| msgid "Time spent (today):" msgid "Total PlayTime spent today" msgstr "Nutzungszeit (heute):" #: resource/client/forms/client.glade:1000 #, fuzzy #| msgid "Time spent (today):" msgid "Time spent today:" msgstr "Nutzungszeit (heute):" #: resource/client/forms/client.glade:1027 #: resource/client/forms/client.glade:1042 msgid "" "This option overrides the default time accounting.\n" "\n" "If it's checked, the time is accounted only when activities in \"Activity / " "application list\" are running, the rest of the time is considered idle." msgstr "" #: resource/client/forms/client.glade:1046 #, fuzzy #| msgid "Time limit (week):" msgid "Time limit override:" msgstr "Zeitlimit (Woche):" #: resource/client/forms/client.glade:1060 #: resource/client/forms/client.glade:1073 msgid "Number of currently active PlayTime activities" msgstr "" #: resource/client/forms/client.glade:1062 msgid "Running activities:" msgstr "" #: resource/client/forms/client.glade:1086 #: resource/client/forms/client.glade:1106 msgid "" "Allow activities during unaccounted (\"∞\") time intervals.\n" "\n" "This setting allows to use applications listed in \"Activity / application " "list\" during time intervals which are marked as unaccounted (\"∞\"), if the " "setting is not enabled, none of activities are allowed to run!" msgstr "" #: resource/client/forms/client.glade:1090 msgid "Allowed during \"∞\":" msgstr "" #: resource/client/forms/client.glade:1148 #, fuzzy #| msgid "These are days and limits that available to You" msgid "" "These are days and limits that available to you as part of PlayTime activity " "restrictions" msgstr "Ihnen erlaubte Nutzungstage und Limits" #: resource/client/forms/client.glade:1205 msgid "" "This shows activities / applications which are part of PlayTime restrictions" msgstr "" #: resource/client/forms/client.glade:1228 msgid "Activity / application list" msgstr "" #: resource/client/forms/client.glade:1292 msgid "" "Configuration for personalized notifications about available time.\n" "\n" "Please configure notifications as you see fit. However, please keep in mind " "that there will be two types of notifications that cannot be personalized: a " "final warning some time before time ends and a countdown notifications when " "time is about to end.\n" "\n" "The configuration \"Time\" value indicates a value of time left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" #: resource/client/forms/client.glade:1324 #, fuzzy msgid "Notification configuration" msgstr "Zusätzliche Konfiguration" #: resource/client/forms/client.glade:1346 #, fuzzy #| msgid "Add tracked session type to the list" msgid "Add new notification threshold to the list" msgstr "Überwachten Sitzungs-Typ zur Liste hinzufügen" #: resource/client/forms/client.glade:1361 #, fuzzy #| msgid "Remove tracked session type from the list" msgid "Remove notification threshold from the list" msgstr "Überwachten Sitzungs-Typ von der Liste entfernen" #: resource/client/forms/client.glade:1410 msgid "" "Configuration for personalized notifications about available PlayTime.\n" "\n" "Please configure notifications as you see fit.\n" "\n" "The configuration \"Time\" value indicates a value of PlayTime left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" #: resource/client/forms/client.glade:1442 #, fuzzy #| msgid "Timekpr-nExT Administration Configuration" msgid "PlayTime notification configuration" msgstr "Konfigurieren, wie Timekpr-nExT arbeiten soll (Administration)" #: resource/client/forms/client.glade:1464 msgid "Add new PlayTime notification threshold to the list" msgstr "" #: resource/client/forms/client.glade:1479 #, fuzzy #| msgid "Remove tracked session type from the list" msgid "Remove PlayTime notification threshold from the list" msgstr "Überwachten Sitzungs-Typ von der Liste entfernen" #: resource/client/forms/client.glade:1538 #, fuzzy #| msgid "Show all notifications" msgid "Notifications" msgstr "Alle Benachrichtigungen anzeigen" #: resource/client/forms/client.glade:1562 #, fuzzy #| msgid "" #| "Select whether to use speech notifications, if available. You may be able " #| "to make speech notifications available by installing package \"python3-" #| "espeak\"." msgid "" "Select whether to use speech notifications, if available.\n" "\n" "You may be able to make speech notifications available by installing package " "\"python3-espeak\"." msgstr "" "Festlegen, ob Sprach-Hinweise gegeben werden (ausgegraut, falls nicht " "verfügbar). Für Verfügbarkeit muss das Paket \"python3-espeak\" installiert " "sein." #: resource/client/forms/client.glade:1572 msgid "Use speech notifications" msgstr "Sprach-Hinweise verwenden" #: resource/client/forms/client.glade:1591 #: resource/client/forms/client.glade:1613 #, fuzzy #| msgid "" #| "This sets the logging level. Please do not change this unless you know " #| "what you're doing." msgid "" "This sets the logging level.\n" "\n" "Please do not change this unless you know what you're doing." msgstr "" "Stufen für die Ausführlichkeit des Logs (Bitten nicht ändern außer Sie " "wissen genau was sie damit verändern)" #: resource/client/forms/client.glade:1617 msgid "Logging level" msgstr "Log-Ausführlichkeit" #: resource/client/forms/client.glade:1639 msgid "" "Specify whether to show a notification when limit configurations or " "allowance changes" msgstr "" "Sollen Änderungen an Limits oder der erlaubten Nutzungszeiten angezeigt " "werden" #: resource/client/forms/client.glade:1647 msgid "Show limit changes" msgstr "Limit-Änderungen anzeigen" #: resource/client/forms/client.glade:1663 #, fuzzy #| msgid "" #| "Specify whether to show all notifications. If unchecked, then only " #| "important ones are shown" msgid "" "Specify whether to show all notifications.\n" "\n" "If unchecked, then only important ones are shown." msgstr "" "Sollen alle Benachrichtigungen angezeigt werden? Es werden sonst nur die " "wichtigsten gezeigt" #: resource/client/forms/client.glade:1673 msgid "Show all notifications" msgstr "Alle Benachrichtigungen anzeigen" #: resource/client/forms/client.glade:1689 #, fuzzy #| msgid "" #| "Specify whether to show seconds in notification area. Some desktop " #| "environments, like KDE5, do not support text besides notification icons." msgid "" "Specify whether to show seconds in notification area.\n" "\n" "Some desktop environments, like KDE5, do not support text besides " "notification icons." msgstr "" "Sollen Zeitangaben in Benachrichtigungen auch die Sekunden enthalten (manche " "Desktopumgebungen, bspw. KDE5, haben keine Unterstützung für Text bei " "Benachrichtigungs-Icons)" #: resource/client/forms/client.glade:1699 msgid "Show seconds in notification area" msgstr "Benachrichtigungen enthalten Sekunden" #: resource/client/forms/client.glade:1718 #: resource/client/forms/client.glade:1742 #, fuzzy msgid "" "This sets how long a notification is shown for regular notifications about " "time left and configuration changes.\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed (not recommended for regular " "notifications).\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Hiermit wird festgelegt, wie lange eine Benachrichtigung für reguläre " "Benachrichtigungen über verbleibende Zeit und Konfigurationsänderungen " "angezeigt wird.\n" "Der Wert wird in Sekunden angegeben. Der Wert 0 bedeutet \"Anzeigen bis zur " "Entlassung\" (nicht empfohlen für reguläre Benachrichtigungen).\n" "Bitte beachten Sie, dass die von Ihnen verwendete Umgebung das Zeitlimit " "überschreiben kann. Dies bedeutet, dass diese Einstellung keine Auswirkungen " "auf die Benachrichtigung hat." #: resource/client/forms/client.glade:1749 msgid "Notification timeout (sec)" msgstr "Benachrichtigungs-Timeout (Sek.)" #: resource/client/forms/client.glade:1774 #: resource/client/forms/client.glade:1799 #, fuzzy msgid "" "This sets how long a notification is shown for \"Critical\" notifications " "about time left (when the icon turns red).\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed.\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Hiermit wird festgelegt, wie lange eine Benachrichtigung für kritische " "Benachrichtigungen über die verbleibende Zeit angezeigt wird (wenn das " "Symbol rot wird).\n" "Der Wert wird in Sekunden angegeben. Der Wert 0 bedeutet \"Anzeigen bis zur " "Entlassung\".\n" "Bitte beachten Sie, dass die von Ihnen verwendete Umgebung das Zeitlimit " "überschreiben kann. Dies bedeutet, dass diese Einstellung keine Auswirkungen " "auf die Benachrichtigung hat." #: resource/client/forms/client.glade:1806 msgid "Critical notification timeout (sec)" msgstr "Zeitlimit für kritische Benachrichtigung (Sek.)" #: resource/client/forms/client.glade:1828 #, fuzzy msgid "" "Select whether to use sound \"bell\" (short notification sound) to announce " "a new notification from Timekpr-nExT.\n" "\n" "This works only for enabled notifications.\n" "\n" "If this setting is not editable, your environment does not advertise sound " "notification support." msgstr "" "Wählen Sie aus, ob der Ton \"Glocke\" (kurzer Benachrichtigungston) " "verwendet werden soll, um eine neue Benachrichtigung von Timekpr-nExT " "anzuzeigen. Dies funktioniert nur für aktivierte Benachrichtigungen.\n" "Wenn die Einstellung nicht bearbeitet werden kann, wird in Ihrer Umgebung " "keine Unterstützung für Soundbenachrichtigungen angekündigt." #: resource/client/forms/client.glade:1840 msgid "Use sound \"bell\" for notifications" msgstr "Sound \"Piepton\" für Benachrichtigungen" #: resource/client/forms/client.glade:1860 msgid "Configuration" msgstr "Konfiguration" #, fuzzy #~| msgid "" #~| "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~| "Super tester: Rinalds Dobelis\n" #~| "Beta tester: SanskritFritz" #~ msgid "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Main test (ex): Rinalds Dobelis\n" #~ "Beta test: SanskritFritz" #~ msgstr "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Super tester: Rinalds Dobelis\n" #~ "Beta tester: SanskritFritz" #~ msgid "00:00:00:00" #~ msgstr "00:00:00:00" #~ msgid "Amount:" #~ msgstr "Anzahl:" #~ msgid "Add" #~ msgstr "Hinzufügen" #~ msgid "Subtract" #~ msgstr "Abziehen" #~ msgid "Set" #~ msgstr "Setzen" #~ msgid "Configure time limits for week days" #~ msgstr "Konfigurieren von Zeitlimits für Wochentage" #~ msgid "Set the number of hours to limit available time for particular day" #~ msgstr "Festlegen von Nutzungszeit in Stunden für einen bestimmten Tag" #~ msgid "" #~ "Set hours and minutes at this user's disposal for this particular day. " #~ "Don't forget to hit the button!" #~ msgstr "" #~ "Festlegen von Nutzungszeit in Stunden und Minuten für einen bestimmten " #~ "Tag, die dem Benutzer zur Verfügung stehen soll (muss noch mit dem " #~ "-Button bestätigt werden)" #~ msgid "Manage intervals for the day" #~ msgstr "Verwalten der Tages-Intervalle" #~ msgid "Specify START minute of the allowed hour interval" #~ msgstr "Festlegen der Anfangs-Minute des erlaubten Stunden-Intervalls" #~ msgid "Specify START hour of the allowed hour interval" #~ msgstr "Festlegen der Anfangs-Stunde des erlaubten Stunden-Intervalls" #~ msgid "to" #~ msgstr "bis" #~ msgid "Remove" #~ msgstr "Entfernen" #~ msgid "" #~ "Remove selected interval from the list. Do not forget to hit the " #~ "button!" #~ msgstr "" #~ "Gewählten Intervall von der Liste entfernen (muss noch mit dem -" #~ "Button bestätigt werden)" #~ msgid "" #~ "Add specified hour interval to the list. Do not forget to hit the " #~ "button!" #~ msgstr "" #~ "Festgelegten Intervall zur Liste hinzufügen (muss noch mit dem -" #~ "Button bestätigt werden)" #~ msgid "Specify the END hour of the allowed hour interval" #~ msgstr "Festlegen der letzten Stunde des erlaubten Stunden-Intervalls" #~ msgid "Specify the END minute of the allowed hour interval" #~ msgstr "Festlegen der letzten Minute des erlaubten Stunden-Intervalls" #~ msgid "Time limit for the month" #~ msgstr "Zeit-Limits für den Monat" #~ msgid "Time limit (month)" #~ msgstr "Zeit-Limit (Monat)" #~ msgid "Time limit for the month is enabled" #~ msgstr "Monatliches Zeit-Limit ist eingeschaltet" #~ msgid "Time limit for the week" #~ msgstr "Zeit-Limits für die Woche" #~ msgid "Time limit (week)" #~ msgstr "Zeit-Limit (Woche)" #~ msgid "day" #~ msgstr "Tag" #~ msgid "Week limit (days part)" #~ msgstr "Wöchentliches Zeit-Limit (Tage)" #~ msgid "Week limit (hours part)" #~ msgstr "Wöchentliches Zeit-Limit (Stunden-Anteil)" #~ msgid "Week limit (minutes part)" #~ msgstr "Wöchentliches Zeit-Limit (Minuten-Anteil)" #~ msgid "Month limit (days part)" #~ msgstr "Monatliches Zeit-Limit (Tage)" #~ msgid "Month limit (hours part)" #~ msgstr "Monatliches Zeit-Limit (Stunden-Anteil)" #~ msgid "Month limit (minutes part)" #~ msgstr "Monatliches Zeit-Limit (Minuten-Anteil)" #~ msgid "This allows you to set up weekly and monthly limits" #~ msgstr "" #~ "Hier können wöchentliche und monatliche Zeit-Limits eingestellt werden" #~ msgid "Apply" #~ msgstr "Anwenden" #~ msgid "Apply weekly and monthly limits" #~ msgstr "Wochen- und Monats-Limits anwenden" #~ msgid "Weekly and monthly limit configuration" #~ msgstr "Konfiguration Wochen- und Monats-Limits" #~ msgid "Set track inactive sessions" #~ msgstr "Einstellen, ob passive Nutzungszeit gezählt wird" #~ msgid "Set preference for showing icon to user" #~ msgstr "" #~ "Legen Sie die Voreinstellung für die Anzeige des Symbols für den Benutzer " #~ "fest" #, fuzzy #~ msgid "Set restriction / lockout type" #~ msgstr "Stellen Sie den Einschränkungstyp ein" #~ msgid "This specifies the frequency with which actual user state is saved" #~ msgstr "" #~ "Hier wird der Zeit-Intervall, in dem der User-Status gespeicher wird, " #~ "gestgelegt" #~ msgid "" #~ "Number of seconds before terminating user sessions. After this is " #~ "reached, the user's session will be terminated / locked, and nothing can " #~ "be done to prevent it.\n" #~ "Adding time does not help in this case. Do that before reaching this " #~ "point..." #~ msgstr "" #~ "Sekunden bevor das Beenden einer Benutzer-Sitzung beginnt. Der Prozess " #~ "des Beendens einer Benutzer-Sitzung kann nicht mehr aufgehalten werden.\n" #~ "Es hilft nichts, während der einzelnen Schritte des Beendigungs-Prozesses " #~ "noch erlaubte Nutzungszeit hinzuzufügen - das sollte vorher gemacht " #~ "werden ..." #~ msgid "Enter session type to be tracked" #~ msgstr "Überwachten Sitzungs-Typ eingeben" #~ msgid "Enter session type to be excluded from tracking" #~ msgstr "Sitzungs-Typ, der nicht überwacht werden soll, eingeben" #~ msgid "Enter username to be excluded from tracking" #~ msgstr "Benutzername des nicht zu überwachenden Benutzers eingeben" #~ msgid "This shows the time periods that are available for your use" #~ msgstr "Zeit-Intervalle innerhalb Ihrer erlaubten Nutzungszeit" #~ msgid "==> get user configuration from the server, example" #~ msgstr "==> Gespeicherte Benutzerkonfiguration vom Server holen, Beispiel" #~ msgid "" #~ "==> set allowed hours per specified day or ALL for every day, example" #~ msgstr "" #~ "==> Festlegen der erlaubten Stunden für bestimmten Tag oder ALLE für jedn " #~ "Tag, Beispiel" #~ msgid "==> set time limits per all allowed days, example" #~ msgstr "==> Festlegen des Zeitlimits für erlaubte Tage, Beispiel" #~ msgid "" #~ "==> set time left for the user at current moment, example (add one hour)" #~ msgstr "==> Restzeit festlegen ab jetzt für momentanen Benutzer, Beispiel" #~ msgid "Control sessions types list is not correct and can not be set" #~ msgstr "" #~ "Liste der Sitzungssteuerung-Typen ist nicht korrekt und kann nicht " #~ "verarbeitet werden" #~ msgid "Excluded session types list is not correct and can not be set" #~ msgstr "" #~ "Liste der ausgeschlossenen Sitzungstypen ist nicht korrekt und kann nicht " #~ "verarbeitet werden" #~ msgid "Excluded user list is not correct and can not be set" #~ msgstr "" #~ "Liste der ausgeschlossenen Benutzer wurde nicht übergeben und kann nicht " #~ "verarbeitet werden" #, python-format #~ msgid "Final warning time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Zeitpunkt der letzten Warnung \"%%s\" ist nicht korrekt und kann nicht " #~ "verarbeitet werden" #, python-format #~ msgid "Termination time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "End-Zeitpunkt \"%%s\" ist nicht korrekt und kann nicht verarbeitet werden" #, python-format #~ msgid "Track inactive \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Beachtung von Inaktivität \"%%s\" ist nicht korrekt und kann nicht " #~ "verarbeitet werden" #, python-format #~ msgid "Log level \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Log level \"%%s\" ist nicht korrekt und kann nicht verarbeitet werden" #, python-format #~ msgid "Poll time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Abfrage-Zeit \"%%s\" ist nicht korrekt und kann nicht verarbeitet werden" #, python-format #~ msgid "Save time \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Speicherzeitpunkt \"%%s\" ist nicht korrekt und kann nicht verarbeitet " #~ "werden" #, python-format #~ msgid "User's \"%%s\" allowed hours are not correct and can not be set" #~ msgstr "" #~ "Erlaubte Stunden für Benutzer \"%%s\" sind nicht korrekt und können nicht " #~ "verarbeitet werden" #, python-format #~ msgid "User's \"%%s\" day limits list is not correct and can not be set" #~ msgstr "" #~ "Liste der Tages-Limits für Benutzer \"%%s\" ist nicht korrekt und kann " #~ "nicht verarbeitet werden" #, python-format #~ msgid "User's \"%%s\" day list is not correct and can not be set" #~ msgstr "" #~ "Liste der Tage für Benutzer \"%%s\" ist nicht korrekt und kann nicht " #~ "verarbeitet werden" #, python-format #~ msgid "User's \"%%s\" monthly allowance is not correct and can not be set" #~ msgstr "" #~ "Monatliches Zeitlimit für Benutzer \"%%s\" ist nicht korrekt und kann " #~ "nicht verarbeitet werden" #, python-format #~ msgid "User's \"%%s\" set time limit is not correct and can not be set" #~ msgstr "" #~ "Das Zeit-Limit für Benutzer \"%%s\" ist nicht korrekt und kann nicht " #~ "verarbeitet werden" #, python-format #~ msgid "User's \"%%s\" track inactive flag is not correct and can not be set" #~ msgstr "" #~ "Der Schalter für Inaktivitäts-Beachtung \"%%s\" ist nicht korrekt und " #~ "kann nicht verarbeitet werden" #, python-format #~ msgid "User's \"%%s\" weekly allowance is not correct and can not be set" #~ msgstr "" #~ "Wöchentliches Zeitlimit für Benutzer \"%%s\" ist nicht korrekt und kann " #~ "nicht verarbeitet werden" #~ msgid "Interval overlaps with existing one" #~ msgstr "Intervall überschneidet sich mit bereits vorhandenem Intervall" #~ msgid "Interval start conflicts with existing one" #~ msgstr "" #~ "Intervall-Beginn kollidiert mit bereits vorhandenem Intervall-Beginn" #~ msgid "Interval end conflicts with existing one" #~ msgstr "Intervall-Ende kollidiert mit bereits vorhandenem Intervall-Ende" #~ msgid "Interval start or end duplicates existing interval" #~ msgstr "" #~ "Intervall-Beginn oder -Ende duploziert bereits vorhandenen Intervall" #~ msgid "Interval start can not be the same as end" #~ msgstr "Intervall-Beginn muss ungleich Intervall-Ende sein" #~ msgid "Please select a hour interval to remove" #~ msgstr "Bitte wählen Sie einen Stunden-Intervall zum Entfernen" #~ msgid "please-enter-translator-credits" #~ msgstr "ulle@o2online.de" #~ msgid "" #~ "This is Timekpr-nExT configuration app. It allows you to configure time " #~ "for your users as well as the Timekpr-nExT parameters.\n" #~ "\n" #~ "To use this application, you either have to execute it as superuser or " #~ "have to be part of the timekpr group.\n" #~ "Please note that the \"Timekpr-nExT Configuration\" is available in " #~ "superuser (administrator) mode only!\n" #~ "\n" #~ "Please configure carefully: do not lock yourself out!" #~ msgstr "" #~ "Das ist die Timekpr-nExT Konfigurations-App, damit können die " #~ "Nutzungszeiten der Computer-Benutzer sowie auch Timekpr-nExT selbst " #~ "konfiguriert werden.\n" #~ "\n" #~ "Bitte beachten Sie, dass \"Timekpr-nExT Konfiguration\" nur im Superuser-" #~ "Modus (Administrator) möglich ist.\n" #~ "Sie müssen entweder Superuser oder Mitglied der Gruppe timekpr sein, um " #~ "die App vollständig verwenden zu können!\n" #~ "\n" #~ "Bitte seien Sie bei der Einrichtung sorgsam, Sie könnten sich selbst " #~ "aussperren!" #~ msgid "Time spent for this week (saved stated, not real-time)" #~ msgstr "Nutzungszeit dieser Woche (gespeichert, nicht real-time)" #~ msgid "" #~ "This allows you to change time for today as well as inactive session " #~ "tracking" #~ msgstr "" #~ "Hiermit können Sie die Zeit für heute und die Beachtung von Inaktivität " #~ "einstellen" #~ msgid "Add specified amount (reward)" #~ msgstr "Die angegebene Anzahl hinzufügen (Belohnung)" #~ msgid "Subtract specified amount (penalty)" #~ msgstr "Die angegebene Anzahl abziehen (Strafe)" #~ msgid "Set exacly specified limit" #~ msgstr "Exaktes Limit setzen" #~ msgid "" #~ "Select whether time for inactive sessions are counted. If this is " #~ "unchecked, time spent in console (not terminal) and while screen is " #~ "locked is NOT taken into account (this very much varies from DE to DE)" #~ msgstr "" #~ "Nutzungszeit mit gesperrtem Bildschirm oder ohne aktives Fenster " #~ "(sogenannte console) wird nicht mitgezählt (abhängig von gewählter " #~ "Desktopumgebung). Ist das Häkchen gesetzt, zählt alles vom Einloggen bis " #~ "zum Ausloggen als Nutzungszeit" #~ msgid "" #~ "Lists day of the week and additional information about the day's limit, " #~ "please enable / disable days for the user" #~ msgstr "Verwaltung von gesamten Nutzungstagen pro Woche für den Benutzer" #~ msgid "Specify day's limit" #~ msgstr "Tages-Limits festlegen" #~ msgid "Set the amount of hours to limit available time for particular day" #~ msgstr "Festlegen von Nutzungszeit in Stunden für einen bestimmten Tag" #~ msgid "" #~ "Set specified hours and minutes for particular day at user's disposal (do " #~ "not forget to hit the button)" #~ msgstr "" #~ "Festlegen von Nutzungszeit in Stunden und Minuten für einen bestimmten " #~ "Tag, die dem Benutzer zur Verfügung stehen soll (muss noch mit dem " #~ "-Button bestätigt werden)" #~ msgid "" #~ "Hour intervals per day available to user.\n" #~ "Please note that if day ends at 24th hour and next day starts at 0, user " #~ "can work continuously past midnight.\n" #~ "Please note that multiple intervals cannot be configured within the same " #~ "hour. An interval can start or end or contain a specific hour, but not " #~ "more than once (this is by design, not a bug)" #~ msgstr "" #~ "Stunden-Intervalle pro Tag mit möglicher Nutzungszeit für den Benutzer.\n" #~ "Hinweis: Wenn ein Tag mit der 24. Stunde endet und der nächste Tag mit 0 " #~ "beginnt, besteht die Nutzungszeit für den Benutzer über Mitternacht " #~ "hinaus.\n" #~ "Hinweis: Innerhalb einer Stunde kann nur ein Intervall, nicht mehrere, " #~ "konfiguriert werden. Start und Ende dürfen innerhalb einer Stunde liegen " #~ "(aber eben nur einmal)" #~ msgid "" #~ "Remove selected interval from the list (do not forget to hit the " #~ "button)" #~ msgstr "" #~ "Gewählten Intervall von der Liste entfernen (muss noch mit dem -" #~ "Button bestätigt werden)" #~ msgid "" #~ "Add specified hour interval to the list (do not forget to hit th e " #~ "button)" #~ msgstr "" #~ "Festgelegten Intervall zur Liste hinzufügen (muss noch mit dem -" #~ "Button bestätigt werden)" #~ msgid "Specify END hour of the allowed hour interval" #~ msgstr "Festlegen der letzten Stunde des erlaubten Stunden-Intervalls" #~ msgid "Specify END minute of the allowed hour interval" #~ msgstr "Festlegen der letzten Minute des erlaubten Stunden-Intervalls" #~ msgid "Week limit amount (days part)" #~ msgstr "Wöchentliches Zeit-Limit (Tage)" #~ msgid "Week limit amount (hours part)" #~ msgstr "Wöchentliches Zeit-Limit (Stunden-Anteil)" #~ msgid "Week limit amount (minutes part)" #~ msgstr "Wöchentliches Zeit-Limit (Minuten-Anteil)" #~ msgid "Month limit amount (days part)" #~ msgstr "Monatliches Zeit-Limit (Tage)" #~ msgid "Month limit amount (hours part)" #~ msgstr "Monatliches Zeit-Limit (Stunden-Anteil)" #~ msgid "Month limit amount (minutes part)" #~ msgstr "Monatliches Zeit-Limit (Minuten-Anteil)" #~ msgid "This allows You to set up weekly & monthly limits" #~ msgstr "" #~ "Hier können wöchentliche und monatliche Zeit-Limits eingestellt werden" #~ msgid "" #~ "Timekpr-nExT log level. Please do not change this unless asked (you " #~ "likely won't find anything pretty in the log files)\n" #~ "1 - standard, 2 - debug, 3 - extra debug" #~ msgstr "" #~ "Timekpr-nExT log level, bitte nur ändern falls dazu aufgeforder (Sie " #~ "werden wahrscheinlich nichts brauchbares in den Logdateien finden)\n" #~ "1 - standard, 2 - debug, 3 - extra debug" #~ msgid "" #~ "Specify session polling time granularity (at which interval user sessions " #~ "and activity are polled).\n" #~ "3 -5 seconds are optimal, don't change this if unsure." #~ msgstr "" #~ "Festlegen, in welchen Abständen die Nutzungszeit überprüft werden soll " #~ "(Kontrollhäufigkeit für Sitzung und Aktivität).\n" #~ "3-5 Sekunden sind optimal, im Zweifel den Wert unverändert lassen." #~ msgid "This specifies the time interval at which actual user state is saved" #~ msgstr "" #~ "Hier wird der Zeit-Intervall, in dem der User-Status gespeicher wird, " #~ "gestgelegt" #~ msgid "" #~ "Amount of seconds before terminating user sessions. After this is " #~ "reached, user will be terminated, nothing can be done to prevent it.\n" #~ "Adding time does not help in this case. Do that before reaching this " #~ "point..." #~ msgstr "" #~ "Sekunden bevor das Beenden einer Benutzer-Sitzung beginnt. Der Prozess " #~ "des Beendens einer Benutzer-Sitzung kann nicht mehr aufgehalten werden.\n" #~ "Es hilft nichts, während der einzelnen Schritte des Beendigungs-Prozesses " #~ "noch erlaubte Nutzungszeit hinzuzufügen - das sollte vorher gemacht " #~ "werden ..." #~ msgid "Add excluded session type to the list" #~ msgstr "Sitzungs-Typ, der nicht überwacht werden soll, zur Liste hinzufügen" #~ msgid "Remove excluded session type from the list" #~ msgstr "" #~ "Sitzungs-Typ, der nicht überwacht werden soll, von der Liste entfernen" #~ msgid "" #~ "List of users excluded from tracking.\n" #~ "Please specify actual usernames, not real names here (e.g please specify " #~ "jsmith, not John Smith)" #~ msgstr "" #~ "Liste der Benutzer, deren Nutzungszeit nicht überwacht werden soll.\n" #~ "Bitte die vom System verwendeten Benutzernamen statt Vorname/Nachname " #~ "eingeben (bspw. mmustermann statt Max Mustermann)" #~ msgid "Add user to the exclusion list" #~ msgstr "Benutzer zur Ausschluss-Liste hinzufügen" #~ msgid "Remove user from the exclusion list" #~ msgstr "Benutzer von der Ausschluss-Liste entfernen" #~ msgid "Continous time left:" #~ msgstr "Verbleibende Zeit ohne Unterbrechung:" #~ msgid "This shows time intervals that are available for Your use" #~ msgstr "Zeit-Intervalle innerhalb Ihrer erlaubten Nutzungszeit" #~ msgid "TIme spent for this week" #~ msgstr "Verbrauchte Nutzungszeit in dieser Woche" #~ msgid "Time spent for this month" #~ msgstr "Verbrauchte Nutzungszeit in diesem Monat" #~ msgid "Time limit for week available to You" #~ msgstr "Ihnen erlaubte Nutzungszeit in dieser Woche" #~ msgid "Time limit for month available to You" #~ msgstr "Ihnen erlaubte Nutzungszeit in diesem Monat" #~ msgid "" #~ "This sets logging level (please do not change this unless You know what " #~ "You're doing)" #~ msgstr "" #~ "Stufen für die Ausführlichkeit des Logs (Bitten nicht ändern außer Sie " #~ "wissen genau was sie damit verändern)" #~ msgid "" #~ "Specify whether to show notification when limit configurations or " #~ "allowance changes" #~ msgstr "" #~ "Sollen Änderungen an Limits oder der erlaubten Nutzungszeiten angezeigt " #~ "werden" #~ msgid "" #~ "Specify whether to show seconds in notification area (some DE, like KDE5, " #~ "do not support text besides notification icons)" #~ msgstr "" #~ "Sollen Zeitangaben in Benachrichtigungen auch die Sekunden enthalten " #~ "(manche Desktopumgebungen, bspw. KDE5, haben keine Unterstützung für Text " #~ "bei Benachrichtigungs-Icons)" #, python-format #~ msgid "" #~ "Feature \"%%s\", which is used to detect idle time, can not be enabled!\n" #~ "Idle / inactive time might not be accounted when screen is locked!" #~ msgstr "" #~ "Die Funktion \"%%s\", mit der die Leerlaufzeit erkannt wird, kann nicht " #~ "aktiviert werden!\n" #~ "Leerlauf- / Inaktivitätszeit wird möglicherweise nicht berücksichtigt, " #~ "wenn der Bildschirm gesperrt ist!" #~ msgid "Hide tray icon is not passed" #~ msgstr "Das Symbol zum Ausblenden des Fachs wird nicht übergeben" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct" #~ msgstr "Das Symbol zum Ausblenden des Fachs \"%%s\" ist nicht korrekt" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct and can not be set" #~ msgstr "" #~ "Das Symbol zum Ausblenden des Fachs \"%%s\" ist nicht korrekt und kann " #~ "nicht festgelegt werden" #, python-format #~ msgid "User's \"%%s\" hide tray icon flag is not correct and can not be set" #~ msgstr "" #~ "Das Flag \"%%s\" des Benutzers zum Ausblenden des Taskleistensymbols ist " #~ "nicht korrekt und kann nicht festgelegt werden" #~ msgid "" #~ "Continuous time left to user which may span to more than a current day " #~ "(realtime, available when user is logged in)" #~ msgstr "" #~ "Dem Benutzer verbleibende Zeit, die mehr als einen aktuellen Tag umfassen " #~ "kann (Echtzeit, verfügbar, wenn der Benutzer angemeldet ist)" #~ msgid "" #~ "Select whether to show padlock icon and notifications to user.\n" #~ "Please note that this will disable showing all information and " #~ "notifications to the user!" #~ msgstr "" #~ "Wählen Sie aus, ob das Vorhängeschlosssymbol und Benachrichtigungen für " #~ "den Benutzer angezeigt werden sollen.\n" #~ "Bitte beachten Sie, dass dadurch die Anzeige aller Informationen und " #~ "Benachrichtigungen für den Benutzer deaktiviert wird!" #~ msgid "Continous time left to You which may span to more than a current day" #~ msgstr "" #~ "Ab jetzt noch ohne Unterbrechung bestehende Nutzungszeit - diese kann " #~ "auch über den momentanen Tag hinausgehen" #~ msgid "" #~ "Select whether to use speech notifications (if not available, this will " #~ "be greyed out). If usage of speech is very much needed, please install " #~ "python3-espeak package" #~ msgstr "" #~ "Festlegen, ob Sprach-Hinweise gegeben werden (ausgegraut, falls nicht " #~ "verfügbar). Für Verfügbarkeit muss das Paket python3-espeak installiert " #~ "sein" timekpr-next/resource/locale/lv/000775 001750 001750 00000000000 13476006650 020713 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/lv/LC_MESSAGES/000775 001750 001750 00000000000 14017261747 022502 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/locale/lv/LC_MESSAGES/timekpr.mo000664 001750 001750 00000220123 14017261747 024512 0ustar00bezvfedubezvfedu000000 000000  Q$$ %$'%<L%*%%0%H%C&Q[&&K'5'* (7(+))%*$*u*]X+9+N+D?,8,,,K,"-L>- -(-u-3K.*..$././ 4/U/g/z/+//12)22 3*"3M3<j3333'3434)F4Yp4/4.40)50Z5259555.6?6.]6 66~9&=A= Y= c=@q=e=>.>#L>%p>*><>*>)?8??#?@@8@+K@ w@@,@ @@iAs BGBB!aC/CsC'EAEREZEuEFFF%F*G<9G!vG3G GGGH,H>H%I',I9TI I*I#IIJ* JKJZJ\sL LL M MMsTN N NN#N1 ORO(cO)O OOOOOPP*wMwawtw wwwDw*w))xSxhx|xxxx3x@yDy2Yy.yy y)yz"zBz^z)rz'zzy{"{{#{{B{#;|5_|*||||}}M-}R{}I}N~Hg~S~"'%@$f$' NA`M4?Ft3-?,]0B/:.2iD1A<U+=*$'6L#/'ׅ/A/.q-?Ά,6;Hr5.& 8G6/A.),X>+ĉ 5KScjx64M;(G3f;<֐8LNcv~Gȑ ˑ ّ")9Kev7 = JVW]+.ܗ+ 7G= J^"T̙!~ȚFGEԛ؜ȝ3f4{ϞeK:HD59zɠ#P|t7.)X,#/=+m<֣"!18E~?ܧ>.3b?~!?% ?F8ةAU:?@Ъ@ARAN֫E% k!y.ʬ٬ "/o>#m'.%#22=eL!U w#,Է 8Ne:E#,<5r St ${@X'r%4-<#/`q-<&/>L(2)#78pK(~ m !.!HCj<< <Gfm60 :_.r=* '0O!h 16XBJSJi@g]]AG(Vp@3B<,#%!(C@&YP7V0k*9# ),6V, 5*.Y/b/"/&D5k# E,R$&Lr\/!(&Jq+:'29F:0>CC?86T7?96 l_'v+^aMgT V%|X6>?+Ie!Xh"YPS n'{!)# &-*T).,C+,oE/$7WoXa[ZU\ Vi(269p1D!.>fmueJ?NA?@OB>UI=R Mo \ L Ug 9 6 E. 8t 7 F 9, 4f , = L <S A P C#:gI9F&0m?RA1Ps@9H?87 #Bxr/xlS.m@@V@uE3 6DUW[*_# fc\qKp$Bg';wo2t#\c 2GL~uD"{1x+Zt.E9Xsi a'_&K aS?0%R5 POkMC!bIgnIl8MR<_eY!Ti T>NrEf/J(97`36Q +sYN*y`|=SzA4VF#U }mAG/WrWnzm|4)]h [L*]BQ(j<^Z ;X5H137k,0vbf: H{"O?CdF=8~U6j->,DJ[$lq ):dw%}@Vou.ve @x^h&Py-p%(n)s minute%(n)s minutes%(n)s second%(n)s seconds%(n)s second left%(n)s seconds left%(n)s second of PlayTime left%(n)s seconds of PlayTime left%(n)s user in total:%(n)s users in total:---=== NOTICE ===---==> get saved user list from the server, example==> get user configuration and time information from the server, example==> print help, example==> set PlayTime activity process masks, for which the time is accounted, example==> set PlayTime left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set PlayTime limits for all allowed days, the number of values must not exceed the allowed PlayTime allowed days for the user, example==> set allowed days for PlayTime activities, example==> set allowed days for the user, example==> set allowed hours for the specified day, or "ALL" for every day, optionally specify start and end minutes in brackets like this [x-y], additionally specify ! in front of hour if it doesn't have to be accounted (free time for user), example==> set restriction / lockout type ("lock" - lock session, "suspend" - suspend the computer, "suspendwake" - suspend and wake up, "terminate" - terminate sessions, "shutdown" - shutdown the computer), examples==> set time left for the user at the current moment of time: "+" (add time), "-" (subtract time), "=" (set exact time available), example (add one hour)==> set time limit per month, example==> set time limit per week, example==> set time limits for all allowed days, the number of values must not exceed the allowed days for the user, example==> set whether PlayTime activities are allowed during unaccounted ("∞") intervals, example==> set whether PlayTime is enabled for the user, example==> set whether PlayTime must be accounted instead of normal activity, example==> set whether to hide tray icon and prevent notifications, example==> set whether to track inactive user sessions, exampleAboutAbout Timekpr-nExTActive PlayTime activity count (realtime, available when user is logged in)Activity / application listActual PlayTime available today (realtime, available when user is logged in)Add a user to the exclusion listAdd an excluded session type to the listAdd new PlayTime activity. Please specify activity mask and user friendly description in the activity list directly.Add new PlayTime notification threshold to the listAdd new notification threshold to the listAdd specified time (reward)Add tracked session type to the listAdditional PlayTime for user has been processedAdditional configurationAdditional configuration optionsAdditional limitsAdditional optionsAdditional statisticsAdditional time for user has been processedAllow PlayTime activities during unaccounted ("∞") time intervals for selected user. This setting allows the user to use applications configured in his PlayTime activity list during time intervals which are marked as unaccounted ("∞"). If this setting is enabled, the use of activities will not be accounted towards PlayTime limits, otherwise applications in PlayTime activity list will be terminated as soon as they are started during unaccounted ("∞") time intervals.Allow activities during unaccounted ("∞") time intervals. This setting allows to use applications listed in "Activity / application list" during time intervals which are marked as unaccounted ("∞"), if the setting is not enabled, none of activities are allowed to run!Allowance adjustmentsAllowed days for user have been processedAllowed during "∞" intervals:Allowed during "∞":Allowed hours for user have been processedApply PlayTime configurationApply PlayTime limits and configuration changes on this pageApply Timekpr-nExT settingsApply additional configuration changes on this pageApply all Timekpr-nExT settings at onceApply configurationApply daily limitsApply limit all changes made in this pageBrief information about time spent and everything related to time management for this dayChoose days to be adjusted for selected period.Choose hours to be adjusted for selected days.Choose hours to be adjusted for selected period.Choose minutes to be adjusted for selected days.Choose minutes to be adjusted for selected period.Choose this to adjust user's PlayTime allowance for todayChoose this to adjust user's time allowance for todayClose the windowCommand FAILED: access deniedCommand FAILED: communication was not acceptedConfigurationConfiguration for personalized notifications about available PlayTime. Please configure notifications as you see fit. The configuration "Time" value indicates a value of PlayTime left when notification will be shown, the "Importance" option governs an icon colour and notification properties as follows. Information - a green icon and an informational notification will be shown Warning - a yellow icon and an informational notification will be shown Severe - a red icon and important notification will be shown Critical - a red icon and critical notification will be shown, this notification usually is shown over all open applications and stays open until dismissed, however this behaviour highly depends on Desktop Environment in useConfiguration for personalized notifications about available time. Please configure notifications as you see fit. However, please keep in mind that there will be two types of notifications that cannot be personalized: a final warning some time before time ends and a countdown notifications when time is about to end. The configuration "Time" value indicates a value of time left when notification will be shown, the "Importance" option governs an icon colour and notification properties as follows. Information - a green icon and an informational notification will be shown Warning - a yellow icon and an informational notification will be shown Severe - a red icon and important notification will be shown Critical - a red icon and critical notification will be shown, this notification usually is shown over all open applications and stays open until dismissed, however this behaviour highly depends on Desktop Environment in useConfiguration for user %s:Configuration retrievedConnectedConnecting...Continuous time left to you. May span more than the current day.Continuous time left. May span more than the current day (realtime, available when user is logged in)Continuous time left:Control Timekpr-nExT SettingsControl Timekpr-nExT tracking itemsControl sessions types are not passedControl sessions types list is not correctControl sessions types list is not correct and cannot be setCopyright (c) 2018-2021 Eduards BezverhijsCountdown timeCreate a new time interval that will be available to the user. After creating the interval, please edit its start and end times directly in interval list.CriticalCritical notification timeout (sec)Current PlayTime statisticsCurrent effective usernameCurrent statisticsDaily limit configuration for all week daysDaily limitsDayDay time limits for user have been processedDays & LimitsDecrease daily PlayTime allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Decrease daily time allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Decrease weekly or monthly time allowance by selected time unit (days or hours or minutes) for the selected period.Delete the selected time interval from the available list of intervals.Eduards Bezverhijs (Translations fine-tuning by JP Lord ) (English fine-tuning by Phil Hudson )Enable PlayTime for selected userEnable PlayTime for the user has been processedEnable PlayTime override for selected user. This setting overrides time accounting in a way that time is accounted only when at least one of the applications on the PlayTime activity list are running! This affects only time accounting, intervals are still fully enforced! If no processes are running, time is accounted as idle thus effectively it's free time for user!Enable PlayTime override:Enable PlayTime:EnabledEnhanced activity monitor:Enter end hour for the automatic wakeup function. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Enter start hour for the automatic wakeup function. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Excluded SessionsExcluded UsersExcluded session types are not passedExcluded session types list is not correctExcluded session types list is not correct and cannot be setExcluded user list is not correctExcluded user list is not correct and cannot be setExcluded user list is not passedFailed to connectFeature "%%s", which is used to detect idle time, cannot be enabled! Idle / inactive time might not be accounted when screen is locked!Final notificationFinal notification time "%%s" is not correctFinal notification time "%%s" is not correct and cannot be setFinal notification time is not passedFinal warning time "%%s" is not correctFinal warning time "%%s" is not correct and cannot be setFinal warning time is not passedFormat: Format: FromHide icon and notifications:Hide tray icon for user has been processedHour intervalsHour intervals for selected day available to the user. Option "∞" indicates that time spent during this interval will not be accounted towards the daily limit, it will be accounted as idle instead. Please note that if the day's limit ends at 24:00 and the next day's limit starts at 00:00, then the user can work continuously past midnight. Please note that multiple intervals cannot be configured within the same hour. An interval can start or end or contain a specific hour, but not more than once. This is by design, not a bug. How long the user was inactive since last login (realtime, available when user is logged in)Icon initialization error (%%s)!Icon, isn't it?ImportanceIncrease daily PlayTime allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Increase daily time allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment!Increase weekly or monthly time allowance by selected time unit (days or hours or minutes) for the selected period.Info & TodayInformationInformation about PlayTimeInformation about time left / spentInternal connection error, please check log filesInterval removedInterval start cannot be the same as endInterval's start cannot be later than endIntervalsKeep control of computer usageLimitLimit configurationLimits & ConfigurationList of session types to be tracked. Please, do not change or experiment with this unless you actually (not wishfully) know what you are doing.List of sessions to be excluded from tracking. Please, do not change or experiment with this unless you actually (not wishfully) know what you are doing.List of usernames registered on the systemList of users excluded from tracking. Please specify actual usernames, not real names here. For example, "jsmith", not "John Smith".Lists day of the week and additional information about the day's PlayTime limit. Please enable / disable days for the user and set time allowance for PlayTime activities.Lists day of the week and additional information about the day's limit. Please enable / disable days for the user.Log levelLog level "%%s" is not correctLog level "%%s" is not correct and cannot be setLog level is not passedLogging levelMonthlyNotes, read carefully ;)Notification configurationNotification timeout (sec)NotificationsNumber of currently active PlayTime activitiesNumber of seconds left for user before enforcing a configured restriction / lockout to his sessions. After this is reached and user is still active, the user's sessions will be handled according to specified restriction / lockout, and almost nothing can be done to prevent it.Number of seconds left for user's available time before sending a final critical notification that time is about to run out. NOTE: the rest of the notification times are configurable per user by user in client application!PARAMETER PARSE ERROR (please check parameter validity): %%sPeriodPlayTimePlayTime activitiesPlayTime activities for user have been processedPlayTime allowed days for user have been processedPlayTime allowed during unaccounted intervals flag for the user has been processedPlayTime available today (saved stated, not real-time)PlayTime configurationPlayTime day limits for user have been processedPlayTime enabled:PlayTime enhanced activity monitor flag "%%s" is not correctPlayTime enhanced activity monitor flag "%%s" is not correct and cannot be setPlayTime enhanced activity monitor flag is not passedPlayTime flag "%%s" is not correctPlayTime flag "%%s" is not correct and cannot be setPlayTime flag is not passedPlayTime left (actual):PlayTime left (today):PlayTime limitsPlayTime notification configurationPlayTime optionsPlayTime override flag for the user has been processedPlayTime spent (today):PlayTime spent today (saved stated, not real-time)Please reopen the application if you are superuser and Timekpr-nExT is runningPlease select a day to set the limitsPlease select an hour interval to removePlease specify a list of full process (executable) names without path as case sensitive strings to be monitored in the system. It's possible to specify RegExp masks for processes too, but please be very careful about them as misusing this setting may lead to killing unwanted processes for the user! NOTE: RegExp is an expert setting!Poll intervalPoll time "%%s" is not correctPoll time "%%s" is not correct and cannot be setPoll time is not passedProcess descriptionProcess maskRemove PlayTime notification threshold from the listRemove a user from the exclusion listRemove an excluded session type from the listRemove excluded session typeRemove notification threshold from the listRemove selected entry from PlayTime activities.Remove tracked session type from the listRestoreRestore configuration from saved stateRestriction / lockout type for user has been processedRestriction / lockout type:Running activities (actual):Running activities:Save all changesSave timeSave time "%%s" is not correctSave time "%%s" is not correct and cannot be setSave time is not passedSelect a restriction / lockout type for the user. NOTE: please be very careful, think ahead and read every options description when changing this setting from default value!Select a time interval when computer can be woken up automatically. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI!Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments.Select whether to show Timekpr-next's padlock icon and notifications to the user. Please note that unchecking this will disable showing all information and notifications to the user!Select whether to use sound "bell" (short notification sound) to announce a new notification from Timekpr-nExT. This works only for enabled notifications. If this setting is not editable, your environment does not advertise sound notification support.Select whether to use speech notifications, if available. You may be able to make speech notifications available by installing package "python3-espeak".Session polling time granularity which specifies how often user sessions and activity are checked and accounted. 3 - 5 seconds are optimal, don't change this if unsure.Session typeSet this specific time limitSettings for PlayTime activitiesSevereShow all notificationsShow limit changesShow seconds in notification areaSpecify the time in seconds when Timekpr-nExT starts continuous real-time countdown before enforcing a restriction / lockout to user's sessions.Specify whether to show a notification when limit configurations or allowance changesSpecify whether to show all notifications. If unchecked, then only important ones are shown.Specify whether to show seconds in notification area. Some desktop environments, like KDE5, do not support text besides notification icons.StartedStatus of Timekpr-nExT admin clientStatus of Timekpr-nExT clientSubtract specified time (penalty)Termination timeTermination time "%%s" is not correctTermination time "%%s" is not correct and cannot be setTermination time is not passedThat interval overlaps with an existing oneThat interval's end conflicts with an existing oneThat interval's start conflicts with an existing oneThat interval's start or end duplicates an existing oneThe command is incorrect:The number of hours to be adjusted for today's limitThe number of minutes to be adjusted for today's limitThe usage of Timekpr-nExT admin client is as follows:There is a problem communicating to Timekpr-nExT (%%s)!There is a problem connecting to Timekpr-nExT daemon (%%s)!These are days and limits that available to you as part of PlayTime activity restrictionsThese are the days and limits that are available to youThis is the configuration app for Timekpr-nExT. It allows you to set time limits for your individual users as well as general Timekpr-nExT options. To use this application, you either have to execute it as superuser or have to be part of the timekpr group. Please note that the "Timekpr-nExT Configuration" is available in superuser (administrator) mode only! Please configure carefully: do not lock yourself out!This lets you configure PlayTime limits.This lets you configure time limits.This option overrides the default time accounting. If it's checked, the time is accounted only when activities in "Activity / application list" are running, the rest of the time is considered idle.This sets how long a notification is shown for "Critical" notifications about time left (when the icon turns red). The value is specified in seconds. A value of 0 means show until dismissed. Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification.This sets how long a notification is shown for regular notifications about time left and configuration changes. The value is specified in seconds. A value of 0 means show until dismissed (not recommended for regular notifications). Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification.This sets the logging level. Please do not change this unless you know what you're doing.This setting controls whether PlayTime activity monitor will use process command line, including arguments, for monitoring processes (by default only uses the process name). When this setting is enabled Timekpr-nExT will perform a match against full command line up to 512 characters enabling enhanced process monitoring capabilities. Please be careful and double check your RegExp patterns in each individual user's PlayTime activity masks!This setting controls whether PlayTime functionality is enabled. This is a PlayTime master switch, if it's turned off, it's turned off for everyone regardless of individual settings!This shows activities / applications which are part of PlayTime restrictionsThis shows the time intervals that are available for use. Option "∞" indicates that time spent during this interval will not be accounted towards the daily limit, it will be accounted as idle instead.This specifies the rate in seconds at which actual user state is saved to disk. To improve performance and still have great accuracy, Timekpr-nExT accounts time in memory at "Poll interval" frequency, this setting defines a frequency at which user state is saved to disk for permanent storage.TimeTime allowance has changed, please note new time left!Time available today (saved stated, not real-time)Time inactive (actual):Time inactive this session or after Timekpr-nExT has been restartedTime inactive:Time left (actual):Time left (today):Time left today:Time left...Time limit (month):Time limit (week):Time limit configuration has changed, please note new configuration!Time limit for this month available to youTime limit for this week available to youTime limit override:Time spent (month):Time spent (session):Time spent (today):Time spent (week):Time spent this monthTime spent this month (saved stated, not real-time)Time spent this session or after Timekpr-nExT has been restartedTime spent this weekTime spent this week (saved stated, not real-time)Time spent today (saved stated, not real-time)Time spent today:Timekpr-nExTTimekpr-nExT Administration ConfigurationTimekpr-nExT ConfigurationTimekpr-nExT PlayTime notificationTimekpr-nExT administrationTimekpr-nExT clientTimekpr-nExT configuration has been savedTimekpr-nExT interface is not yet readyTimekpr-nExT log level. Please do not change this unless you have to. You likely won't find anything pretty in the log files. Values are: 1 - standard, 2 - debug, 3 - extra debugTimekpr-nExT notificationTimekpr-nExT related configurationToTotal PlayTime available left todayTotal PlayTime spent todayTotal time available left today in a row, up to the end of the dayTrack inactive "%%s" is not correctTrack inactive "%%s" is not correct and cannot be setTrack inactive for user has been processedTrack inactive is not passedTrack inactive sessions:Track inactive:Tracked SessionsUNEXPECTED ERROR: %%sUnexpected ERROR getting configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR getting user configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR getting user list. Please inspect Timekpr-nExT log filesUnexpected ERROR updating configuration. Please inspect Timekpr-nExT log filesUnexpected ERROR updating control. Please inspect Timekpr-nExT log filesUnexpected ERROR while loading configuration. Please inspect Timekpr-nExT log filesUse sound "bell" for notificationsUse speech notificationsUser "%%s" configuration is not foundUser "%%s" control file is not foundUser "%%s" is not foundUser ConfigurationUser PlayTime limits have been savedUser additional options have been savedUser configuration retrievedUser time limits have been savedUser's "%%s" PlayTime allowed during unaccounted intervals flag is not correctUser's "%%s" PlayTime allowed during unaccounted intervals flag is not correct and cannot be setUser's "%%s" PlayTime allowed during unaccounted intervals flag is not passedUser's "%%s" PlayTime day limits list is not correctUser's "%%s" PlayTime day limits list is not correct and cannot be setUser's "%%s" PlayTime day limits list is not passedUser's "%%s" PlayTime day list is not correctUser's "%%s" PlayTime day list is not correct and cannot be setUser's "%%s" PlayTime day list is not passedUser's "%%s" PlayTime enable flag is not correctUser's "%%s" PlayTime enable flag is not correct and cannot be setUser's "%%s" PlayTime enable flag is not passedUser's "%%s" PlayTime operation can be one of these: - + =User's "%%s" PlayTime override flag is not correctUser's "%%s" PlayTime override flag is not correct and cannot be setUser's "%%s" PlayTime override flag is not passedUser's "%%s" PlayTime time limit is not correct and cannot be setUser's "%%s" allowed hours are not correct and cannot be setUser's "%%s" day limits list is not correctUser's "%%s" day limits list is not correct and cannot be setUser's "%%s" day limits list is not passedUser's "%%s" day list is not correctUser's "%%s" day list is not correct and cannot be setUser's "%%s" day list is not passedUser's "%%s" day number must be between 1 and 7User's "%%s" day number must be presentUser's "%%s" hide tray icon flag is not correctUser's "%%s" hide tray icon flag is not correct and cannot be setUser's "%%s" hide tray icon flag is not passedUser's "%%s" monthly allowance is not correctUser's "%%s" monthly allowance is not correct and cannot be setUser's "%%s" monthly allowance is not passedUser's "%%s" restriction / lockout type is not correctUser's "%%s" restriction / lockout type is not correct and cannot be setUser's "%%s" restriction / lockout type is not passedUser's "%%s" set PlayTime limit is not correctUser's "%%s" time limit is not correctUser's "%%s" time limit is not correct and cannot be setUser's "%%s" time operation can be one of these: - + =User's "%%s" track inactive flag is not correctUser's "%%s" track inactive flag is not correct and cannot be setUser's "%%s" track inactive flag is not passedUser's "%%s" weekly allowance is not correctUser's "%%s" weekly allowance is not correct and cannot be setUser's "%%s" weekly allowance is not passedUsernameUsername:Users related configurationVerify configured time intervals. This is a mandatory step to ensure that intervals are correct. Intervals which have problems will be highlighted.WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, but no displays are available, thus running in CLI...Wakeup hour interval:WarningWeek day limitsWeeklyWeekly and monthly limitsWeekly and monthly limits for the user. These limits are applied to user together with the rest of limit configuration.Weekly and monthly limits for user have been processedWhen time ends, computer screen will be locked. This option is not a restriction and is more suited for self control purposes.When time ends, computer will be shut down. This option is a restriction! Please evaluate whether you need this type of restriction!When time ends, computer will be suspended (put to sleep) and will be woken up at start of next available time interval for the user. This option is not a restriction and is more suited for self control purposes. When woken up when there is still no time left, computer screen will be locked and put to sleep again after some time.When time ends, computer will be suspended (put to sleep). This option is not a restriction and is more suited for self control purposes. When woken up when there is still no time left, computer screen will be locked and put to sleep again after some time.When time ends, user sessions will be terminated. This option is a restriction! This is the default option and most likely is the one you need!You have %(n)s hourYou have %(n)s hoursYour time is not limited todayYour time is up, you will be forcibly logged out inYour time is up, your computer will be forcibly shutdown inYour time is up, your computer will be forcibly suspended inYour time is up, your session will be forcibly locked indenter hour intervalsexecutable mask...from...hhours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)hrimportance...lock screenmminn/anumeric time values are in secondsprocess description...session type...shutdown computersuspend / wakeup computersuspend computerterminate sessionstime...timekpr-nextThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . In Debian, see file /usr/share/common-licenses/GPL-3to...today's timeusername...verifyweekdays are numbered according to ISO 8601 (i.e. Monday is the first day, format: 1-7)Project-Id-Version: Timekpr nExT PO-Revision-Date: 2021-03-01 22:19+0200 Last-Translator: Eduards Bezverhijs Language-Team: Eduards Bezverhijs Language: lv_LV MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2019-04-28 19:13+0000 X-Generator: Poedit 2.4.1 Plural-Forms: nplurals=3; plural=(n%10==0 || (n%100>=11 && n%100<=19) ? 0 : n%10==1 && n%100!=11 ? 1 : 2); X-Poedit-SourceCharset: UTF-8 X-Poedit-KeywordsList: __:1,2 %(n)s minūtes%(n)s minūte%(n)s minūtes%(n)s sekundēm%(n)s sekundes%(n)s sekundēm%(n)s sekundes%(n)s sekunde%(n)s sekundes%(n)s sekundes no atvēlētā PLayTime laika%(n)s sekunde no atvēlētā PLayTime laika%(n)s sekundes no atvēlētā PLayTime laikakopā %(n)s lietotāji:kopā %(n)s lietotājs:kopā %(n)s lietotāji:---=== INFORMĀCIJA ===---==> iegūst faktisko lietotāju sarakstu no servera, piemērs==> iegūst lietotāja konfigurāciju un informāciju no servera, piemērs==> izdrukā palīdzību, piemērs==> uzstāda PlayTime procesu filtrus, kas tiks izmantoti laika uzskaitē, piemēram==> uzstāda PlayTime laika ierobežojumus šodien: "+" (pieliek laiku), "-" (noņem laiku), "=" (uzstāda konkrētu pieejamo laiku), piemērs (pievieno vienu stundu)==> uzstāda PlayTime laika ierobežojumus nedēļas dienām (vērtību skaitam jāsakrīt ar atļauto dienu skaitu), piemērs==> uzstāda pieļaujamo PlayTime dienu sarakstu lietotājam, piemērs==> komanda uzstāda pieļaujamo dienu sarakstu lietotājam, piemērs==> uzstāda pieļaujamos stundu ierobežojumus konkrētajai dienai vai "ALL" visām dienām, norādiet sākuma un beigu minūti iekavās šādi [X-Y], papildus iespējams norādīt ! pirms stundas, kura netiks uzskaitīta (brīvs laiks lietotājam), piemērs==> uzstādīt ierobežojumu veidu ("lock" - aizslēgt darbvirsmu, "suspend" - ievietot guļošā režīmā, "suspendwake" - ievietot guļošā režīmā un pamodināt, "terminate" - izbeigt sesijas, "shutdown" - izslēgt datoru), piemēri==> uzstāda laika ierobežojumus šodien: "+" (pieliek laiku), "-" (noņem laiku), "=" (uzstāda konkrētu pieejamo laiku), piemērs (pievieno vienu stundu)==> uzstāda laika ierobežojumu mēnesim, piemērs==> uzstāda laika ierobežojumu nedēļai, piemērs==> uzstāda laika ierobežojumus visām nedēļas dienām, vērtību skaitam jāsakrīt ar atļauto dienu skaitu, piemērs==> iespējo PlayTime laika uzskaiti arī laika intervālos, kas netiek uzskaitīti ("∞"), piemērs==> iespējo PlayTime laika uzskaiti lietotājam, piemērs==> iespējo PlayTime alternatīvā laika uzskaiti lietotājam, piemērs==> uzstāda slēdzenes un paziņojumu slēpšanas pazīmi, piemērs==> uzstāda neaktīvo sesiju uzskaites pazīmi, piemērsParPar Timekpr-nExTDarbojošos PlayTime aktivitāšu / aplikāciju skaits (tiek aprēķināta reālajā laikā, pieejama tikai, ja lietotājs ir aktīvs)Aktivitāšu / aplikāciju sarakstsKopējais atlikušais PlayTime laiks šodien (tiek aprēķināts reālajā laikā, pieejams tikai, ja lietotājs ir aktīvs)Pievienot lietotāju neuzskaitāmo lietotāju sarakstamPievienot neuzskaitāmo sesiju veidu sarakstamPievienot jaunu PlayTime aktivitāti. Lūdzu norādiet aktivitātes masku / nosaukumu un lietotājam draudzīgu aprakstu pa tiešo tabulā zemāk.Pievienot jaunu PlayTime ziņojumu sarakstamPievienot jaunu ziņojumu sarakstamPalielināt pieļaujamo laika daudzumu (bonuss)Pievienot uzskaitīto sesiju tipu sarakstamPapildus PlayTime laika limits lietotājam tika apstrādātsPapildus konfigurācijaPapildus konfigurācijas iespējasPapildus limitiPapildus limitiPapildus statistikaPapildus laika ierobežojums lietotājam ir apstrādātsŠī pazīme atļauj lietot PlayTime aktivitātes neuzskaitītajos ("∞") intervālos izvēlētajam lietotājam. Lietotājam būs iespēja darbināt aplikācijas, kas reģistrētas tā PlayTime aktivitāšu sarakstā arī intervālos, kas apzīmēti kā neuzskaitītie ("∞"). Ja šī pazīme ir iespējota, lietotāja pavadītais laiks izmantojot PlayTime aktivitātes netiks uzskaitīts, savukārt ja pazīme ir atspējota, aplikācijas, kas reģistrētas un tiek startētas neuzskaitītajos ("∞") intervālos, tiks tiks terminētas.Atļaut lietot aktivitātes neuzskaitītajos ("∞") laika intervālos. Šī pazīme atļauj lietotājam izmantot aplikācijas, kas reģistrētas sadaļā "Aplikāciju / aktivitāšu saraksts" intervālos, kas atzīmēti kā neuzskaitīti ("∞"), ja šī pazīme nav iespējota, neviena no aktivitātēm nav atļauta!Ierobežojumu izmaiņasPapildus dienu laika ierobežojumi lietotājam ir apstrādātiAtļauts neuzskaitītajos ("∞") intervālos:Atļauts "∞" intervālos:Papildus laika stundu ierobežojumi lietotājam ir apstrādātiIespējot PlayTime ierobežojumusIespējot PlayTime konfigurācijas iespēju maiņu šajā lapāIespējot Timekpr-nExT uzstādījumusIespējot papildus konfigurācijas iespēju maiņu šajā lapāIespējot visus Timekpr-nExT uzstādījumus vienlaicīgiIespējot konfigurācijuIespējot dienas ierobežojumusIespējot visas ierobežojumu izmaiņas, kas veiktas šajā lapāVispārīga informācija par laika izlietojumu un laika ierobežojumiem par šo dienuIzvēloties dienas, tās tiks mainītas izvēlētajam periodam.Izvēloties stundas, tās tiks mainītas izvēlētajām dienām.Izvēloties stundas, tās tiks mainītas izvēlētajam periodam.Izvēloties minūtes, tās tiks mainītas izvēlētajām dienām.Izvēloties minūtes, tās tiks mainītas izvēlētajam periodam.Izvēlieties šo opciju, lai mainītu pieejamo PlayTime laika limitu šodienaiIzvēlieties šo opciju, lai mainītu pieejamo laika limitu šodienaiAizvērt loguKomanda NEIZDEVĀS: pieeja liegtaKomanda NEIZDEVĀS: komunikācija nav atļautaKonfigurācijaPersonalizēta pieejamā PlayTime laika ziņojumu konfigurācija. Lūdzu konfigurē notifikācijas pēc saviem ieskatiem. Vērtība "Laiks" nosaka atlikušo PlayTime laiku, kad paziņojums tiks rādīts, vērtība "Svarīgums" nosaka ikonas krāsu un paziņojuma veidu, paskaidrojumi zemāk. Informācija - tiek rādīta zaļa ikona un informatīvs paziņojums Brīdinājums - tiek rādīta dzeltena ikona un informatīvs paziņojums Svarīgs - tiek rādīta sarkana ikona un svarīgs paziņojums Kritisks - tiek rādīta sarkana ikona un kritisks paziņojums, kurš tipiski tiek atrādīts pa virsu visām atvērtajām aplikācijām un paliek atvērts, kamēr lietotājs to nav noraidījis, bet tomēr šāda paziņojumu uzvedība ir ļoti atkarīga no grafiskās vides, ko lietojatPersonalizēta pieejamā laika ziņojumu konfigurācija. Lūdzu konfigurē notifikācijas pēc saviem ieskatiem. Lūdzu ņemt vērā, ka ir divi paziņojumu veidi, kurus nav iespējams personalizēt: pēdējais brīdinājums, kas tiek rādīts kādu laiku pirms pieejamā laika beigām un laika atskaites paziņojumi, kas tiek rādīti ļoti īsi pirms laika beigām. Vērtība "Laiks" nosaka atlikušo laiku, kad paziņojums tiks rādīts, vērtība "Svarīgums" nosaka ikonas krāsu un paziņojuma veidu, paskaidrojumi zemāk. Informācija - tiek rādīta zaļa ikona un informatīvs paziņojums Brīdinājums - tiek rādīta dzeltena ikona un informatīvs paziņojums Svarīgs - tiek rādīta sarkana ikona un svarīgs paziņojums Kritisks - tiek rādīta sarkana ikona un kritisks paziņojums, kurš tipiski tiek atrādīts pa virsu visām atvērtajām aplikācijām un paliek atvērts, kamēr lietotājs to nav noraidījis, bet tomēr šāda paziņojumu uzvedība ir ļoti atkarīga no grafiskās vides, ko lietojatKonfigurācija lietotājam %s:Konfigurācija iegūtaPieslēdziesPieslēdzas...Vērtība nosaka, cik ilgi varat lietot datoru nepārtraukti, laika izlietojums var pārklāt vairākas dienas.Vērtība nosaka, cik ilgi varat lietot datoru nepārtraukti, laika izlietojums var pārklāt vairākas dienas (tiek aprēķināta reālajā laikā, pieejama tikai, ja lietotājs ir aktīvs)Nepārtrauktā laika ierobežojums:Pārvaldīt Timekpr-nExT konfigurācijuPārvaldīt Timekpr-nExT uzskaitāmos lielumusUzskaitāmo sesiju tipi netika padotiUzskaitāmo sesiju tipi nav korektiUzskaitāmo sesiju tipi nav korekti un uzstādāmiVisas tiesības aizsargātas (c) 2018-2021 Eduards BezverhijsAtskaites laiksPievienot jaunu laika intervālu, kas būs pieejams lietotājam. Pēc intervāla izveides, samainiet to pēc saviem ieskatiem pa tiešo tabulā zemāk.KritisksKritisko paziņojumu ilgums (sek)Patreizējā PlayTime statistikaPatreizējais faktiskais lietotājsPatreizējā statistikaDienas ierobežojums katrai nedēļas dienaiDienas limitiDienaDienas laika ierobežojumi lietotājam tika apstrādātiDiena un ierobežojumiSamazināt PlayTime laika ierobežojumu balstoties uz izvēlēto laika vienību (stundas vai minūtes) izvēlētajam dienām. Lūdzu ņemt vērā, ka iespējams izvēlēties vairāk par vienu dienu vienlaicīgi!Samazināt laika ierobežojumu balstoties uz izvēlēto laika vienību (stundas vai minūtes) izvēlētajam dienām. Lūdzu ņemt vērā, ka iespējams izvēlēties vairāk par vienu dienu vienlaicīgi!Samazināt nedēļas vai mēneša laika ierobežojumu balstoties uz izvēlēto laika vienību (dienas vai stundas vai minūtes) izvēlētajam periodam.Dzēst izvēlēto laika intervālu no iespējamo intervālu saraksta.Eduards Bezverhijs Iespējot PlayTime izvēlētajam lietotājamPapildus PlayTime laika limits lietotājam tika apstrādātsIespējot PlayTime alternatīvā laika uzskaiti izvēlētajam lietotājam. Šī opcija ignorē spēkā esošo laika uzskaiti tā, ka tikai tad, ja darbojas kāda no PlayTime aktivitāšu sarakstā esošā aplikācija, laiks tiek uzskaitīts! Šis slēdzis ietekmē tikai laika patēriņa uzskaiti, laika intervālu kontrole paliek spēkā! Ja nedarbojas neviena no aktivitātēm, laiks tiek uzskatīts kā dīkstāves laiks, kas nozīmē, ka šis ir brīvais laiks lietotājam!Iespējot alternatīvo PlayTime:Iespējot PlayTime:IespējotsUzlabotais aktivitāšu meklētājs:Ievadiet automātiskās pamošanās beigu stundu. Šī opcija darbosies tikai tad, ja sistēmas BIOS / UEFI atbalsta pamošanos pēc RTC (reālā laika pulkstenis) un šī opcija ir iespējota!Ievadiet automātiskās pamošanās sākuma stundu. Šī opcija darbosies tikai tad, ja sistēmas BIOS / UEFI atbalsta pamošanos pēc RTC (reālā laika pulkstenis) un šī opcija ir iespējota!Neuzskaitāmās sesijasNeuzskaitāmie lietotājiNeuzskaitāmo sesiju tipi netika padotiNeuzskaitāmo sesiju tipi nav korektiNeuzskaitāmo sesiju tipi nav korekti un uzstādāmiNeuzskaitāmo lietotāju saraksts nav korektsNeuzskaitāmo lietotāju saraksts nav korekts un uzstādāmsNeuzskaitāmo lietotāju saraksts netika padotsNav iespējams pieslēgtiesPaplašinājumu "%%s", kas tiek izmantots, lai noteiktu vai dators tiek izmantots, nav iespējams ieslēgt! Dīkstāves laiks var netikt uzskaitīts korekti, gadījumos, ja ekrāns tiek bloķēts!Pēdējais brīdinājumsPēdējā paziņojuma laiks "%%s" nav korektsPēdējā paziņojuma laiks "%%s" nav korekts un uzstādāmsPēdējā paziņojuma laiks nav padotsPēdējā brīdinājuma laiks "%%s" nav korektsPēdējā brīdinājuma laiks "%%s" nav korekts un uzstādāmsPēdējā brīdinājuma laiks nav padotsFormāts: Formāts: NoPaslēpt slēdzeni un paziņojumus:Slēdzenes slēpšanas pazīme lietotājam apstrādātaStundu intervāliLaika intervāli, kas pieejami lietotajam. Opcija "∞" norāda, ka laiks, ka patērēts šī intervāla ietvaros, netiks uzskaitīts kā iztērēts, bet gan pieskaitīts dīkstāves laikam. Lūdzu ņemiet vērā, ka ja diena beidzas ar 24 stundu un nākamās dienas 0 stunda ir atļauta, lietotājs bez pārtraukuma var strādāt arī pēc pusnakts. Lūdzu ņemt vērā, ka vienas stundas ietvaros NAV iespējams konfigurēt vairāk par vienu intervālu Tas var sākties šajā stundā, beigties šajā stundā, pilnībā iekļauties stundā, bet ne vairāk par vienu vienā stundā. Vērtība nosaka, cik ilgi lietotājs bijis neaktīvs pēc pēdējās pierakstīšanās datorā (tiek aprēķināta reālajā laikā, pieejama tikai, ja lietotājs ir aktīvs)Ikonas inicializācijas problēma (%%s)!Šī ir ikona, pareizi?SvarīgumsPalielināt PlayTime laika ierobežojumu balstoties uz izvēlēto laika vienību (stundas vai minūtes) izvēlētajam dienām. Lūdzu ņemt vērā, ka iespējams izvēlēties vairāk par vienu dienu vienlaicīgi!Palielināt laika ierobežojumu balstoties uz izvēlēto laika vienību (stundas vai minūtes) izvēlētajam dienām. Lūdzu ņemt vērā, ka iespējams izvēlēties vairāk par vienu dienu vienlaicīgi!Palielināt nedēļas vai mēneša laika ierobežojumu balstoties uz izvēlēto laika vienību (dienas vai stundas vai minūtes) izvēlētajam periodam.Informācijai un šodienaiInformatīvsInformācija par PlayTimeInformāciju par laika patēriņuIekšējā pieslēguma kļūda, lūdzu pārbaudīt žurnāla failusIntervāls noņemtsStundu intervāla sākums nedrīkst būt vienāds ar beigāmStundu intervāla sākums nedrīkst būt vienāds ar beigāmIntervāliKontrolēt datora lietojamībuLimitsLimitu pārvaldībaIerobežojumi un pārvaldībaUzskaitāmo sesiju saraksts. Lūdzu nemainīt vai neeksperimentēt ar šo sarakstu, ja Jums nav pietiekoši zināšanu, lai saprastu ko tas nozīmē.Neuzskatīto sesiju saraksts - sesiju tipi, kurās pavadītais laiks netiek uzskaitīts. Lūdzu nemainīt vai neeksperimentēt ar šo sarakstu, ja Jums nav pietiekoši zināšanu, lai saprastu ko tas nozīmē.Lietotāju saraksts, kuri reģistrēti sistēmāNeuzskaitāmo lietotāju saraksts - lietotājvārdi, kuru datorā pavadītais laiks netiek uzskaitīts. Lūdzu norādīt faktiskos lietotājvārdus nevis vārdus (piem.: lūdzu norādīt gmerkelis, nevis "Garlībs Merķelis")Nedēļas dienu saraksts un papildus informācija par PlayTime ierobežojumiem. Lūdzu iespējot / atspējot dienas konkrētajam lietotājam PlayTime aktivitāšu ierobežošanai.Nedēļas dienu saraksts un papildus informācija par dienas ierobežojumiem. Lūdzu iespējot / atspējot dienas konkrētajam lietotājam.Žurnāla līmenisTehniskā žurnāla līmenis "%%s" nav korektsTehniskā žurnāla līmenis "%%s" nav korekts un uzstādāmsTehniskā žurnāla līmenis netika padotsTehniskā žurnāla līmenisMēnesisPiezīmes, izlasi uzmanīgi ;)Ziņojumu konfigurācijaPārējo paziņojumu ilgums (sek)PaziņojumiŠobrīd darbojošos PlayTime aktivitāšu skaitsLietotājam atlikušo sekunžu skaits pirms pielietot izvēlēto ierobežojumu tā sesijām. Kad šis apjoms tiks sasniegts un lietotājs joprojām būs aktīvs, lietotāja sesijām tiks piemērots tam izvēlētais ierobežojums. Sasniedzot šo punktu, nav iespējams izdarīt gandrīz neko, lai to novērstu.Atlikušais sekunžu skaits lietotāja atvēlētajam laikam pirms sūtīt kritisku paziņojumu par to, ka atvēlētais laiks drīz beigsies. PIEZĪME: detalizēta paziņojumu konfigurācija pieejama lietotājam klienta aplikācijā!PARAMETRU PĀRBAUDES KĻŪDA (lūdzu pārbaudīt, vai parametrs norādīts korekti): %%sPeriodsPlayTimePlayTime aktivitātesPlayTime aktivitāšu / aplikāciju saraksts lietotājam tika apstrādātsPlayTime dienu laika ierobežojumi lietotājam tika apstrādātiPlayTime vērtība, kas pieļauj aktivitātes neuzskaitītajās stundās, lietotājam tika apstrādātaPieejamais PlayTime laiks šodien (saglabātais laiks, netiek aprēķināts reālajā laikā)PlayTime pārvaldībaPlayTime laika ierobežojumi dienai lietotājam tika apstrādātiPlayTime iespējots:PlayTime uzlabotā aktivitāšu meklētāja vērtība "%%s" nav korektaPlayTime uzlabotā aktivitāšu meklētāja vērtība "%%s" nav korekta un uzstādāmaPlayTime uzlabotā aktivitāšu meklētāja vērtība nav padotaPlayTime iespējošanas vērtība "%%s" nav korektaPlayTime iespējošanas vērtība "%%s" nav korekta un uzstādāmaPlayTime iespējošanas vērtība nav padotaAtlikušais PlayTime laiks (kopā):Atlikušais PlayTime laiks (šodien):PlayTime limitiPlayTime ziņojumu konfigurācijaPlayTime konfigurācijaPlayTime alternatīvā laika uzskaite lietotājam tika apstrādātaIzlietotais PlayTime laiks (šodiena):Izlietotais PlayTime laiks šodien (saglabātais laiks, nav faktiskais šībrīža laiks)Atveriet aplikāciju atkārtoti, ja esat administrators un Timekpr-nExT darbojasLūdzu iezīmējiet dienu ierobežojumu uzstādīšanaiLūdzu iezīmējiet stundu intervālu dzēšanaiLūdzu norādīt pilnu procesa (palaidējprogrammas) nosaukumu bez pilna ceļa uz to kā reģistrjutīgu simbolu virkni, kas tiks monitorēta sistēmā. Nosaukumam iespējams norādīt arī RegExp (regulāras izteiksmes), bet esiet ļoti uzmanīgi tās ievadot, jo nepareizas izteiksmes ievades rezultātā, var tikt izbeigti lietotāja procesi, kurus iespējams, nevēlējāties izbeigt! PIEZĪME: RegExp ir eksperta opcija!Atjaunošanas intervālsAtjaunošanas intervāls "%%s" nav korektsAtjaunošanas intervāls "%%s" nav korekts un uzstādāmsAtjaunošanas intervāls nav padotsProcesa aprakstsProcesa maskaDzēst PlayTime notifikāciju no sarakstaDzēst lietotāju no neuzskaitāmo lietotāju sarakstaDzēst neuzskaitāmo sesiju tipu no sarakstaDzēst neuzskaitīto sesiju tipuDzēst ziņojumu no sarakstaNodzēst izvēlēto PlayTime aktivitāti no saraksta.Dzēst uzskaitīto sesiju tipu no sarakstaAtjaunotAtjaunot konfigurāciju uz saglabāto stāvokliIerobežojumu veids lietotājam ir apstrādātsIerobežojuma veids:Darbojošās aktivitātes (kopā):Darbojošās aktivitātes:Saglabāt visas izmaiņasSaglabāšanas laiksSaglabāšanas laiks "%%s" nav korektsSaglabāšanas laiks "%%s" nav korekts un uzstādāmsSaglabāšanas laiks nav norādītsIzvēlieties ierobežojumu veidu, kas tiks piemērots izvēlētajam lietotājam. PIEZĪME: lūdzu būt uzmanīgam un laicīgi izplānot ierobežojumu veidu, kas piemērots Jūsu situācijai, vēlams izlasīt katra ierobežojuma veida aprakstu!Ievadiet laika intervālu, kad vēlama automātiskā pamošanās. Šī opcija darbosies tikai tad, ja sistēmas BIOS / UEFI atbalsta pamošanos pēc RTC (reālā laika pulkstenis) un šī opcija ir iespējota!Šī pazīme nosaka vai laiks, kuru lietotājs pavadījis dīkstāvē tiek uzskaitīts. Ja pazīme nav iespējota, pavadītais laiks konsolē (ne terminālī) un aizslēgtajā sesijā NETIEK uzskaitīts. Šīs pazīmes darbspēja ļoti atkarīga no grafiskās vides kurā strādājat.Šī pazīme nosaka vai laiks, kuru lietotājs pavadījis dīkstāvē tiek uzskaitīts. Ja pazīme nav iespējota, pavadītais laiks konsolē (ne terminālī) un aizslēgtajā sesijā NETIEK uzskaitīts (šīs pazīmes darbspēja ļoti atkarīga no grafiskās vides kurā strādājat)Šī pazīme nosaka vai laiks, kuru lietotājs pavadījis dīkstāvē tiek uzskaitīts, ja pazīme nav iespējota, pavadītais laiks konsolē (ne terminālī) un aizslēgtajā sesijā NETIEK uzskaitīts (šīs pazīmes darbspēja ļoti atkarīga no grafiskās vides kurā strādājat)Šī pazīme nosaka vai lietotājam tiks rādīta slēdzenes ikona un paziņojumi par laika patēriņu. Lūdzu ņemt vērā, ka uzstādot šo pazīmi, lietotājam nebūs pieejama slēdzenes ikona un neviens paziņojums!Šī pazīme nosaka vai paziņojumam jāpievieno īss skaņas signāls brīdi, kad tiek parādīts ziņojums no Timekpr-nExT. Darbojas tikai tad, ja iespējoti brīdinājumi. Ja šī opcija nav rediģējama, tas nozīmē, ka jūsu lietotā vide nepiedāvā šādu iespēju.Nosaka vai lietot balss notifikācijas, ja opcija nav pieejama, tā būs atspējota. Ja vēlaties izmantot balss notifikācijas, lūdzu instalēt "python3-espeak" pakotni.Sesiju laika uzskaites biežums, kas nosaka cik bieži tiek aptaujātas lietotāju sesijas un uzskaitīts to patērētais laiks. 3 - 5 sekundes ir optimāli, lūdzu nemainīt bez vajadzības.Sesijas tipsUzstādīt tieši šādu laika ierobežojumuPlayTime aktivitāšu konfigurācijaSvarīgsRādīt visus paziņojumusPaziņot par izmaiņām ierobežojumosRādīt sekundesNorādiet atlikušo laiku sekundēs, pirms kura Timekpr-nExT sāks laika ik sekunžu atskaiti pirms piemērot izvēlēto ierobežojumu lietotāja sesijām.Nosaka vai rādīt paziņojumu gadījumā, ja ierobežojumi tikuši mainītiNosaka, vai atrādīt visus paziņojumus. Ja opcija atspējota, rādīti tiek tikai īpaši svarīgi paziņojumi.Nosaka vai atrādīt sekundes blakus ikonai notifikāciju panelī. Dažas no grafiskajām vidēm, piemēram KDE5, neatbalsta šādu opciju.PiestartējiesTimekpr-nExT pārvaldības aplikācijas statussTimekpr-nExT aplikācijas statussNoņemt norādīto laika apjomu (sods)Izbeigšanas laiksSesiju izbeigšanas laiks "%%s" nav korektsSesiju izbeigšanas laiks "%%s" nav korekts un uzstādāmsSesiju izbeigšanas laiks netika padotsStundu intervāls pārklājas ar esošu intervāluStundu intervāla beigas pārklājas ar esošu intervāluStundu intervāla sākums pārklājas ar esošu intervāluStundu intervāls dublējas ar esošu intervāluKomanda nav izdevusies:Stundu daudzums, kas pievienots šodienas atvēlētajam laikamMinūšu daudzums, kas tiks pievienots šodien atvēlētajam laikamTimekpr-nExT pārvaldības aplikācijas lietojums ir sekojošs:Radusies problēma komunikācijai ar Timekpr-nExT (%%s)!Radusies problēma savienojumam ar Timekpr-nExT (%%s)!Šeit atrādītas dienas un ierobežojumi, kas attiecas uz PlayTime funkcionalitātiŠeit atrādītas dienas un ierobežojumi, kas attiecas uz TeviŠī ir Timekpr-nExT pārvaldības aplikācija, tā atļauj veikt uzstādījumus Taviem lietotājiem kā arī pašam Timekpr-nExT. Lai lietotu šo aplikāciju, Tev tā jādarbina ar administratora tiesībām vai jābūt timekpr lietotāju grupā. Lūdzu ņemt vērā, ka "Timekpr-nExT pārvaldība" pieejama tikai un vienīgi, ja aplikācija darbināta ar administratora tiesībām! Lūdzu pārvaldi lietotājus atbildīgi un neatspējo tiesības sev!Šī sadaļa atļauj pārvaldīt PlayTime ierobežojumus.Šī sadaļa atļauj pārvaldīt laika ierobežojumus.Šī opcija iespējo alternatīvo laika uzskaiti PlayTime aktivitātēm. Ja šī opcija ir iespējota, laiks tiek uzskaitīts tikai tad, ja darbojas kāda no PlayTime sarakstā esošajām aplikācijām, savukārt pārējais laiks tiek uzskatīts kā dīkstāves laiks.Šī pazīme nosaka cik ilgi uz ekrāna tiek rādīti kritiskie paziņojumi (kad ikona par laika patēriņu ir sarkana). Vērtība norādīta sekundēs. Vērtība 0 nozīmē, ka ziņojums tiks rādīts līdz lietotājs to aizvērs pašrocīgi. Lūdzu ņemt vērā, ka jūsu lietotā vide var pārtvert šo opciju, kas nozīmē, ka šai opcija nebūs nekāda ietekme uz paziņojumiem.Šī pazīme nosaka cik ilgi uz ekrāna tiek rādīti standarta paziņojumi par laika patēriņu un ierobežojumu izmaiņām. Vērtība norādīta sekundēs. Vērtība 0 nozīmē, ka ziņojums tiks rādīts līdz lietotājs to aizvērs pašrocīgi (opcija netiek rekomendēta izmantošanai parastajiem paziņojumiem). Lūdzu ņemt vērā, ka jūsu lietotā vide var pārtvert šo opciju, kas nozīmē, ka šai opcija nebūs nekāda ietekme uz paziņojumiem.Tehniskā žurnāla līmenis. Lūdzu mainīt tikai tad, ja esat pārliecināts un zinošs, ko tas nozīmē.Šī pazīme nosaka vai PlayTime aktivitāšu meklēšanai sistēmā tiks izmantota arī procesa komandrinda ieskaitot procesa parametrus (pēc noklusējuma aktivitātes tiek filtrētas tikai pēc procesa nosaukuma). Ja pazīme iespējota, Timekpr-nExT meklēs procesus, kas reģistrēti lietotāja aktivitāšu sarakstā izmantojot pirmos 512 komandrindas simbolus, tādā veidā palielinot procesu meklēšanas iespējas. Lūdzu būt uzmanīgiem un rūpīgi pārbaudīt RegExp šablonus katram lietotāja aktivitāšu sarakstā esošajam procesam!Šī opcija iespējo PlayTime funkcionalitāti. Šis ir globālas slēdzis, ja opcija tiek atspējota, tā tiek atspējota visiem lietotājiem neskatoties uz katra individuālo iestatījumu!Šis saraksts atrāda PlayTime aktivitātes / aplikācijas, kas tika iespējotas kā daļa no PlayTime ierobežojumiemŠis saraksts atrāda laika intervālus, kas pieejami lietošanai. Opcija "∞" norāda, ka laiks kas patērēts šī intervāla ietvaros netiks uzskaitīts kā iztērēts, bet gan pieskaitīts dīkstāves laikam.Šī vērtība nosaka sekunžu intervālu ar kādu lietotāju uzskaitītais laiks tiek saglabāts uz diska. Lai nodrošinātu augstu precizitāti nezaudējot ātrdarbību, Timekpr-nExT uzskaita laiku atmiņā ar biežumu "Atjaunošanas intervāls", savukārt šī opcija nodrošina uzskaitītā laika saglabāšanu uz diska ilgtermiņa glabāšanai.LaiksLaika ierobežojumi tika mainīti, lūdzu ņemt vērā jaunos ierobežojumus!Pieejamais laiks šodien (saglabātais laiks, netiek aprēķināts reālajā laikā)Dīkstāves laiks (kopā):Dīkstāves laiks šai sesijai vai dīkstāves laiks no Timekpr-nExT pārstartēšanasDīkstāves laiks:Atlikušais laiks (kopā):Atlikušais laiks (šodien):Atlikušais laiks šodien:Pieejamais laiks...Laika ierobežojums (mēnesis):Laika ierobežojums (nedēļa):Laika ierobežojumi tika mainīti, lūdzu pievērst uzmanību jaunajiem ierobežojumiem!Laika ierobežojums uz mēnesi, kas pieejams Tavai lietošanaiLaika ierobežojums uz nedēļu, kas pieejams Tavai lietošanaiAlternatīva laika uzskaite:Izlietotais laiks (mēnesis):Izlietotais laiks (sesija):Izlietotais laiks (šodiena):Izlietotais laiks (nedēļa):Izlietotais laiks šajā mēnesīIzlietotais laiks šajā mēnesī (saglabātais laiks, nav faktiskais šībrīža laiks)Izlietotais laiks šajā lietotāja sesijā vai laiks, kas izlietots pēc Timekpr-nExT pārstartēšanasIzlietotais laiks šajā nedēļāIzlietotais laiks šajā nedēļā (saglabātais laiks, nav faktiskais šībrīža laiks)Izlietotais laiks šodien (saglabātais laiks, nav faktiskais šībrīža laiks)Šodien izlietotais laiks:Timekpr-nExTTimekpr-nExT pārvaldības iestatījumiTimekpr-nExT pārvaldībaTimekpr-nExT PlayTime paziņojumsTimekpr-nExT administrācijas aplikācijaTimekpr-nExT lietotāja aplikācijaTimekpr-nExT konfigurācija saglabātaTimekpr-nExT savienojums vēl nav pieejamsTimekpr-nExT tehniskā žurnāla līmenis. Lūdzu nemainīt šo vērtību. Ļoti iespējams, ka neatradīsiet neko interesantu žurnāla failos. Vērtību nozīme: 1 - standarta līmenis, 2 - atkļūdošanas līmenis, 3 - padziļināts atkļūdošanas līmenisTimekpr-nExT paziņojumsAr Timekpr-nExT saistītā konfigurācijaLīdzKopējais atlikušais PlayTime laiks šodienaiKopējais šodien izlietotais PlayTime laiksNepārtraukti pieejamais laiks šodien līdz pašām dienas beigāmUzskaitāmo sesiju pazīme "%%s" nav korektaNeaktīvo sesiju uzskaites vērtība "%%s" nav korekta un uzstādāmaUzskaitītās sesijas lietotājam apstrādātasUzskaitītās sesijas netika padotasUzskaitīt neaktīvās sesijas:Uzskaitīt neaktīvās:Uzskaitāmās sesijasNEPAREDZĒTA KĻŪDA: %%sNeparedzēta KĻŪDA iegūstot konfigurāciju. Lūdzu pārbaudīt Timekpr-nExT žurnāluNeparedzēta KĻŪDA ielasot lietotāja konfigurāciju. Lūdzu pārbaudīt Timekpr-nExT žurnāluNeparedzēta KĻŪDA ielasot lietotāju sarakstu. Lūdzu pārbaudīt Timekpr-nExT žurnāluNeparedzēta KĻŪDA mainot konfigurāciju. Lūdzu pārbaudīt Timekpr-nExT žurnāluNeparedzēta KĻŪDA mainot laika kontroles failu. Lūdzu pārbaudīt Timekpr-nExT žurnāluNeparedzēta KĻŪDA ielasot konfigurāciju. Lūdzu pārbaudīt Timekpr-nExT žurnāluLieto īsu skaņas signālu paziņojumosPielietot balss paziņojumusLietotāja "%%s" konfigurācijas fails nav atrastsLietotāja "%%s" laika pārvaldības fails nav atrastsLietotājs "%%s" nav atrastsLietotāju pārvaldībaLietotāja PlayTime ierobežojumi tika saglabātiPapildus konfigurācijas ierobežojumi lietotājam tika apstrādātiLietotāja konfigurācija iegūtaLietotāja laika ierobežojumi tika saglabātiLietotāja "%%s" PlayTime vērtība, kas pieļauj aktivitātes neuzskaitītajās stundās, nav korektaLietotāja "%%s" PlayTime vērtība, kas pieļauj aktivitātes neuzskaitītajās stundās, nav korekta un uzstādāmaLietotāja "%%s" PlayTime vērtība, kas pieļauj aktivitātes neuzskaitītajās stundās, nav padotaLietotāja "%%s" PlayTime dienu laika ierobežojumi nav korektiLietotāja "%%s" PlayTime dienu laika ierobežojumi nav korekti un uzstādāmiLietotāja "%%s" PlayTime dienu laika ierobežojumi netika padotiLietotāja "%%s" PlayTime pieļaujamo dienu saraksts nav korektsLietotāja "%%s" PlayTime pieļaujamo dienu saraksts nav korekts un uzstādāmsLietotāja "%%s" PlayTime pieļaujamo dienu saraksts netika padotsLietotāja "%%s" PlayTime iespējošanas vērtība nav korektaLietotāja "%%s" PlayTime iespējošanas vērtība korekta un uzstādāmaLietotāja "%%s" PlayTime iespējošanas vērtība nav padotaLietotāja "%%s" pieļaujamā laika operācija varbūt viena no sekojošām: - + =Lietotāja "%%s" PlayTime alternatīvā laika uzskaites vērtība nav korektaLietotāja "%%s" PlayTime alternatīvā laika uzskaites vērtība nav korekta un uzstādāmaLietotāja "%%s" PlayTime alternatīvā laika uzskaites vērtība nav padotaLietotāja "%%s" pieļaujamā PlayTime laika ierobežojums nav korekts un uzstādāmsLietotāja "%%s" dienas numurs nav korekts un uzstādāmsLietotāja "%%s" dienu laika ierobežojumi nav korektiLietotāja "%%s" dienu laika ierobežojumi nav korekti un uzstādāmiLietotāja "%%s" dienu laika ierobežojumi netika padotiLietotāja "%%s" pieļaujamo dienu saraksts nav korektsLietotāja "%%s" pieļaujamo dienu saraksts nav korekts un uzstādāmsLietotāja "%%s" pieļaujamo dienu saraksts netika padotsLietotāja "%%s" dienas numuram jābūt no 1 līdz 7Lietotāja "%%s" dienas numurs netika padotsLietotāja "%%s" slēdzenes slēpšanas vērtība nav korektaLietotāja "%%s" slēdzenes slēpšanas vērtība nav korekta un uzstādāmaLietotāja "%%s" slēdzenes slēpšanas vērtība nav padotaLietotāja "%%s" pieļaujamais mēneša ierobežojums nav korektsLietotāja "%%s" pieļaujamais mēneša ierobežojums nav korekts un uzstādāmsLietotāja "%%s" pieļaujamais mēneša ierobežojums netika padotsLietotāja "%%s" ierobežojumu veida vērtība nav korektaLietotāja "%%s" ierobežojumu veida vērtība nav korekta un uzstādāmaLietotāja "%%s" ierobežojumu veida vērtība nav padotaLietotāja "%%s" pieļaujamā PlayTime laika ierobežojums nav korektsLietotāja "%%s" laika ierobežojums nav korektsLietotāja "%%s" laika ierobežojums nav korekts un uzstādāmsLietotāja "%%s" pieļaujamā laika operācija varbūt viena no sekojošām: - + =Lietotāja "%%s" neaktīvo sesiju uzskaites vērtība nav korektaLietotāja "%%s" neaktīvo sesiju uzskaites vērtība nav korekta un uzstādāmaLietotāja "%%s" neaktīvo sesiju uzskaites vērtība nav padotaLietotāja "%%s" mēneša laika ierobežojums nav korektsLietotāja "%%s" mēneša laika ierobežojums nav korekts un uzstādāmsLietotāja "%%s" mēneša laika ierobežojums nav padotsLietotājvārdsLietotājvārds:Pārvaldības iespējas, kas saistītas ar lietotājiemPārbaudīt ievadīto laika intervālu pareizību. Šis ir obligāts solis, lai pārliecinātos, ka intervāli ir korekti. Problemātiskie intervāli pēc pārbaudes tiks izgaismoti.BRĪDINĀJUMS: Timekpr-nExT administrācijas aplikācijai būtu jāstartējas grafiski, bet grafiskā vide nav pieejama, tāpēc aplikācija darbosies termināla režīmā...Pamošanās stundas:BrīdinājumsNedēļas dienu ierobežojumiNedēļaNedēļas un mēneša ierobežojumiNedēļas un mēneša laika ierobežojumi lietotājam. Šie ierobežojumi tiek ņemti vērā kopā ar pārējiem laika ierobežojumiem.Nedēļas un mēneša laika ierobežojumi lietotājam apstrādātiKad lietotājam beidzies atvēlētais laiks, dators tiks aizslēgts (lock). Šis ierobežojumu veids faktiski nav ierobežojums, tas vairāk domāts paškontroles nodrošināšanai.Kad lietotājam beidzies atvēlētais laiks, dators tiks izslēgts. Šis ir faktiskais ierobežojums! Pirms lietot šo opciju, lūdzu izsvērt vai tā būs atbilstoša Jūsu situācijai!Kad lietotājam beidzies atvēlētais laiks, dators tiks novietots gulēšanas režīmā un tiks pamodināts automātiski, kad atvēlētie ierobežojumi to atļaus. Šis ierobežojumu veids faktiski nav ierobežojums, tas vairāk domāts paškontroles nodrošināšanai. Ja dators tiks pamodināts brīdī, kad lietotājam atvēlētais laiks ir beidzies, datora ekrāns tiks bloķēts un pēc kāda laika dators tiks novietots gulēšanas režīmā.Kad lietotājam beidzies atvēlētais laiks, dators tiks novietots gulēšanas režīmā. Šis ierobežojumu veids faktiski nav ierobežojums, tas vairāk domāts paškontroles nodrošināšanai. Ja dators tiks pamodināts brīdī, kad lietotājam atvēlētais laiks ir beidzies, datora ekrāns tiks bloķēts un pēc kāda laika dators tiks novietots gulēšanas režīmā.Kad lietotājam beidzies atvēlētais laiks, tā sesijas tiks izbeigtas. Šis ir faktiskais ierobežojums! Šī ir noklusētā vērtība un potenciāli vispiemērotākā!Tev atlikušas %(n)s stundasTev atlikusi %(n)s stundaTev atlikušas %(n)s stundasTev atvēlētais laiks šodien nav ierobežotsTev atvēlētais laiks beidzies, Tava sesija tiks aizvērta pēcTev atvēlētais laiks beidzies, Tavs dators tiks izslēgts pēcTev atvēlētais laiks beidzies, Tavs dators tiks novietots gulēšanas režīmā pēcTev atvēlētais laiks beidzies, Tava sesija tiks bloķēta pēcdievadiet stundu intervālusprocesa maska...no...sstundas ir numurētas pēc ISO 9601 (t.i. 24 stundas, formāts: 0-23)stsvarīgums...bloķēt ekrānumminn/askaitliskās laika vērtības ir sekundēsprocesa apraksts...sesijas tips...izslēgt datorugulēšanas un pamošanās režīmsgulēšanas režīmsizbeigt lietotāja sesijaslaiks...This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . In Debian, see file /usr/share/common-licenses/GPL-3līdz...šodienas laikslietotājvārds...pārbaudītnedēļas dienas ir numurētas pēc ISO 8601 (t.i. pirmdiena ir pirmā diena nedēļā, formāts: 1-7)timekpr-next/resource/locale/lv/LC_MESSAGES/timekpr.po000664 001750 001750 00000317027 14017261747 024527 0ustar00bezvfedubezvfedu000000 000000 # Eduards Bezverhijs (Tieto) , 2020. msgid "" msgstr "" "Project-Id-Version: Timekpr nExT\n" "POT-Creation-Date: 2021-03-01 22:11+0200\n" "PO-Revision-Date: 2021-03-01 22:19+0200\n" "Last-Translator: Eduards Bezverhijs \n" "Language-Team: Eduards Bezverhijs\n" "Language: lv_LV\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2019-04-28 19:13+0000\n" "X-Generator: Poedit 2.4.1\n" "Plural-Forms: nplurals=3; plural=(n%10==0 || (n%100>=11 && n%100<=19) ? 0 : n" "%10==1 && n%100!=11 ? 1 : 2);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __:1,2\n" #: common/constants/messages.py:31 msgid "==> print help, example" msgstr "==> izdrukā palīdzību, piemērs" #: common/constants/messages.py:32 msgid "==> get saved user list from the server, example" msgstr "==> iegūst faktisko lietotāju sarakstu no servera, piemērs" #: common/constants/messages.py:33 msgid "" "==> get user configuration and time information from the server, example" msgstr "==> iegūst lietotāja konfigurāciju un informāciju no servera, piemērs" #: common/constants/messages.py:34 msgid "==> set allowed days for the user, example" msgstr "==> komanda uzstāda pieļaujamo dienu sarakstu lietotājam, piemērs" #. TRANSLATORS: please DO NOT translate the keyword "ALL" #: common/constants/messages.py:36 msgid "" "==> set allowed hours for the specified day, or \"ALL\" for every day, " "optionally specify start and end minutes in brackets like this [x-y], " "additionally specify ! in front of hour if it doesn't have to be accounted " "(free time for user), example" msgstr "" "==> uzstāda pieļaujamos stundu ierobežojumus konkrētajai dienai vai \"ALL\" " "visām dienām, norādiet sākuma un beigu minūti iekavās šādi [X-Y], papildus " "iespējams norādīt ! pirms stundas, kura netiks uzskaitīta (brīvs laiks " "lietotājam), piemērs" #: common/constants/messages.py:37 msgid "" "==> set time limits for all allowed days, the number of values must not " "exceed the allowed days for the user, example" msgstr "" "==> uzstāda laika ierobežojumus visām nedēļas dienām, vērtību skaitam " "jāsakrīt ar atļauto dienu skaitu, piemērs" #: common/constants/messages.py:38 msgid "==> set time limit per week, example" msgstr "==> uzstāda laika ierobežojumu nedēļai, piemērs" #: common/constants/messages.py:39 msgid "==> set time limit per month, example" msgstr "==> uzstāda laika ierobežojumu mēnesim, piemērs" #: common/constants/messages.py:40 msgid "==> set whether to track inactive user sessions, example" msgstr "==> uzstāda neaktīvo sesiju uzskaites pazīmi, piemērs" #: common/constants/messages.py:41 msgid "==> set whether to hide tray icon and prevent notifications, example" msgstr "==> uzstāda slēdzenes un paziņojumu slēpšanas pazīmi, piemērs" #. TRANSLATORS: please DO NOT translate the keywords: "lock", "suspend", "suspendwake", "terminate", "shutdown" #: common/constants/messages.py:43 msgid "" "==> set restriction / lockout type (\"lock\" - lock session, \"suspend\" - " "suspend the computer, \"suspendwake\" - suspend and wake up, \"terminate\" - " "terminate sessions, \"shutdown\" - shutdown the computer), examples" msgstr "" "==> uzstādīt ierobežojumu veidu (\"lock\" - aizslēgt darbvirsmu, \"suspend\" " "- ievietot guļošā režīmā, \"suspendwake\" - ievietot guļošā režīmā un " "pamodināt, \"terminate\" - izbeigt sesijas, \"shutdown\" - izslēgt datoru), " "piemēri" #: common/constants/messages.py:44 msgid "" "==> set time left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> uzstāda laika ierobežojumus šodien: \"+\" (pieliek laiku), \"-\" (noņem " "laiku), \"=\" (uzstāda konkrētu pieejamo laiku), piemērs (pievieno vienu " "stundu)" #: common/constants/messages.py:45 msgid "==> set whether PlayTime is enabled for the user, example" msgstr "==> iespējo PlayTime laika uzskaiti lietotājam, piemērs" #: common/constants/messages.py:46 msgid "" "==> set whether PlayTime must be accounted instead of normal activity, " "example" msgstr "==> iespējo PlayTime alternatīvā laika uzskaiti lietotājam, piemērs" #: common/constants/messages.py:47 msgid "" "==> set whether PlayTime activities are allowed during unaccounted (\"∞\") " "intervals, example" msgstr "" "==> iespējo PlayTime laika uzskaiti arī laika intervālos, kas netiek " "uzskaitīti (\"∞\"), piemērs" #: common/constants/messages.py:48 msgid "==> set allowed days for PlayTime activities, example" msgstr "==> uzstāda pieļaujamo PlayTime dienu sarakstu lietotājam, piemērs" #: common/constants/messages.py:49 msgid "" "==> set PlayTime limits for all allowed days, the number of values must not " "exceed the allowed PlayTime allowed days for the user, example" msgstr "" "==> uzstāda PlayTime laika ierobežojumus nedēļas dienām (vērtību skaitam " "jāsakrīt ar atļauto dienu skaitu), piemērs" #: common/constants/messages.py:50 msgid "" "==> set PlayTime activity process masks, for which the time is accounted, " "example" msgstr "" "==> uzstāda PlayTime procesu filtrus, kas tiks izmantoti laika uzskaitē, " "piemēram" #: common/constants/messages.py:51 msgid "" "==> set PlayTime left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" "==> uzstāda PlayTime laika ierobežojumus šodien: \"+\" (pieliek laiku), \"-" "\" (noņem laiku), \"=\" (uzstāda konkrētu pieejamo laiku), piemērs (pievieno " "vienu stundu)" #: common/constants/messages.py:54 msgid "Control sessions types are not passed" msgstr "Uzskaitāmo sesiju tipi netika padoti" #: common/constants/messages.py:55 msgid "Control sessions types list is not correct" msgstr "Uzskaitāmo sesiju tipi nav korekti" #: common/constants/messages.py:56 msgid "Control sessions types list is not correct and cannot be set" msgstr "Uzskaitāmo sesiju tipi nav korekti un uzstādāmi" #: common/constants/messages.py:57 msgid "Excluded session types are not passed" msgstr "Neuzskaitāmo sesiju tipi netika padoti" #: common/constants/messages.py:58 msgid "Excluded session types list is not correct" msgstr "Neuzskaitāmo sesiju tipi nav korekti" #: common/constants/messages.py:59 msgid "Excluded session types list is not correct and cannot be set" msgstr "Neuzskaitāmo sesiju tipi nav korekti un uzstādāmi" #: common/constants/messages.py:60 msgid "Excluded user list is not passed" msgstr "Neuzskaitāmo lietotāju saraksts netika padots" #: common/constants/messages.py:61 msgid "Excluded user list is not correct" msgstr "Neuzskaitāmo lietotāju saraksts nav korekts" #: common/constants/messages.py:62 msgid "Excluded user list is not correct and cannot be set" msgstr "Neuzskaitāmo lietotāju saraksts nav korekts un uzstādāms" #: common/constants/messages.py:63 msgid "Final warning time is not passed" msgstr "Pēdējā brīdinājuma laiks nav padots" #: common/constants/messages.py:64 #, python-format msgid "Final warning time \"%%s\" is not correct" msgstr "Pēdējā brīdinājuma laiks \"%%s\" nav korekts" #: common/constants/messages.py:65 #, python-format msgid "Final warning time \"%%s\" is not correct and cannot be set" msgstr "Pēdējā brīdinājuma laiks \"%%s\" nav korekts un uzstādāms" #: common/constants/messages.py:66 msgid "Final notification time is not passed" msgstr "Pēdējā paziņojuma laiks nav padots" #: common/constants/messages.py:67 #, python-format msgid "Final notification time \"%%s\" is not correct" msgstr "Pēdējā paziņojuma laiks \"%%s\" nav korekts" #: common/constants/messages.py:68 #, python-format msgid "Final notification time \"%%s\" is not correct and cannot be set" msgstr "Pēdējā paziņojuma laiks \"%%s\" nav korekts un uzstādāms" #: common/constants/messages.py:69 msgid "Termination time is not passed" msgstr "Sesiju izbeigšanas laiks netika padots" #: common/constants/messages.py:70 #, python-format msgid "Termination time \"%%s\" is not correct" msgstr "Sesiju izbeigšanas laiks \"%%s\" nav korekts" #: common/constants/messages.py:71 #, python-format msgid "Termination time \"%%s\" is not correct and cannot be set" msgstr "Sesiju izbeigšanas laiks \"%%s\" nav korekts un uzstādāms" #: common/constants/messages.py:72 msgid "Track inactive is not passed" msgstr "Uzskaitītās sesijas netika padotas" #: common/constants/messages.py:73 #, python-format msgid "Track inactive \"%%s\" is not correct" msgstr "Uzskaitāmo sesiju pazīme \"%%s\" nav korekta" #: common/constants/messages.py:74 #, python-format msgid "Track inactive \"%%s\" is not correct and cannot be set" msgstr "Neaktīvo sesiju uzskaites vērtība \"%%s\" nav korekta un uzstādāma" #: common/constants/messages.py:75 msgid "Log level is not passed" msgstr "Tehniskā žurnāla līmenis netika padots" #: common/constants/messages.py:76 #, python-format msgid "Log level \"%%s\" is not correct" msgstr "Tehniskā žurnāla līmenis \"%%s\" nav korekts" #: common/constants/messages.py:77 #, python-format msgid "Log level \"%%s\" is not correct and cannot be set" msgstr "Tehniskā žurnāla līmenis \"%%s\" nav korekts un uzstādāms" #: common/constants/messages.py:78 msgid "Poll time is not passed" msgstr "Atjaunošanas intervāls nav padots" #: common/constants/messages.py:79 #, python-format msgid "Poll time \"%%s\" is not correct" msgstr "Atjaunošanas intervāls \"%%s\" nav korekts" #: common/constants/messages.py:80 #, python-format msgid "Poll time \"%%s\" is not correct and cannot be set" msgstr "Atjaunošanas intervāls \"%%s\" nav korekts un uzstādāms" #: common/constants/messages.py:81 msgid "Save time is not passed" msgstr "Saglabāšanas laiks nav norādīts" #: common/constants/messages.py:82 #, python-format msgid "Save time \"%%s\" is not correct" msgstr "Saglabāšanas laiks \"%%s\" nav korekts" #: common/constants/messages.py:83 #, python-format msgid "Save time \"%%s\" is not correct and cannot be set" msgstr "Saglabāšanas laiks \"%%s\" nav korekts un uzstādāms" #: common/constants/messages.py:84 msgid "PlayTime flag is not passed" msgstr "PlayTime iespējošanas vērtība nav padota" #: common/constants/messages.py:85 #, python-format msgid "PlayTime flag \"%%s\" is not correct" msgstr "PlayTime iespējošanas vērtība \"%%s\" nav korekta" #: common/constants/messages.py:86 #, python-format msgid "PlayTime flag \"%%s\" is not correct and cannot be set" msgstr "PlayTime iespējošanas vērtība \"%%s\" nav korekta un uzstādāma" #: common/constants/messages.py:87 msgid "PlayTime enhanced activity monitor flag is not passed" msgstr "PlayTime uzlabotā aktivitāšu meklētāja vērtība nav padota" #: common/constants/messages.py:88 #, python-format msgid "PlayTime enhanced activity monitor flag \"%%s\" is not correct" msgstr "PlayTime uzlabotā aktivitāšu meklētāja vērtība \"%%s\" nav korekta" #: common/constants/messages.py:89 #, python-format msgid "" "PlayTime enhanced activity monitor flag \"%%s\" is not correct and cannot be " "set" msgstr "" "PlayTime uzlabotā aktivitāšu meklētāja vērtība \"%%s\" nav korekta un " "uzstādāma" #: common/constants/messages.py:92 #, python-format msgid "User's \"%%s\" day number must be present" msgstr "Lietotāja \"%%s\" dienas numurs netika padots" #: common/constants/messages.py:93 #, python-format msgid "User's \"%%s\" day number must be between 1 and 7" msgstr "Lietotāja \"%%s\" dienas numuram jābūt no 1 līdz 7" #: common/constants/messages.py:94 #, python-format msgid "User's \"%%s\" allowed hours are not correct and cannot be set" msgstr "Lietotāja \"%%s\" dienas numurs nav korekts un uzstādāms" #: common/constants/messages.py:95 #, python-format msgid "User's \"%%s\" day list is not passed" msgstr "Lietotāja \"%%s\" pieļaujamo dienu saraksts netika padots" #: common/constants/messages.py:96 #, python-format msgid "User's \"%%s\" day list is not correct" msgstr "Lietotāja \"%%s\" pieļaujamo dienu saraksts nav korekts" #: common/constants/messages.py:97 #, python-format msgid "User's \"%%s\" day list is not correct and cannot be set" msgstr "Lietotāja \"%%s\" pieļaujamo dienu saraksts nav korekts un uzstādāms" #: common/constants/messages.py:98 #, python-format msgid "User's \"%%s\" day limits list is not passed" msgstr "Lietotāja \"%%s\" dienu laika ierobežojumi netika padoti" #: common/constants/messages.py:99 #, python-format msgid "User's \"%%s\" day limits list is not correct" msgstr "Lietotāja \"%%s\" dienu laika ierobežojumi nav korekti" #: common/constants/messages.py:100 #, python-format msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgstr "Lietotāja \"%%s\" dienu laika ierobežojumi nav korekti un uzstādāmi" #: common/constants/messages.py:101 #, python-format msgid "User's \"%%s\" time operation can be one of these: - + =" msgstr "" "Lietotāja \"%%s\" pieļaujamā laika operācija varbūt viena no sekojošām: - + =" #: common/constants/messages.py:102 #, python-format msgid "User's \"%%s\" time limit is not correct" msgstr "Lietotāja \"%%s\" laika ierobežojums nav korekts" #: common/constants/messages.py:103 #, python-format msgid "User's \"%%s\" time limit is not correct and cannot be set" msgstr "Lietotāja \"%%s\" laika ierobežojums nav korekts un uzstādāms" #: common/constants/messages.py:104 #, python-format msgid "User's \"%%s\" monthly allowance is not passed" msgstr "Lietotāja \"%%s\" pieļaujamais mēneša ierobežojums netika padots" #: common/constants/messages.py:105 #, python-format msgid "User's \"%%s\" monthly allowance is not correct" msgstr "Lietotāja \"%%s\" pieļaujamais mēneša ierobežojums nav korekts" #: common/constants/messages.py:106 #, python-format msgid "User's \"%%s\" monthly allowance is not correct and cannot be set" msgstr "" "Lietotāja \"%%s\" pieļaujamais mēneša ierobežojums nav korekts un uzstādāms" #: common/constants/messages.py:107 #, python-format msgid "User's \"%%s\" track inactive flag is not passed" msgstr "Lietotāja \"%%s\" neaktīvo sesiju uzskaites vērtība nav padota" #: common/constants/messages.py:108 #, python-format msgid "User's \"%%s\" track inactive flag is not correct" msgstr "Lietotāja \"%%s\" neaktīvo sesiju uzskaites vērtība nav korekta" #: common/constants/messages.py:109 #, python-format msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgstr "" "Lietotāja \"%%s\" neaktīvo sesiju uzskaites vērtība nav korekta un uzstādāma" #: common/constants/messages.py:110 #, python-format msgid "User's \"%%s\" hide tray icon flag is not passed" msgstr "Lietotāja \"%%s\" slēdzenes slēpšanas vērtība nav padota" #: common/constants/messages.py:111 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct" msgstr "Lietotāja \"%%s\" slēdzenes slēpšanas vērtība nav korekta" #: common/constants/messages.py:112 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct and cannot be set" msgstr "Lietotāja \"%%s\" slēdzenes slēpšanas vērtība nav korekta un uzstādāma" #: common/constants/messages.py:113 #, python-format msgid "User's \"%%s\" restriction / lockout type is not passed" msgstr "Lietotāja \"%%s\" ierobežojumu veida vērtība nav padota" #: common/constants/messages.py:114 #, python-format msgid "User's \"%%s\" restriction / lockout type is not correct" msgstr "Lietotāja \"%%s\" ierobežojumu veida vērtība nav korekta" #: common/constants/messages.py:115 #, python-format msgid "" "User's \"%%s\" restriction / lockout type is not correct and cannot be set" msgstr "Lietotāja \"%%s\" ierobežojumu veida vērtība nav korekta un uzstādāma" #: common/constants/messages.py:116 #, python-format msgid "User's \"%%s\" weekly allowance is not passed" msgstr "Lietotāja \"%%s\" mēneša laika ierobežojums nav padots" #: common/constants/messages.py:117 #, python-format msgid "User's \"%%s\" weekly allowance is not correct" msgstr "Lietotāja \"%%s\" mēneša laika ierobežojums nav korekts" #: common/constants/messages.py:118 #, python-format msgid "User's \"%%s\" weekly allowance is not correct and cannot be set" msgstr "Lietotāja \"%%s\" mēneša laika ierobežojums nav korekts un uzstādāms" #: common/constants/messages.py:119 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not passed" msgstr "Lietotāja \"%%s\" PlayTime iespējošanas vērtība nav padota" #: common/constants/messages.py:120 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not correct" msgstr "Lietotāja \"%%s\" PlayTime iespējošanas vērtība nav korekta" #: common/constants/messages.py:121 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not correct and cannot be set" msgstr "Lietotāja \"%%s\" PlayTime iespējošanas vērtība korekta un uzstādāma" #: common/constants/messages.py:122 #, python-format msgid "User's \"%%s\" PlayTime override flag is not passed" msgstr "" "Lietotāja \"%%s\" PlayTime alternatīvā laika uzskaites vērtība nav padota" #: common/constants/messages.py:123 #, python-format msgid "User's \"%%s\" PlayTime override flag is not correct" msgstr "" "Lietotāja \"%%s\" PlayTime alternatīvā laika uzskaites vērtība nav korekta" #: common/constants/messages.py:124 #, python-format msgid "User's \"%%s\" PlayTime override flag is not correct and cannot be set" msgstr "" "Lietotāja \"%%s\" PlayTime alternatīvā laika uzskaites vērtība nav korekta " "un uzstādāma" #: common/constants/messages.py:125 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "passed" msgstr "" "Lietotāja \"%%s\" PlayTime vērtība, kas pieļauj aktivitātes neuzskaitītajās " "stundās, nav padota" #: common/constants/messages.py:126 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct" msgstr "" "Lietotāja \"%%s\" PlayTime vērtība, kas pieļauj aktivitātes neuzskaitītajās " "stundās, nav korekta" #: common/constants/messages.py:127 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct and cannot be set" msgstr "" "Lietotāja \"%%s\" PlayTime vērtība, kas pieļauj aktivitātes neuzskaitītajās " "stundās, nav korekta un uzstādāma" #: common/constants/messages.py:128 #, python-format msgid "User's \"%%s\" PlayTime day list is not passed" msgstr "Lietotāja \"%%s\" PlayTime pieļaujamo dienu saraksts netika padots" #: common/constants/messages.py:129 #, python-format msgid "User's \"%%s\" PlayTime day list is not correct" msgstr "Lietotāja \"%%s\" PlayTime pieļaujamo dienu saraksts nav korekts" #: common/constants/messages.py:130 #, python-format msgid "User's \"%%s\" PlayTime day list is not correct and cannot be set" msgstr "" "Lietotāja \"%%s\" PlayTime pieļaujamo dienu saraksts nav korekts un uzstādāms" #: common/constants/messages.py:131 common/constants/messages.py:134 #, python-format msgid "User's \"%%s\" PlayTime day limits list is not passed" msgstr "Lietotāja \"%%s\" PlayTime dienu laika ierobežojumi netika padoti" #: common/constants/messages.py:132 common/constants/messages.py:135 #, python-format msgid "User's \"%%s\" PlayTime day limits list is not correct" msgstr "Lietotāja \"%%s\" PlayTime dienu laika ierobežojumi nav korekti" #: common/constants/messages.py:133 common/constants/messages.py:136 #, python-format msgid "" "User's \"%%s\" PlayTime day limits list is not correct and cannot be set" msgstr "" "Lietotāja \"%%s\" PlayTime dienu laika ierobežojumi nav korekti un uzstādāmi" #: common/constants/messages.py:137 #, python-format msgid "User's \"%%s\" PlayTime operation can be one of these: - + =" msgstr "" "Lietotāja \"%%s\" pieļaujamā laika operācija varbūt viena no sekojošām: - + =" #: common/constants/messages.py:138 #, python-format msgid "User's \"%%s\" set PlayTime limit is not correct" msgstr "Lietotāja \"%%s\" pieļaujamā PlayTime laika ierobežojums nav korekts" #: common/constants/messages.py:139 #, python-format msgid "User's \"%%s\" PlayTime time limit is not correct and cannot be set" msgstr "" "Lietotāja \"%%s\" pieļaujamā PlayTime laika ierobežojums nav korekts un " "uzstādāms" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:143 msgid "" "Unexpected ERROR while loading configuration. Please inspect Timekpr-nExT " "log files" msgstr "" "Neparedzēta KĻŪDA ielasot konfigurāciju. Lūdzu pārbaudīt Timekpr-nExT žurnālu" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:145 msgid "" "Unexpected ERROR getting configuration. Please inspect Timekpr-nExT log files" msgstr "" "Neparedzēta KĻŪDA iegūstot konfigurāciju. Lūdzu pārbaudīt Timekpr-nExT " "žurnālu" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:147 msgid "" "Unexpected ERROR getting user configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "Neparedzēta KĻŪDA ielasot lietotāja konfigurāciju. Lūdzu pārbaudīt Timekpr-" "nExT žurnālu" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:149 msgid "" "Unexpected ERROR getting user list. Please inspect Timekpr-nExT log files" msgstr "" "Neparedzēta KĻŪDA ielasot lietotāju sarakstu. Lūdzu pārbaudīt Timekpr-nExT " "žurnālu" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:151 msgid "" "Unexpected ERROR updating configuration. Please inspect Timekpr-nExT log " "files" msgstr "" "Neparedzēta KĻŪDA mainot konfigurāciju. Lūdzu pārbaudīt Timekpr-nExT žurnālu" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:153 msgid "" "Unexpected ERROR updating control. Please inspect Timekpr-nExT log files" msgstr "" "Neparedzēta KĻŪDA mainot laika kontroles failu. Lūdzu pārbaudīt Timekpr-nExT " "žurnālu" #: common/constants/messages.py:154 #, python-format msgid "User \"%%s\" configuration is not found" msgstr "Lietotāja \"%%s\" konfigurācijas fails nav atrasts" #: common/constants/messages.py:155 #, python-format msgid "User \"%%s\" control file is not found" msgstr "Lietotāja \"%%s\" laika pārvaldības fails nav atrasts" #: common/constants/messages.py:156 #, python-format msgid "User \"%%s\" is not found" msgstr "Lietotājs \"%%s\" nav atrasts" #: common/constants/messages.py:159 msgid "Connected" msgstr "Pieslēdzies" #: common/constants/messages.py:160 msgid "Connecting..." msgstr "Pieslēdzas..." #: common/constants/messages.py:161 msgid "Failed to connect" msgstr "Nav iespējams pieslēgties" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:163 msgid "" "Please reopen the application if you are superuser and Timekpr-nExT is " "running" msgstr "" "Atveriet aplikāciju atkārtoti, ja esat administrators un Timekpr-nExT " "darbojas" #: common/constants/messages.py:164 msgid "Started" msgstr "Piestartējies" #: common/constants/messages.py:165 msgid "User configuration retrieved" msgstr "Lietotāja konfigurācija iegūta" #: common/constants/messages.py:166 msgid "Configuration retrieved" msgstr "Konfigurācija iegūta" #: common/constants/messages.py:167 msgid "Track inactive for user has been processed" msgstr "Uzskaitītās sesijas lietotājam apstrādātas" #: common/constants/messages.py:168 msgid "Hide tray icon for user has been processed" msgstr "Slēdzenes slēpšanas pazīme lietotājam apstrādāta" #: common/constants/messages.py:169 msgid "Restriction / lockout type for user has been processed" msgstr "Ierobežojumu veids lietotājam ir apstrādāts" #: common/constants/messages.py:170 msgid "Additional time for user has been processed" msgstr "Papildus laika ierobežojums lietotājam ir apstrādāts" #: common/constants/messages.py:171 msgid "Additional PlayTime for user has been processed" msgstr "Papildus PlayTime laika limits lietotājam tika apstrādāts" #: common/constants/messages.py:172 msgid "Weekly and monthly limits for user have been processed" msgstr "Nedēļas un mēneša laika ierobežojumi lietotājam apstrādāti" #: common/constants/messages.py:173 msgid "Allowed days for user have been processed" msgstr "Papildus dienu laika ierobežojumi lietotājam ir apstrādāti" #: common/constants/messages.py:174 msgid "Day time limits for user have been processed" msgstr "Dienas laika ierobežojumi lietotājam tika apstrādāti" #: common/constants/messages.py:175 msgid "Allowed hours for user have been processed" msgstr "Papildus laika stundu ierobežojumi lietotājam ir apstrādāti" #: common/constants/messages.py:176 msgid "Timekpr-nExT configuration has been saved" msgstr "Timekpr-nExT konfigurācija saglabāta" #: common/constants/messages.py:177 msgid "User time limits have been saved" msgstr "Lietotāja laika ierobežojumi tika saglabāti" #: common/constants/messages.py:178 msgid "User PlayTime limits have been saved" msgstr "Lietotāja PlayTime ierobežojumi tika saglabāti" #: common/constants/messages.py:179 msgid "User additional options have been saved" msgstr "Papildus konfigurācijas ierobežojumi lietotājam tika apstrādāti" #: common/constants/messages.py:180 msgid "Enable PlayTime for the user has been processed" msgstr "Papildus PlayTime laika limits lietotājam tika apstrādāts" #: common/constants/messages.py:181 msgid "PlayTime override flag for the user has been processed" msgstr "PlayTime alternatīvā laika uzskaite lietotājam tika apstrādāta" #: common/constants/messages.py:182 msgid "" "PlayTime allowed during unaccounted intervals flag for the user has been " "processed" msgstr "" "PlayTime vērtība, kas pieļauj aktivitātes neuzskaitītajās stundās, " "lietotājam tika apstrādāta" #: common/constants/messages.py:183 msgid "PlayTime allowed days for user have been processed" msgstr "PlayTime dienu laika ierobežojumi lietotājam tika apstrādāti" #: common/constants/messages.py:184 msgid "PlayTime day limits for user have been processed" msgstr "PlayTime laika ierobežojumi dienai lietotājam tika apstrādāti" #: common/constants/messages.py:185 msgid "PlayTime activities for user have been processed" msgstr "PlayTime aktivitāšu / aplikāciju saraksts lietotājam tika apstrādāts" #: common/constants/messages.py:186 msgid "Please select a day to set the limits" msgstr "Lūdzu iezīmējiet dienu ierobežojumu uzstādīšanai" #: common/constants/messages.py:187 msgid "That interval overlaps with an existing one" msgstr "Stundu intervāls pārklājas ar esošu intervālu" #: common/constants/messages.py:188 msgid "That interval's start conflicts with an existing one" msgstr "Stundu intervāla sākums pārklājas ar esošu intervālu" #: common/constants/messages.py:189 msgid "That interval's end conflicts with an existing one" msgstr "Stundu intervāla beigas pārklājas ar esošu intervālu" #: common/constants/messages.py:190 msgid "That interval's start or end duplicates an existing one" msgstr "Stundu intervāls dublējas ar esošu intervālu" #: common/constants/messages.py:191 msgid "Interval start cannot be the same as end" msgstr "Stundu intervāla sākums nedrīkst būt vienāds ar beigām" #: common/constants/messages.py:192 msgid "Interval's start cannot be later than end" msgstr "Stundu intervāla sākums nedrīkst būt vienāds ar beigām" #: common/constants/messages.py:193 msgid "Please select an hour interval to remove" msgstr "Lūdzu iezīmējiet stundu intervālu dzēšanai" #: common/constants/messages.py:194 msgid "Interval removed" msgstr "Intervāls noņemts" #: common/constants/messages.py:195 msgid "Timekpr-nExT interface is not yet ready" msgstr "Timekpr-nExT savienojums vēl nav pieejams" #: common/constants/messages.py:198 msgid "" "WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, " "but no displays are available, thus running in CLI..." msgstr "" "BRĪDINĀJUMS: Timekpr-nExT administrācijas aplikācijai būtu jāstartējas " "grafiski, bet grafiskā vide nav pieejama, tāpēc aplikācija darbosies " "termināla režīmā..." #: common/constants/messages.py:199 msgid "The command is incorrect:" msgstr "Komanda nav izdevusies:" #: common/constants/messages.py:200 msgid "The usage of Timekpr-nExT admin client is as follows:" msgstr "Timekpr-nExT pārvaldības aplikācijas lietojums ir sekojošs:" #: common/constants/messages.py:201 msgid "---=== NOTICE ===---" msgstr "---=== INFORMĀCIJA ===---" #: common/constants/messages.py:202 msgid "numeric time values are in seconds" msgstr "skaitliskās laika vērtības ir sekundēs" #: common/constants/messages.py:203 msgid "" "weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, " "format: 1-7)" msgstr "" "nedēļas dienas ir numurētas pēc ISO 8601 (t.i. pirmdiena ir pirmā diena " "nedēļā, formāts: 1-7)" #: common/constants/messages.py:204 msgid "hours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)" msgstr "stundas ir numurētas pēc ISO 9601 (t.i. 24 stundas, formāts: 0-23)" #: common/constants/messages.py:206 #, python-format msgid "%(n)s user in total:" msgid_plural "%(n)s users in total:" msgstr[0] "kopā %(n)s lietotāji:" msgstr[1] "kopā %(n)s lietotājs:" msgstr[2] "kopā %(n)s lietotāji:" #: common/constants/messages.py:207 #, python-format msgid "Configuration for user %s:" msgstr "Konfigurācija lietotājam %s:" #: common/constants/messages.py:210 msgid "Time left..." msgstr "Pieejamais laiks..." #: common/constants/messages.py:211 msgid "Limits & Configuration" msgstr "Ierobežojumi un pārvaldība" #: common/constants/messages.py:212 msgid "About" msgstr "Par" #: common/constants/messages.py:215 resource/client/forms/about.glade:17 msgid "Keep control of computer usage" msgstr "Kontrolēt datora lietojamību" #: common/constants/messages.py:216 msgid "Day" msgstr "Diena" #: common/constants/messages.py:217 msgid "Enabled" msgstr "Iespējots" #: common/constants/messages.py:218 common/constants/messages.py:224 msgid "Limit" msgstr "Limits" #: common/constants/messages.py:219 msgid "From" msgstr "No" #: common/constants/messages.py:220 msgid "from..." msgstr "no..." #: common/constants/messages.py:221 msgid "To" msgstr "Līdz" #: common/constants/messages.py:222 msgid "to..." msgstr "līdz..." #: common/constants/messages.py:223 msgid "Period" msgstr "Periods" #: common/constants/messages.py:225 msgid "Weekly" msgstr "Nedēļa" #: common/constants/messages.py:226 msgid "Monthly" msgstr "Mēnesis" #: common/constants/messages.py:227 common/constants/messages.py:229 msgid "Session type" msgstr "Sesijas tips" #: common/constants/messages.py:228 common/constants/messages.py:230 msgid "session type..." msgstr "sesijas tips..." #: common/constants/messages.py:231 msgid "Username" msgstr "Lietotājvārds" #: common/constants/messages.py:232 msgid "username..." msgstr "lietotājvārds..." #: common/constants/messages.py:233 msgid "Process mask" msgstr "Procesa maska" #: common/constants/messages.py:234 msgid "executable mask..." msgstr "procesa maska..." #: common/constants/messages.py:235 msgid "Process description" msgstr "Procesa apraksts" #: common/constants/messages.py:236 msgid "process description..." msgstr "procesa apraksts..." #: common/constants/messages.py:237 msgid "Time" msgstr "Laiks" #: common/constants/messages.py:238 msgid "time..." msgstr "laiks..." #: common/constants/messages.py:239 msgid "Importance" msgstr "Svarīgums" #: common/constants/messages.py:240 msgid "importance..." msgstr "svarīgums..." #: common/constants/messages.py:243 msgid "Timekpr-nExT notification" msgstr "Timekpr-nExT paziņojums" #: common/constants/messages.py:244 msgid "Timekpr-nExT PlayTime notification" msgstr "Timekpr-nExT PlayTime paziņojums" #: common/constants/messages.py:245 msgid "Your time is not limited today" msgstr "Tev atvēlētais laiks šodien nav ierobežots" #: common/constants/messages.py:246 msgid "Time allowance has changed, please note new time left!" msgstr "Laika ierobežojumi tika mainīti, lūdzu ņemt vērā jaunos ierobežojumus!" #: common/constants/messages.py:247 msgid "Time limit configuration has changed, please note new configuration!" msgstr "" "Laika ierobežojumi tika mainīti, lūdzu pievērst uzmanību jaunajiem " "ierobežojumiem!" #: common/constants/messages.py:248 #, python-format msgid "There is a problem connecting to Timekpr-nExT daemon (%%s)!" msgstr "Radusies problēma savienojumam ar Timekpr-nExT (%%s)!" #: common/constants/messages.py:249 #, python-format msgid "There is a problem communicating to Timekpr-nExT (%%s)!" msgstr "Radusies problēma komunikācijai ar Timekpr-nExT (%%s)!" #: common/constants/messages.py:250 #, python-format msgid "Icon initialization error (%%s)!" msgstr "Ikonas inicializācijas problēma (%%s)!" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:252 msgid "Your time is up, you will be forcibly logged out in" msgstr "Tev atvēlētais laiks beidzies, Tava sesija tiks aizvērta pēc" #. TRANSLATORS: this is a part of message "Your time is up, your computer will be forcibly shutdown in %s seconds", please translate accordingly #: common/constants/messages.py:254 msgid "Your time is up, your computer will be forcibly shutdown in" msgstr "Tev atvēlētais laiks beidzies, Tavs dators tiks izslēgts pēc" #. TRANSLATORS: this is a part of message "Your time is up, your session will be forcibly locked in %s seconds", please translate accordingly #: common/constants/messages.py:256 msgid "Your time is up, your session will be forcibly locked in" msgstr "Tev atvēlētais laiks beidzies, Tava sesija tiks bloķēta pēc" #. TRANSLATORS: this is a part of message ", Your computer will be forcibly suspended in %s seconds", please translate accordingly #: common/constants/messages.py:258 msgid "Your time is up, your computer will be forcibly suspended in" msgstr "" "Tev atvēlētais laiks beidzies, Tavs dators tiks novietots gulēšanas režīmā " "pēc" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:260 #, python-format msgid "%(n)s second" msgid_plural "%(n)s seconds" msgstr[0] "%(n)s sekundēm" msgstr[1] "%(n)s sekundes" msgstr[2] "%(n)s sekundēm" #: common/constants/messages.py:261 msgid "Internal connection error, please check log files" msgstr "Iekšējā pieslēguma kļūda, lūdzu pārbaudīt žurnāla failus" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:263 #, python-format msgid "You have %(n)s hour" msgid_plural "You have %(n)s hours" msgstr[0] "Tev atlikušas %(n)s stundas" msgstr[1] "Tev atlikusi %(n)s stunda" msgstr[2] "Tev atlikušas %(n)s stundas" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:265 #, python-format msgid "%(n)s minute" msgid_plural "%(n)s minutes" msgstr[0] "%(n)s minūtes" msgstr[1] "%(n)s minūte" msgstr[2] "%(n)s minūtes" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) of PlayTime left" please translate accordingly #: common/constants/messages.py:267 common/constants/messages.py:269 #, python-format msgid "%(n)s second left" msgid_plural "%(n)s seconds left" msgstr[0] "%(n)s sekundes" msgstr[1] "%(n)s sekunde" msgstr[2] "%(n)s sekundes" #: common/constants/messages.py:269 #, python-format msgid "%(n)s second of PlayTime left" msgid_plural "%(n)s seconds of PlayTime left" msgstr[0] "%(n)s sekundes no atvēlētā PLayTime laika" msgstr[1] "%(n)s sekunde no atvēlētā PLayTime laika" msgstr[2] "%(n)s sekundes no atvēlētā PLayTime laika" #: common/constants/messages.py:270 #, python-format msgid "" "Feature \"%%s\", which is used to detect idle time, cannot be enabled!\n" "Idle / inactive time might not be accounted when screen is locked!" msgstr "" "Paplašinājumu \"%%s\", kas tiek izmantots, lai noteiktu vai dators tiek " "izmantots, nav iespējams ieslēgt!\n" "Dīkstāves laiks var netikt uzskaitīts korekti, gadījumos, ja ekrāns tiek " "bloķēts!" #: common/constants/messages.py:273 #, python-format msgid "UNEXPECTED ERROR: %%s" msgstr "NEPAREDZĒTA KĻŪDA: %%s" #: common/constants/messages.py:274 #, python-format msgid "PARAMETER PARSE ERROR (please check parameter validity): %%s" msgstr "" "PARAMETRU PĀRBAUDES KĻŪDA (lūdzu pārbaudīt, vai parametrs norādīts korekti): " "%%s" #: common/constants/messages.py:275 msgid "Command FAILED: access denied" msgstr "Komanda NEIZDEVĀS: pieeja liegta" #: common/constants/messages.py:276 msgid "Command FAILED: communication was not accepted" msgstr "Komanda NEIZDEVĀS: komunikācija nav atļauta" #: common/constants/messages.py:277 msgid "n/a" msgstr "n/a" #: resource/client/forms/about.glade:7 msgid "About Timekpr-nExT" msgstr "Par Timekpr-nExT" #: resource/client/forms/about.glade:16 msgid "Copyright (c) 2018-2021 Eduards Bezverhijs" msgstr "Visas tiesības aizsargātas (c) 2018-2021 Eduards Bezverhijs" #: resource/client/forms/about.glade:19 msgid "Timekpr-nExT" msgstr "Timekpr-nExT" #. Please enter GPL3 licence text in your language #: resource/client/forms/about.glade:20 msgctxt "timekpr-next" msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details.\n" "\n" "You should have received a copy of the GNU General Public License along with " "this program. If not, see . In Debian, see " "file /usr/share/common-licenses/GPL-3" msgstr "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details.\n" "\n" "You should have received a copy of the GNU General Public License along with " "this program. If not, see . In Debian, see " "file /usr/share/common-licenses/GPL-3" #. Please fill in translator credits, each person in new line in format: name.surname@mail.xy, name@mail.xy, nick@mail.xy or so... #: resource/client/forms/about.glade:26 msgid "" "Eduards Bezverhijs \n" "(Translations fine-tuning by JP Lord )\n" "(English fine-tuning by Phil Hudson )" msgstr "Eduards Bezverhijs " #: resource/client/forms/admin.glade:155 msgid "Remove excluded session type" msgstr "Dzēst neuzskaitīto sesiju tipu" #: resource/client/forms/admin.glade:385 msgid "Timekpr-nExT administration" msgstr "Timekpr-nExT administrācijas aplikācija" #: resource/client/forms/admin.glade:403 resource/client/forms/admin.glade:409 #: resource/client/forms/client.glade:261 msgid "Icon, isn't it?" msgstr "Šī ir ikona, pareizi?" #: resource/client/forms/admin.glade:432 msgid "Notes, read carefully ;)" msgstr "Piezīmes, izlasi uzmanīgi ;)" #: resource/client/forms/admin.glade:435 msgid "" "This is the configuration app for Timekpr-nExT. It allows you to set time " "limits for your individual users as well as general Timekpr-nExT options.\n" "To use this application, you either have to execute it as superuser or have " "to be part of the timekpr group.\n" "Please note that the \"Timekpr-nExT Configuration\" is available in " "superuser (administrator) mode only!\n" "\n" "Please configure carefully: do not lock yourself out!" msgstr "" "Šī ir Timekpr-nExT pārvaldības aplikācija, tā atļauj veikt uzstādījumus " "Taviem lietotājiem kā arī pašam Timekpr-nExT.\n" "\n" "Lai lietotu šo aplikāciju, Tev tā jādarbina ar administratora tiesībām vai " "jābūt timekpr lietotāju grupā.\n" "Lūdzu ņemt vērā, ka \"Timekpr-nExT pārvaldība\" pieejama tikai un vienīgi, " "ja aplikācija darbināta ar administratora tiesībām!\n" "\n" "Lūdzu pārvaldi lietotājus atbildīgi un neatspējo tiesības sev!" #: resource/client/forms/admin.glade:465 resource/client/forms/admin.glade:3016 msgid "Users related configuration" msgstr "Pārvaldības iespējas, kas saistītas ar lietotājiem" #: resource/client/forms/admin.glade:476 resource/client/forms/client.glade:298 msgid "Username:" msgstr "Lietotājvārds:" #: resource/client/forms/admin.glade:504 resource/client/forms/admin.glade:516 msgid "List of usernames registered on the system" msgstr "Lietotāju saraksts, kuri reģistrēti sistēmā" #: resource/client/forms/admin.glade:530 msgid "Restore" msgstr "Atjaunot" #: resource/client/forms/admin.glade:535 msgid "Restore configuration from saved state" msgstr "Atjaunot konfigurāciju uz saglabāto stāvokli" #: resource/client/forms/admin.glade:586 msgid "Information about time left / spent" msgstr "Informāciju par laika patēriņu" #: resource/client/forms/admin.glade:610 msgid "" "Continuous time left. May span more than the current day (realtime, " "available when user is logged in)" msgstr "" "Vērtība nosaka, cik ilgi varat lietot datoru nepārtraukti, laika izlietojums " "var pārklāt vairākas dienas (tiek aprēķināta reālajā laikā, pieejama tikai, " "ja lietotājs ir aktīvs)" #: resource/client/forms/admin.glade:612 msgid "Time left (actual):" msgstr "Atlikušais laiks (kopā):" #: resource/client/forms/admin.glade:626 resource/client/forms/admin.glade:657 #: resource/client/forms/admin.glade:688 resource/client/forms/admin.glade:732 #: resource/client/forms/admin.glade:763 resource/client/forms/admin.glade:794 #: resource/client/forms/client.glade:411 #: resource/client/forms/client.glade:425 #: resource/client/forms/client.glade:456 #: resource/client/forms/client.glade:502 #: resource/client/forms/client.glade:728 #: resource/client/forms/client.glade:786 #: resource/client/forms/client.glade:857 #: resource/client/forms/client.glade:885 #: resource/client/forms/client.glade:985 #: resource/client/forms/client.glade:1011 msgid "Format: " msgstr "Formāts: " #: resource/client/forms/admin.glade:641 msgid "" "How long the user was inactive since last login (realtime, available when " "user is logged in)" msgstr "" "Vērtība nosaka, cik ilgi lietotājs bijis neaktīvs pēc pēdējās pierakstīšanās " "datorā (tiek aprēķināta reālajā laikā, pieejama tikai, ja lietotājs ir " "aktīvs)" #: resource/client/forms/admin.glade:643 msgid "Time inactive (actual):" msgstr "Dīkstāves laiks (kopā):" #: resource/client/forms/admin.glade:672 msgid "Time available today (saved stated, not real-time)" msgstr "" "Pieejamais laiks šodien (saglabātais laiks, netiek aprēķināts reālajā laikā)" #: resource/client/forms/admin.glade:674 msgid "Time left (today):" msgstr "Atlikušais laiks (šodien):" #: resource/client/forms/admin.glade:716 msgid "Time spent today (saved stated, not real-time)" msgstr "" "Izlietotais laiks šodien (saglabātais laiks, nav faktiskais šībrīža laiks)" #: resource/client/forms/admin.glade:718 msgid "Time spent (today):" msgstr "Izlietotais laiks (šodiena):" #: resource/client/forms/admin.glade:747 msgid "Time spent this week (saved stated, not real-time)" msgstr "" "Izlietotais laiks šajā nedēļā (saglabātais laiks, nav faktiskais šībrīža " "laiks)" #: resource/client/forms/admin.glade:749 resource/client/forms/client.glade:717 msgid "Time spent (week):" msgstr "Izlietotais laiks (nedēļa):" #: resource/client/forms/admin.glade:777 msgid "Time spent this month (saved stated, not real-time)" msgstr "" "Izlietotais laiks šajā mēnesī (saglabātais laiks, nav faktiskais šībrīža " "laiks)" #: resource/client/forms/admin.glade:779 resource/client/forms/client.glade:744 msgid "Time spent (month):" msgstr "Izlietotais laiks (mēnesis):" #: resource/client/forms/admin.glade:861 msgid "Allowance adjustments" msgstr "Ierobežojumu izmaiņas" #: resource/client/forms/admin.glade:885 msgid "today's time" msgstr "šodienas laiks" #: resource/client/forms/admin.glade:889 msgid "Choose this to adjust user's time allowance for today" msgstr "Izvēlieties šo opciju, lai mainītu pieejamo laika limitu šodienai" #: resource/client/forms/admin.glade:901 msgid "PlayTime" msgstr "PlayTime" #: resource/client/forms/admin.glade:905 msgid "Choose this to adjust user's PlayTime allowance for today" msgstr "" "Izvēlieties šo opciju, lai mainītu pieejamo PlayTime laika limitu šodienai" #: resource/client/forms/admin.glade:934 msgid "hr" msgstr "st" #: resource/client/forms/admin.glade:945 msgid "The number of minutes to be adjusted for today's limit" msgstr "Minūšu daudzums, kas tiks pievienots šodien atvēlētajam laikam" #: resource/client/forms/admin.glade:961 msgid "The number of hours to be adjusted for today's limit" msgstr "Stundu daudzums, kas pievienots šodienas atvēlētajam laikam" #: resource/client/forms/admin.glade:977 msgid "min" msgstr "min" #: resource/client/forms/admin.glade:1004 msgid "Add specified time (reward)" msgstr "Palielināt pieļaujamo laika daudzumu (bonuss)" #: resource/client/forms/admin.glade:1020 msgid "Subtract specified time (penalty)" msgstr "Noņemt norādīto laika apjomu (sods)" #: resource/client/forms/admin.glade:1036 msgid "Set this specific time limit" msgstr "Uzstādīt tieši šādu laika ierobežojumu" #: resource/client/forms/admin.glade:1101 msgid "Information about PlayTime" msgstr "Informācija par PlayTime" #: resource/client/forms/admin.glade:1134 msgid "" "Actual PlayTime available today (realtime, available when user is logged in)" msgstr "" "Kopējais atlikušais PlayTime laiks šodien (tiek aprēķināts reālajā laikā, " "pieejams tikai, ja lietotājs ir aktīvs)" #: resource/client/forms/admin.glade:1136 msgid "PlayTime left (actual):" msgstr "Atlikušais PlayTime laiks (kopā):" #: resource/client/forms/admin.glade:1150 #: resource/client/forms/admin.glade:1181 #: resource/client/forms/admin.glade:1269 msgid "Format: " msgstr "Formāts: " #: resource/client/forms/admin.glade:1165 msgid "PlayTime available today (saved stated, not real-time)" msgstr "" "Pieejamais PlayTime laiks šodien (saglabātais laiks, netiek aprēķināts " "reālajā laikā)" #: resource/client/forms/admin.glade:1167 msgid "PlayTime left (today):" msgstr "Atlikušais PlayTime laiks (šodien):" #: resource/client/forms/admin.glade:1196 #: resource/client/forms/admin.glade:1212 msgid "" "Active PlayTime activity count (realtime, available when user is logged in)" msgstr "" "Darbojošos PlayTime aktivitāšu / aplikāciju skaits (tiek aprēķināta reālajā " "laikā, pieejama tikai, ja lietotājs ir aktīvs)" #: resource/client/forms/admin.glade:1198 msgid "Running activities (actual):" msgstr "Darbojošās aktivitātes (kopā):" #: resource/client/forms/admin.glade:1253 msgid "PlayTime spent today (saved stated, not real-time)" msgstr "" "Izlietotais PlayTime laiks šodien (saglabātais laiks, nav faktiskais šībrīža " "laiks)" #: resource/client/forms/admin.glade:1255 msgid "PlayTime spent (today):" msgstr "Izlietotais PlayTime laiks (šodiena):" #: resource/client/forms/admin.glade:1306 msgid "" "Brief information about time spent and everything related to time management " "for this day" msgstr "" "Vispārīga informācija par laika izlietojumu un laika ierobežojumiem par šo " "dienu" #: resource/client/forms/admin.glade:1307 msgid "Info & Today" msgstr "Informācijai un šodienai" #: resource/client/forms/admin.glade:1348 msgid "This lets you configure time limits." msgstr "Šī sadaļa atļauj pārvaldīt laika ierobežojumus." #: resource/client/forms/admin.glade:1350 msgid "Week day limits" msgstr "Nedēļas dienu ierobežojumi" #. This is meant for very short (e.g. one letter) abbreviation of hours #: resource/client/forms/admin.glade:1370 #: resource/client/forms/admin.glade:1865 #: resource/client/forms/admin.glade:2265 msgid "h" msgstr "s" #: resource/client/forms/admin.glade:1374 #: resource/client/forms/admin.glade:2269 msgid "Choose hours to be adjusted for selected days." msgstr "Izvēloties stundas, tās tiks mainītas izvēlētajām dienām." #. This is meant for very short (e.g. one letter) abbreviation of minutes #: resource/client/forms/admin.glade:1386 #: resource/client/forms/admin.glade:1881 #: resource/client/forms/admin.glade:2281 msgid "m" msgstr "m" #: resource/client/forms/admin.glade:1390 #: resource/client/forms/admin.glade:2285 msgid "Choose minutes to be adjusted for selected days." msgstr "Izvēloties minūtes, tās tiks mainītas izvēlētajām dienām." #: resource/client/forms/admin.glade:1410 msgid "" "Increase daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Palielināt laika ierobežojumu balstoties uz izvēlēto laika vienību (stundas " "vai minūtes) izvēlētajam dienām.\n" "\n" "Lūdzu ņemt vērā, ka iespējams izvēlēties vairāk par vienu dienu vienlaicīgi!" #: resource/client/forms/admin.glade:1427 msgid "" "Decrease daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Samazināt laika ierobežojumu balstoties uz izvēlēto laika vienību (stundas " "vai minūtes) izvēlētajam dienām.\n" "\n" "Lūdzu ņemt vērā, ka iespējams izvēlēties vairāk par vienu dienu vienlaicīgi!" #: resource/client/forms/admin.glade:1474 msgid "" "Lists day of the week and additional information about the day's limit.\n" "\n" "Please enable / disable days for the user." msgstr "" "Nedēļas dienu saraksts un papildus informācija par dienas ierobežojumiem.\n" "\n" "Lūdzu iespējot / atspējot dienas konkrētajam lietotājam." #: resource/client/forms/admin.glade:1550 msgid "" "Hour intervals for selected day available to the user.\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead.\n" "\n" "Please note that if the day's limit ends at 24:00 and the next day's limit " "starts at 00:00, then the user can work continuously past midnight.\n" "\n" "Please note that multiple intervals cannot be configured within the same " "hour.\n" "An interval can start or end or contain a specific hour, but not more than " "once. This is by design, not a bug.\n" "\n" msgstr "" "Laika intervāli, kas pieejami lietotajam.\n" "Opcija \"∞\" norāda, ka laiks, ka patērēts šī intervāla ietvaros, netiks " "uzskaitīts kā iztērēts, bet gan pieskaitīts dīkstāves laikam.\n" "\n" "Lūdzu ņemiet vērā, ka ja diena beidzas ar 24 stundu un nākamās dienas 0 " "stunda ir atļauta, lietotājs bez pārtraukuma var strādāt arī pēc pusnakts.\n" "\n" "Lūdzu ņemt vērā, ka vienas stundas ietvaros NAV iespējams konfigurēt vairāk " "par vienu intervālu\n" "Tas var sākties šajā stundā, beigties šajā stundā, pilnībā iekļauties " "stundā, bet ne vairāk par vienu vienā stundā.\n" #: resource/client/forms/admin.glade:1581 msgid "Hour intervals" msgstr "Stundu intervāli" #: resource/client/forms/admin.glade:1603 msgid "" "Create a new time interval that will be available to the user.\n" "\n" "After creating the interval, please edit its start and end times directly in " "interval list." msgstr "" "Pievienot jaunu laika intervālu, kas būs pieejams lietotājam.\n" "\n" "Pēc intervāla izveides, samainiet to pēc saviem ieskatiem pa tiešo tabulā " "zemāk." #: resource/client/forms/admin.glade:1620 msgid "Delete the selected time interval from the available list of intervals." msgstr "Dzēst izvēlēto laika intervālu no iespējamo intervālu saraksta." #: resource/client/forms/admin.glade:1688 msgid "enter hour intervals" msgstr "ievadiet stundu intervālus" #: resource/client/forms/admin.glade:1742 msgid "verify" msgstr "pārbaudīt" #: resource/client/forms/admin.glade:1746 msgid "" "Verify configured time intervals. This is a mandatory step to ensure that " "intervals are correct.\n" "\n" "Intervals which have problems will be highlighted." msgstr "" "Pārbaudīt ievadīto laika intervālu pareizību. Šis ir obligāts solis, lai " "pārliecinātos, ka intervāli ir korekti.\n" "\n" "Problemātiskie intervāli pēc pārbaudes tiks izgaismoti." #: resource/client/forms/admin.glade:1821 msgid "Weekly and monthly limits" msgstr "Nedēļas un mēneša ierobežojumi" #. This is meant for very short (e.g. one letter) abbreviation of days #: resource/client/forms/admin.glade:1849 msgid "d" msgstr "d" #: resource/client/forms/admin.glade:1853 msgid "Choose days to be adjusted for selected period." msgstr "Izvēloties dienas, tās tiks mainītas izvēlētajam periodam." #: resource/client/forms/admin.glade:1869 msgid "Choose hours to be adjusted for selected period." msgstr "Izvēloties stundas, tās tiks mainītas izvēlētajam periodam." #: resource/client/forms/admin.glade:1885 msgid "Choose minutes to be adjusted for selected period." msgstr "Izvēloties minūtes, tās tiks mainītas izvēlētajam periodam." #: resource/client/forms/admin.glade:1913 msgid "" "Increase weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" "Palielināt nedēļas vai mēneša laika ierobežojumu balstoties uz izvēlēto " "laika vienību (dienas vai stundas vai minūtes) izvēlētajam periodam." #: resource/client/forms/admin.glade:1927 msgid "" "Decrease weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" "Samazināt nedēļas vai mēneša laika ierobežojumu balstoties uz izvēlēto laika " "vienību (dienas vai stundas vai minūtes) izvēlētajam periodam." #: resource/client/forms/admin.glade:1976 msgid "" "Weekly and monthly limits for the user.\n" "\n" "These limits are applied to user together with the rest of limit " "configuration." msgstr "" "Nedēļas un mēneša laika ierobežojumi lietotājam.\n" "\n" "Šie ierobežojumi tiek ņemti vērā kopā ar pārējiem laika ierobežojumiem." #: resource/client/forms/admin.glade:2016 msgid "Apply daily limits" msgstr "Iespējot dienas ierobežojumus" #: resource/client/forms/admin.glade:2021 msgid "Apply limit all changes made in this page" msgstr "Iespējot visas ierobežojumu izmaiņas, kas veiktas šajā lapā" #: resource/client/forms/admin.glade:2042 msgid "Daily limit configuration for all week days" msgstr "Dienas ierobežojums katrai nedēļas dienai" #: resource/client/forms/admin.glade:2043 msgid "Limit configuration" msgstr "Limitu pārvaldība" #: resource/client/forms/admin.glade:2064 msgid "Settings for PlayTime activities" msgstr "PlayTime aktivitāšu konfigurācija" #: resource/client/forms/admin.glade:2084 msgid "PlayTime options" msgstr "PlayTime konfigurācija" #: resource/client/forms/admin.glade:2108 #: resource/client/forms/admin.glade:2147 msgid "Enable PlayTime for selected user" msgstr "Iespējot PlayTime izvēlētajam lietotājam" #: resource/client/forms/admin.glade:2110 msgid "Enable PlayTime:" msgstr "Iespējot PlayTime:" #: resource/client/forms/admin.glade:2124 #: resource/client/forms/admin.glade:2161 msgid "" "Enable PlayTime override for selected user.\n" "\n" "This setting overrides time accounting in a way that time is accounted only " "when at least one of the applications on the PlayTime activity list are " "running!\n" "\n" "This affects only time accounting, intervals are still fully enforced!\n" "\n" "If no processes are running, time is accounted as idle thus effectively it's " "free time for user!" msgstr "" "Iespējot PlayTime alternatīvā laika uzskaiti izvēlētajam lietotājam.\n" "\n" "Šī opcija ignorē spēkā esošo laika uzskaiti tā, ka tikai tad, ja darbojas " "kāda no PlayTime aktivitāšu sarakstā esošā aplikācija, laiks tiek " "uzskaitīts!\n" "\n" "Šis slēdzis ietekmē tikai laika patēriņa uzskaiti, laika intervālu kontrole " "paliek spēkā!\n" "\n" "Ja nedarbojas neviena no aktivitātēm, laiks tiek uzskatīts kā dīkstāves " "laiks, kas nozīmē, ka šis ir brīvais laiks lietotājam!" #: resource/client/forms/admin.glade:2132 msgid "Enable PlayTime override:" msgstr "Iespējot alternatīvo PlayTime:" #: resource/client/forms/admin.glade:2180 #: resource/client/forms/admin.glade:2201 msgid "" "Allow PlayTime activities during unaccounted (\"∞\") time intervals for " "selected user.\n" "\n" "This setting allows the user to use applications configured in his PlayTime " "activity list during time intervals which are marked as unaccounted (\"∞" "\").\n" "\n" "If this setting is enabled, the use of activities will not be accounted " "towards PlayTime limits, otherwise applications in PlayTime activity list " "will be terminated as soon as they are started during unaccounted (\"∞\") " "time intervals." msgstr "" "Šī pazīme atļauj lietot PlayTime aktivitātes neuzskaitītajos (\"∞\") " "intervālos izvēlētajam lietotājam.\n" "\n" "Lietotājam būs iespēja darbināt aplikācijas, kas reģistrētas tā PlayTime " "aktivitāšu sarakstā arī intervālos, kas apzīmēti kā neuzskaitītie (\"∞\").\n" "\n" "Ja šī pazīme ir iespējota, lietotāja pavadītais laiks izmantojot PlayTime " "aktivitātes netiks uzskaitīts, savukārt ja pazīme ir atspējota, aplikācijas, " "kas reģistrētas un tiek startētas neuzskaitītajos (\"∞\") intervālos, tiks " "tiks terminētas." #: resource/client/forms/admin.glade:2186 msgid "Allowed during \"∞\" intervals:" msgstr "Atļauts neuzskaitītajos (\"∞\") intervālos:" #: resource/client/forms/admin.glade:2245 msgid "This lets you configure PlayTime limits." msgstr "Šī sadaļa atļauj pārvaldīt PlayTime ierobežojumus." #: resource/client/forms/admin.glade:2247 #: resource/client/forms/client.glade:1253 msgid "PlayTime limits" msgstr "PlayTime limiti" #: resource/client/forms/admin.glade:2305 msgid "" "Increase daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Palielināt PlayTime laika ierobežojumu balstoties uz izvēlēto laika vienību " "(stundas vai minūtes) izvēlētajam dienām.\n" "\n" "Lūdzu ņemt vērā, ka iespējams izvēlēties vairāk par vienu dienu vienlaicīgi!" #: resource/client/forms/admin.glade:2322 msgid "" "Decrease daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" "Samazināt PlayTime laika ierobežojumu balstoties uz izvēlēto laika vienību " "(stundas vai minūtes) izvēlētajam dienām.\n" "\n" "Lūdzu ņemt vērā, ka iespējams izvēlēties vairāk par vienu dienu vienlaicīgi!" #: resource/client/forms/admin.glade:2374 msgid "" "Lists day of the week and additional information about the day's PlayTime " "limit.\n" "\n" "Please enable / disable days for the user and set time allowance for " "PlayTime activities." msgstr "" "Nedēļas dienu saraksts un papildus informācija par PlayTime ierobežojumiem.\n" "\n" "Lūdzu iespējot / atspējot dienas konkrētajam lietotājam PlayTime aktivitāšu " "ierobežošanai." #: resource/client/forms/admin.glade:2423 msgid "PlayTime activities" msgstr "PlayTime aktivitātes" #: resource/client/forms/admin.glade:2445 msgid "" "Add new PlayTime activity.\n" "\n" "Please specify activity mask and user friendly description in the activity " "list directly." msgstr "" "Pievienot jaunu PlayTime aktivitāti.\n" "\n" "Lūdzu norādiet aktivitātes masku / nosaukumu un lietotājam draudzīgu " "aprakstu pa tiešo tabulā zemāk." #: resource/client/forms/admin.glade:2462 msgid "Remove selected entry from PlayTime activities." msgstr "Nodzēst izvēlēto PlayTime aktivitāti no saraksta." #: resource/client/forms/admin.glade:2506 msgid "" "Please specify a list of full process (executable) names without path as " "case sensitive strings to be monitored in the system.\n" "\n" "It's possible to specify RegExp masks for processes too, but please be very " "careful about them as misusing this setting may lead to killing unwanted " "processes for the user!\n" "\n" "NOTE: RegExp is an expert setting!" msgstr "" "Lūdzu norādīt pilnu procesa (palaidējprogrammas) nosaukumu bez pilna ceļa uz " "to kā reģistrjutīgu simbolu virkni, kas tiks monitorēta sistēmā.\n" "\n" "Nosaukumam iespējams norādīt arī RegExp (regulāras izteiksmes), bet esiet " "ļoti uzmanīgi tās ievadot, jo nepareizas izteiksmes ievades rezultātā, var " "tikt izbeigti lietotāja procesi, kurus iespējams, nevēlējāties izbeigt!\n" "\n" "PIEZĪME: RegExp ir eksperta opcija!" #: resource/client/forms/admin.glade:2546 msgid "Apply PlayTime configuration" msgstr "Iespējot PlayTime ierobežojumus" #: resource/client/forms/admin.glade:2550 msgid "Apply PlayTime limits and configuration changes on this page" msgstr "Iespējot PlayTime konfigurācijas iespēju maiņu šajā lapā" #: resource/client/forms/admin.glade:2569 msgid "PlayTime configuration" msgstr "PlayTime pārvaldība" #: resource/client/forms/admin.glade:2594 msgid "Additional configuration options" msgstr "Papildus konfigurācijas iespējas" #: resource/client/forms/admin.glade:2629 #: resource/client/forms/admin.glade:2652 msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account. This " "varies among desktop environments." msgstr "" "Šī pazīme nosaka vai laiks, kuru lietotājs pavadījis dīkstāvē tiek " "uzskaitīts.\n" "\n" "Ja pazīme nav iespējota, pavadītais laiks konsolē (ne terminālī) un " "aizslēgtajā sesijā NETIEK uzskaitīts (šīs pazīmes darbspēja ļoti atkarīga no " "grafiskās vides kurā strādājat)" #: resource/client/forms/admin.glade:2633 msgid "Track inactive sessions:" msgstr "Uzskaitīt neaktīvās sesijas:" #: resource/client/forms/admin.glade:2669 #: resource/client/forms/admin.glade:2692 msgid "" "Select whether to show Timekpr-next's padlock icon and notifications to the " "user.\n" "\n" "Please note that unchecking this will disable showing all information and " "notifications to the user!" msgstr "" "Šī pazīme nosaka vai lietotājam tiks rādīta slēdzenes ikona un paziņojumi " "par laika patēriņu.\n" "\n" "Lūdzu ņemt vērā, ka uzstādot šo pazīmi, lietotājam nebūs pieejama slēdzenes " "ikona un neviens paziņojums!" #: resource/client/forms/admin.glade:2673 msgid "Hide icon and notifications:" msgstr "Paslēpt slēdzeni un paziņojumus:" #: resource/client/forms/admin.glade:2744 msgid "" "Select a restriction / lockout type for the user.\n" "\n" "NOTE: please be very careful, think ahead and read every options description " "when changing this setting from default value!" msgstr "" "Izvēlieties ierobežojumu veidu, kas tiks piemērots izvēlētajam lietotājam.\n" "\n" "PIEZĪME: lūdzu būt uzmanīgam un laicīgi izplānot ierobežojumu veidu, kas " "piemērots Jūsu situācijai, vēlams izlasīt katra ierobežojuma veida aprakstu!" #: resource/client/forms/admin.glade:2748 msgid "Restriction / lockout type:" msgstr "Ierobežojuma veids:" #: resource/client/forms/admin.glade:2770 msgid "terminate sessions" msgstr "izbeigt lietotāja sesijas" #: resource/client/forms/admin.glade:2774 msgid "" "When time ends, user sessions will be terminated.\n" "\n" "This option is a restriction!\n" "\n" "This is the default option and most likely is the one you need!" msgstr "" "Kad lietotājam beidzies atvēlētais laiks, tā sesijas tiks izbeigtas.\n" "\n" "Šis ir faktiskais ierobežojums!\n" "\n" "Šī ir noklusētā vērtība un potenciāli vispiemērotākā!" #: resource/client/forms/admin.glade:2792 msgid "shutdown computer" msgstr "izslēgt datoru" #: resource/client/forms/admin.glade:2796 msgid "" "When time ends, computer will be shut down.\n" "\n" "This option is a restriction!\n" "\n" "Please evaluate whether you need this type of restriction!" msgstr "" "Kad lietotājam beidzies atvēlētais laiks, dators tiks izslēgts.\n" "\n" "Šis ir faktiskais ierobežojums!\n" "\n" "Pirms lietot šo opciju, lūdzu izsvērt vai tā būs atbilstoša Jūsu situācijai!" #: resource/client/forms/admin.glade:2814 msgid "suspend computer" msgstr "gulēšanas režīms" #: resource/client/forms/admin.glade:2818 msgid "" "When time ends, computer will be suspended (put to sleep).\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Kad lietotājam beidzies atvēlētais laiks, dators tiks novietots gulēšanas " "režīmā.\n" "\n" "Šis ierobežojumu veids faktiski nav ierobežojums, tas vairāk domāts " "paškontroles nodrošināšanai.\n" "\n" "Ja dators tiks pamodināts brīdī, kad lietotājam atvēlētais laiks ir " "beidzies, datora ekrāns tiks bloķēts un pēc kāda laika dators tiks novietots " "gulēšanas režīmā." #: resource/client/forms/admin.glade:2836 msgid "suspend / wakeup computer" msgstr "gulēšanas un pamošanās režīms" #: resource/client/forms/admin.glade:2840 msgid "" "When time ends, computer will be suspended (put to sleep) and will be woken " "up at start of next available time interval for the user.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" "Kad lietotājam beidzies atvēlētais laiks, dators tiks novietots gulēšanas " "režīmā un tiks pamodināts automātiski, kad atvēlētie ierobežojumi to " "atļaus.\n" "\n" "Šis ierobežojumu veids faktiski nav ierobežojums, tas vairāk domāts " "paškontroles nodrošināšanai.\n" "\n" "Ja dators tiks pamodināts brīdī, kad lietotājam atvēlētais laiks ir " "beidzies, datora ekrāns tiks bloķēts un pēc kāda laika dators tiks novietots " "gulēšanas režīmā." #: resource/client/forms/admin.glade:2858 msgid "lock screen" msgstr "bloķēt ekrānu" #: resource/client/forms/admin.glade:2862 msgid "" "When time ends, computer screen will be locked.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes." msgstr "" "Kad lietotājam beidzies atvēlētais laiks, dators tiks aizslēgts (lock).\n" "\n" "Šis ierobežojumu veids faktiski nav ierobežojums, tas vairāk domāts " "paškontroles nodrošināšanai." #: resource/client/forms/admin.glade:2893 msgid "" "Select a time interval when computer can be woken up automatically.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Ievadiet laika intervālu, kad vēlama automātiskā pamošanās.\n" "\n" "Šī opcija darbosies tikai tad, ja sistēmas BIOS / UEFI atbalsta pamošanos " "pēc RTC (reālā laika pulkstenis) un šī opcija ir iespējota!" #: resource/client/forms/admin.glade:2897 msgid "Wakeup hour interval:" msgstr "Pamošanās stundas:" #: resource/client/forms/admin.glade:2909 msgid "" "Enter start hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Ievadiet automātiskās pamošanās sākuma stundu.\n" "\n" "Šī opcija darbosies tikai tad, ja sistēmas BIOS / UEFI atbalsta pamošanos " "pēc RTC (reālā laika pulkstenis) un šī opcija ir iespējota!" #: resource/client/forms/admin.glade:2928 msgid "" "Enter end hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" "Ievadiet automātiskās pamošanās beigu stundu.\n" "\n" "Šī opcija darbosies tikai tad, ja sistēmas BIOS / UEFI atbalsta pamošanos " "pēc RTC (reālā laika pulkstenis) un šī opcija ir iespējota!" #: resource/client/forms/admin.glade:2966 msgid "Apply configuration" msgstr "Iespējot konfigurāciju" #: resource/client/forms/admin.glade:2970 msgid "Apply additional configuration changes on this page" msgstr "Iespējot papildus konfigurācijas iespēju maiņu šajā lapā" #: resource/client/forms/admin.glade:2989 msgid "Additional configuration" msgstr "Papildus konfigurācija" #: resource/client/forms/admin.glade:2990 #: resource/client/forms/admin.glade:3661 msgid "Additional options" msgstr "Papildus limiti" #: resource/client/forms/admin.glade:3017 msgid "User Configuration" msgstr "Lietotāju pārvaldība" #: resource/client/forms/admin.glade:3027 msgid "Timekpr-nExT related configuration" msgstr "Ar Timekpr-nExT saistītā konfigurācija" #: resource/client/forms/admin.glade:3054 msgid "Control Timekpr-nExT Settings" msgstr "Pārvaldīt Timekpr-nExT konfigurāciju" #: resource/client/forms/admin.glade:3081 #: resource/client/forms/admin.glade:3233 msgid "" "Timekpr-nExT log level.\n" "\n" "Please do not change this unless you have to. You likely won't find anything " "pretty in the log files.\n" "\n" "Values are: 1 - standard, 2 - debug, 3 - extra debug" msgstr "" "Timekpr-nExT tehniskā žurnāla līmenis.\n" "\n" "Lūdzu nemainīt šo vērtību. Ļoti iespējams, ka neatradīsiet neko interesantu " "žurnāla failos.\n" "\n" "Vērtību nozīme: 1 - standarta līmenis, 2 - atkļūdošanas līmenis, 3 - " "padziļināts atkļūdošanas līmenis" #: resource/client/forms/admin.glade:3101 #: resource/client/forms/admin.glade:3149 msgid "" "Session polling time granularity which specifies how often user sessions and " "activity are checked and accounted.\n" "\n" "3 - 5 seconds are optimal, don't change this if unsure." msgstr "" "Sesiju laika uzskaites biežums, kas nosaka cik bieži tiek aptaujātas " "lietotāju sesijas un uzskaitīts to patērētais laiks.\n" "\n" "3 - 5 sekundes ir optimāli, lūdzu nemainīt bez vajadzības." #: resource/client/forms/admin.glade:3105 msgid "Poll interval" msgstr "Atjaunošanas intervāls" #: resource/client/forms/admin.glade:3117 #: resource/client/forms/admin.glade:3220 msgid "" "Specify the time in seconds when Timekpr-nExT starts continuous real-time " "countdown before enforcing a restriction / lockout to user's sessions." msgstr "" "Norādiet atlikušo laiku sekundēs, pirms kura Timekpr-nExT sāks laika ik " "sekunžu atskaiti pirms piemērot izvēlēto ierobežojumu lietotāja sesijām." #: resource/client/forms/admin.glade:3133 #: resource/client/forms/admin.glade:3183 msgid "" "This specifies the rate in seconds at which actual user state is saved to " "disk.\n" "\n" "To improve performance and still have great accuracy, Timekpr-nExT accounts " "time in memory at \"Poll interval\" frequency, this setting defines a " "frequency at which user state is saved to disk for permanent storage." msgstr "" "Šī vērtība nosaka sekunžu intervālu ar kādu lietotāju uzskaitītais laiks " "tiek saglabāts uz diska.\n" "\n" "Lai nodrošinātu augstu precizitāti nezaudējot ātrdarbību, Timekpr-nExT " "uzskaita laiku atmiņā ar biežumu \"Atjaunošanas intervāls\", savukārt šī " "opcija nodrošina uzskaitītā laika saglabāšanu uz diska ilgtermiņa glabāšanai." #: resource/client/forms/admin.glade:3137 msgid "Save time" msgstr "Saglabāšanas laiks" #: resource/client/forms/admin.glade:3167 #: resource/client/forms/admin.glade:3202 msgid "" "Number of seconds left for user before enforcing a configured restriction / " "lockout to his sessions.\n" "\n" "After this is reached and user is still active, the user's sessions will be " "handled according to specified restriction / lockout, and almost nothing can " "be done to prevent it." msgstr "" "Lietotājam atlikušo sekunžu skaits pirms pielietot izvēlēto ierobežojumu tā " "sesijām.\n" "\n" "Kad šis apjoms tiks sasniegts un lietotājs joprojām būs aktīvs, lietotāja " "sesijām tiks piemērots tam izvēlētais ierobežojums. Sasniedzot šo punktu, " "nav iespējams izdarīt gandrīz neko, lai to novērstu." #: resource/client/forms/admin.glade:3171 msgid "Termination time" msgstr "Izbeigšanas laiks" #: resource/client/forms/admin.glade:3222 msgid "Countdown time" msgstr "Atskaites laiks" #: resource/client/forms/admin.glade:3239 msgid "Log level" msgstr "Žurnāla līmenis" #: resource/client/forms/admin.glade:3250 #: resource/client/forms/admin.glade:3266 msgid "" "Number of seconds left for user's available time before sending a final " "critical notification that time is about to run out.\n" "\n" "NOTE: the rest of the notification times are configurable per user by user " "in client application!" msgstr "" "Atlikušais sekunžu skaits lietotāja atvēlētajam laikam pirms sūtīt kritisku " "paziņojumu par to, ka atvēlētais laiks drīz beigsies.\n" "\n" "PIEZĪME: detalizēta paziņojumu konfigurācija pieejama lietotājam klienta " "aplikācijā!" #: resource/client/forms/admin.glade:3254 msgid "Final notification" msgstr "Pēdējais brīdinājums" #: resource/client/forms/admin.glade:3308 msgid "Control Timekpr-nExT tracking items" msgstr "Pārvaldīt Timekpr-nExT uzskaitāmos lielumus" #: resource/client/forms/admin.glade:3341 msgid "Tracked Sessions" msgstr "Uzskaitāmās sesijas" #: resource/client/forms/admin.glade:3364 msgid "Add tracked session type to the list" msgstr "Pievienot uzskaitīto sesiju tipu sarakstam" #: resource/client/forms/admin.glade:3379 msgid "Remove tracked session type from the list" msgstr "Dzēst uzskaitīto sesiju tipu no saraksta" #: resource/client/forms/admin.glade:3408 msgid "" "List of session types to be tracked.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Uzskaitāmo sesiju saraksts.\n" "\n" "Lūdzu nemainīt vai neeksperimentēt ar šo sarakstu, ja Jums nav pietiekoši " "zināšanu, lai saprastu ko tas nozīmē." #: resource/client/forms/admin.glade:3442 msgid "Excluded Sessions" msgstr "Neuzskaitāmās sesijas" #: resource/client/forms/admin.glade:3465 msgid "Add an excluded session type to the list" msgstr "Pievienot neuzskaitāmo sesiju veidu sarakstam" #: resource/client/forms/admin.glade:3480 msgid "Remove an excluded session type from the list" msgstr "Dzēst neuzskaitāmo sesiju tipu no saraksta" #: resource/client/forms/admin.glade:3509 msgid "" "List of sessions to be excluded from tracking.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" "Neuzskatīto sesiju saraksts - sesiju tipi, kurās pavadītais laiks netiek " "uzskaitīts.\n" "\n" "Lūdzu nemainīt vai neeksperimentēt ar šo sarakstu, ja Jums nav pietiekoši " "zināšanu, lai saprastu ko tas nozīmē." #: resource/client/forms/admin.glade:3543 msgid "Excluded Users" msgstr "Neuzskaitāmie lietotāji" #: resource/client/forms/admin.glade:3566 msgid "Add a user to the exclusion list" msgstr "Pievienot lietotāju neuzskaitāmo lietotāju sarakstam" #: resource/client/forms/admin.glade:3581 msgid "Remove a user from the exclusion list" msgstr "Dzēst lietotāju no neuzskaitāmo lietotāju saraksta" #: resource/client/forms/admin.glade:3610 msgid "" "List of users excluded from tracking.\n" "\n" "Please specify actual usernames, not real names here. For example, \"jsmith" "\", not \"John Smith\"." msgstr "" "Neuzskaitāmo lietotāju saraksts - lietotājvārdi, kuru datorā pavadītais " "laiks netiek uzskaitīts.\n" "\n" "Lūdzu norādīt faktiskos lietotājvārdus nevis vārdus (piem.: lūdzu norādīt " "gmerkelis, nevis \"Garlībs Merķelis\")" #: resource/client/forms/admin.glade:3688 #: resource/client/forms/admin.glade:3707 #: resource/client/forms/admin.glade:3743 msgid "" "This setting controls whether PlayTime functionality is enabled.\n" "\n" "This is a PlayTime master switch, if it's turned off, it's turned off for " "everyone regardless of individual settings!" msgstr "" "Šī opcija iespējo PlayTime funkcionalitāti.\n" "\n" "Šis ir globālas slēdzis, ja opcija tiek atspējota, tā tiek atspējota visiem " "lietotājiem neskatoties uz katra individuālo iestatījumu!" #: resource/client/forms/admin.glade:3692 msgid "PlayTime enabled:" msgstr "PlayTime iespējots:" #: resource/client/forms/admin.glade:3722 msgid "" "This setting controls whether PlayTime activity monitor will use process " "command line, including arguments, for monitoring processes (by default only " "uses the process name).\n" "\n" "When this setting is enabled Timekpr-nExT will perform a match against full " "command line up to 512 characters enabling enhanced process monitoring " "capabilities.\n" "\n" "Please be careful and double check your RegExp patterns in each individual " "user's PlayTime activity masks!" msgstr "" "Šī pazīme nosaka vai PlayTime aktivitāšu meklēšanai sistēmā tiks izmantota " "arī procesa komandrinda ieskaitot procesa parametrus (pēc noklusējuma " "aktivitātes tiek filtrētas tikai pēc procesa nosaukuma).\n" "\n" "Ja pazīme iespējota, Timekpr-nExT meklēs procesus, kas reģistrēti lietotāja " "aktivitāšu sarakstā izmantojot pirmos 512 komandrindas simbolus, tādā veidā " "palielinot procesu meklēšanas iespējas.\n" "\n" "Lūdzu būt uzmanīgiem un rūpīgi pārbaudīt RegExp šablonus katram lietotāja " "aktivitāšu sarakstā esošajam procesam!" #: resource/client/forms/admin.glade:3728 msgid "Enhanced activity monitor:" msgstr "Uzlabotais aktivitāšu meklētājs:" #: resource/client/forms/admin.glade:3777 msgid "Apply Timekpr-nExT settings" msgstr "Iespējot Timekpr-nExT uzstādījumus" #: resource/client/forms/admin.glade:3782 msgid "Apply all Timekpr-nExT settings at once" msgstr "Iespējot visus Timekpr-nExT uzstādījumus vienlaicīgi" #: resource/client/forms/admin.glade:3802 msgid "Timekpr-nExT Administration Configuration" msgstr "Timekpr-nExT pārvaldības iestatījumi" #: resource/client/forms/admin.glade:3803 msgid "Timekpr-nExT Configuration" msgstr "Timekpr-nExT pārvaldība" #: resource/client/forms/admin.glade:3832 #: resource/client/forms/admin.glade:3849 msgid "Status of Timekpr-nExT admin client" msgstr "Timekpr-nExT pārvaldības aplikācijas statuss" #. This is one of the notification priorities #: resource/client/forms/client.glade:27 msgid "Information" msgstr "Informatīvs" #. This is one of the notification priorities #: resource/client/forms/client.glade:31 msgid "Warning" msgstr "Brīdinājums" #. This is one of the notification priorities #: resource/client/forms/client.glade:35 msgid "Severe" msgstr "Svarīgs" #. This is one of the notification priorities #: resource/client/forms/client.glade:39 msgid "Critical" msgstr "Kritisks" #: resource/client/forms/client.glade:133 msgid "Timekpr-nExT client" msgstr "Timekpr-nExT lietotāja aplikācija" #: resource/client/forms/client.glade:164 msgid "Status of Timekpr-nExT client" msgstr "Timekpr-nExT aplikācijas statuss" #: resource/client/forms/client.glade:196 msgid "Save all changes" msgstr "Saglabāt visas izmaiņas" #: resource/client/forms/client.glade:213 msgid "Close the window" msgstr "Aizvērt logu" #: resource/client/forms/client.glade:297 #: resource/client/forms/client.glade:314 msgid "Current effective username" msgstr "Patreizējais faktiskais lietotājs" #: resource/client/forms/client.glade:371 msgid "Current statistics" msgstr "Patreizējā statistika" #: resource/client/forms/client.glade:396 msgid "Time spent this session or after Timekpr-nExT has been restarted" msgstr "" "Izlietotais laiks šajā lietotāja sesijā vai laiks, kas izlietots pēc Timekpr-" "nExT pārstartēšanas" #: resource/client/forms/client.glade:398 msgid "Time spent (session):" msgstr "Izlietotais laiks (sesija):" #: resource/client/forms/client.glade:441 msgid "Time inactive this session or after Timekpr-nExT has been restarted" msgstr "" "Dīkstāves laiks šai sesijai vai dīkstāves laiks no Timekpr-nExT " "pārstartēšanas" #: resource/client/forms/client.glade:443 msgid "Time inactive:" msgstr "Dīkstāves laiks:" #: resource/client/forms/client.glade:469 msgid "Continuous time left to you. May span more than the current day." msgstr "" "Vērtība nosaka, cik ilgi varat lietot datoru nepārtraukti, laika izlietojums " "var pārklāt vairākas dienas." #: resource/client/forms/client.glade:471 msgid "Continuous time left:" msgstr "Nepārtrauktā laika ierobežojums:" #: resource/client/forms/client.glade:487 msgid "Total time available left today in a row, up to the end of the day" msgstr "Nepārtraukti pieejamais laiks šodien līdz pašām dienas beigām" #: resource/client/forms/client.glade:489 #: resource/client/forms/client.glade:974 msgid "Time left today:" msgstr "Atlikušais laiks šodien:" #: resource/client/forms/client.glade:548 msgid "These are the days and limits that are available to you" msgstr "Šeit atrādītas dienas un ierobežojumi, kas attiecas uz Tevi" #: resource/client/forms/client.glade:573 #: resource/client/forms/client.glade:1171 msgid "Days & Limits" msgstr "Diena un ierobežojumi" #: resource/client/forms/client.glade:609 msgid "" "This shows the time intervals that are available for use.\n" "\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead." msgstr "" "Šis saraksts atrāda laika intervālus, kas pieejami lietošanai.\n" "\n" "Opcija \"∞\" norāda, ka laiks kas patērēts šī intervāla ietvaros netiks " "uzskaitīts kā iztērēts, bet gan pieskaitīts dīkstāves laikam." #: resource/client/forms/client.glade:634 msgid "Intervals" msgstr "Intervāli" #: resource/client/forms/client.glade:663 msgid "Daily limits" msgstr "Dienas limiti" #: resource/client/forms/client.glade:691 msgid "Additional statistics" msgstr "Papildus statistika" #: resource/client/forms/client.glade:715 msgid "Time spent this week" msgstr "Izlietotais laiks šajā nedēļā" #: resource/client/forms/client.glade:742 msgid "Time spent this month" msgstr "Izlietotais laiks šajā mēnesī" #: resource/client/forms/client.glade:755 msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account.\n" "This varies among desktop environments." msgstr "" "Šī pazīme nosaka vai laiks, kuru lietotājs pavadījis dīkstāvē tiek " "uzskaitīts.\n" "\n" "Ja pazīme nav iespējota, pavadītais laiks konsolē (ne terminālī) un " "aizslēgtajā sesijā NETIEK uzskaitīts.\n" "Šīs pazīmes darbspēja ļoti atkarīga no grafiskās vides kurā strādājat." #: resource/client/forms/client.glade:760 msgid "Track inactive:" msgstr "Uzskaitīt neaktīvās:" #: resource/client/forms/client.glade:773 msgid "" "Select whether inactive session time is counted. If this is unchecked, time " "spent in console (not terminal emulator) login sessions and while the screen " "is locked is NOT taken into account. This varies among desktop environments." msgstr "" "Šī pazīme nosaka vai laiks, kuru lietotājs pavadījis dīkstāvē tiek " "uzskaitīts, ja pazīme nav iespējota, pavadītais laiks konsolē (ne terminālī) " "un aizslēgtajā sesijā NETIEK uzskaitīts (šīs pazīmes darbspēja ļoti atkarīga " "no grafiskās vides kurā strādājat)" #: resource/client/forms/client.glade:820 #: resource/client/forms/client.glade:918 msgid "Additional limits" msgstr "Papildus limiti" #: resource/client/forms/client.glade:844 msgid "Time limit for this week available to you" msgstr "Laika ierobežojums uz nedēļu, kas pieejams Tavai lietošanai" #: resource/client/forms/client.glade:846 msgid "Time limit (week):" msgstr "Laika ierobežojums (nedēļa):" #: resource/client/forms/client.glade:872 msgid "Time limit for this month available to you" msgstr "Laika ierobežojums uz mēnesi, kas pieejams Tavai lietošanai" #: resource/client/forms/client.glade:874 msgid "Time limit (month):" msgstr "Laika ierobežojums (mēnesis):" #: resource/client/forms/client.glade:948 msgid "Current PlayTime statistics" msgstr "Patreizējā PlayTime statistika" #: resource/client/forms/client.glade:972 msgid "Total PlayTime available left today" msgstr "Kopējais atlikušais PlayTime laiks šodienai" #: resource/client/forms/client.glade:998 msgid "Total PlayTime spent today" msgstr "Kopējais šodien izlietotais PlayTime laiks" #: resource/client/forms/client.glade:1000 msgid "Time spent today:" msgstr "Šodien izlietotais laiks:" #: resource/client/forms/client.glade:1027 #: resource/client/forms/client.glade:1042 msgid "" "This option overrides the default time accounting.\n" "\n" "If it's checked, the time is accounted only when activities in \"Activity / " "application list\" are running, the rest of the time is considered idle." msgstr "" "Šī opcija iespējo alternatīvo laika uzskaiti PlayTime aktivitātēm.\n" "\n" "Ja šī opcija ir iespējota, laiks tiek uzskaitīts tikai tad, ja darbojas kāda " "no PlayTime sarakstā esošajām aplikācijām, savukārt pārējais laiks tiek " "uzskatīts kā dīkstāves laiks." #: resource/client/forms/client.glade:1046 msgid "Time limit override:" msgstr "Alternatīva laika uzskaite:" #: resource/client/forms/client.glade:1060 #: resource/client/forms/client.glade:1073 msgid "Number of currently active PlayTime activities" msgstr "Šobrīd darbojošos PlayTime aktivitāšu skaits" #: resource/client/forms/client.glade:1062 msgid "Running activities:" msgstr "Darbojošās aktivitātes:" #: resource/client/forms/client.glade:1086 #: resource/client/forms/client.glade:1106 msgid "" "Allow activities during unaccounted (\"∞\") time intervals.\n" "\n" "This setting allows to use applications listed in \"Activity / application " "list\" during time intervals which are marked as unaccounted (\"∞\"), if the " "setting is not enabled, none of activities are allowed to run!" msgstr "" "Atļaut lietot aktivitātes neuzskaitītajos (\"∞\") laika intervālos.\n" "\n" "Šī pazīme atļauj lietotājam izmantot aplikācijas, kas reģistrētas sadaļā " "\"Aplikāciju / aktivitāšu saraksts\" intervālos, kas atzīmēti kā " "neuzskaitīti (\"∞\"), ja šī pazīme nav iespējota, neviena no aktivitātēm nav " "atļauta!" #: resource/client/forms/client.glade:1090 msgid "Allowed during \"∞\":" msgstr "Atļauts \"∞\" intervālos:" #: resource/client/forms/client.glade:1148 msgid "" "These are days and limits that available to you as part of PlayTime activity " "restrictions" msgstr "" "Šeit atrādītas dienas un ierobežojumi, kas attiecas uz PlayTime " "funkcionalitāti" #: resource/client/forms/client.glade:1205 msgid "" "This shows activities / applications which are part of PlayTime restrictions" msgstr "" "Šis saraksts atrāda PlayTime aktivitātes / aplikācijas, kas tika iespējotas " "kā daļa no PlayTime ierobežojumiem" #: resource/client/forms/client.glade:1228 msgid "Activity / application list" msgstr "Aktivitāšu / aplikāciju saraksts" #: resource/client/forms/client.glade:1292 msgid "" "Configuration for personalized notifications about available time.\n" "\n" "Please configure notifications as you see fit. However, please keep in mind " "that there will be two types of notifications that cannot be personalized: a " "final warning some time before time ends and a countdown notifications when " "time is about to end.\n" "\n" "The configuration \"Time\" value indicates a value of time left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" "Personalizēta pieejamā laika ziņojumu konfigurācija.\n" "\n" "Lūdzu konfigurē notifikācijas pēc saviem ieskatiem. Lūdzu ņemt vērā, ka ir " "divi paziņojumu veidi, kurus nav iespējams personalizēt: pēdējais " "brīdinājums, kas tiek rādīts kādu laiku pirms pieejamā laika beigām un laika " "atskaites paziņojumi, kas tiek rādīti ļoti īsi pirms laika beigām.\n" "\n" "Vērtība \"Laiks\" nosaka atlikušo laiku, kad paziņojums tiks rādīts, vērtība " "\"Svarīgums\" nosaka ikonas krāsu un paziņojuma veidu, paskaidrojumi zemāk.\n" "\n" "Informācija - tiek rādīta zaļa ikona un informatīvs paziņojums\n" "Brīdinājums - tiek rādīta dzeltena ikona un informatīvs paziņojums\n" "Svarīgs - tiek rādīta sarkana ikona un svarīgs paziņojums\n" "Kritisks - tiek rādīta sarkana ikona un kritisks paziņojums, kurš tipiski " "tiek atrādīts pa virsu visām atvērtajām aplikācijām un paliek atvērts, kamēr " "lietotājs to nav noraidījis, bet tomēr šāda paziņojumu uzvedība ir ļoti " "atkarīga no grafiskās vides, ko lietojat" #: resource/client/forms/client.glade:1324 msgid "Notification configuration" msgstr "Ziņojumu konfigurācija" #: resource/client/forms/client.glade:1346 msgid "Add new notification threshold to the list" msgstr "Pievienot jaunu ziņojumu sarakstam" #: resource/client/forms/client.glade:1361 msgid "Remove notification threshold from the list" msgstr "Dzēst ziņojumu no saraksta" #: resource/client/forms/client.glade:1410 msgid "" "Configuration for personalized notifications about available PlayTime.\n" "\n" "Please configure notifications as you see fit.\n" "\n" "The configuration \"Time\" value indicates a value of PlayTime left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" "Personalizēta pieejamā PlayTime laika ziņojumu konfigurācija.\n" "\n" "Lūdzu konfigurē notifikācijas pēc saviem ieskatiem.\n" "\n" "Vērtība \"Laiks\" nosaka atlikušo PlayTime laiku, kad paziņojums tiks " "rādīts, vērtība \"Svarīgums\" nosaka ikonas krāsu un paziņojuma veidu, " "paskaidrojumi zemāk.\n" "\n" "Informācija - tiek rādīta zaļa ikona un informatīvs paziņojums\n" "Brīdinājums - tiek rādīta dzeltena ikona un informatīvs paziņojums\n" "Svarīgs - tiek rādīta sarkana ikona un svarīgs paziņojums\n" "Kritisks - tiek rādīta sarkana ikona un kritisks paziņojums, kurš tipiski " "tiek atrādīts pa virsu visām atvērtajām aplikācijām un paliek atvērts, kamēr " "lietotājs to nav noraidījis, bet tomēr šāda paziņojumu uzvedība ir ļoti " "atkarīga no grafiskās vides, ko lietojat" #: resource/client/forms/client.glade:1442 msgid "PlayTime notification configuration" msgstr "PlayTime ziņojumu konfigurācija" #: resource/client/forms/client.glade:1464 msgid "Add new PlayTime notification threshold to the list" msgstr "Pievienot jaunu PlayTime ziņojumu sarakstam" #: resource/client/forms/client.glade:1479 msgid "Remove PlayTime notification threshold from the list" msgstr "Dzēst PlayTime notifikāciju no saraksta" #: resource/client/forms/client.glade:1538 msgid "Notifications" msgstr "Paziņojumi" #: resource/client/forms/client.glade:1562 msgid "" "Select whether to use speech notifications, if available.\n" "\n" "You may be able to make speech notifications available by installing package " "\"python3-espeak\"." msgstr "" "Nosaka vai lietot balss notifikācijas, ja opcija nav pieejama, tā būs " "atspējota.\n" "\n" "Ja vēlaties izmantot balss notifikācijas, lūdzu instalēt \"python3-espeak\" " "pakotni." #: resource/client/forms/client.glade:1572 msgid "Use speech notifications" msgstr "Pielietot balss paziņojumus" #: resource/client/forms/client.glade:1591 #: resource/client/forms/client.glade:1613 msgid "" "This sets the logging level.\n" "\n" "Please do not change this unless you know what you're doing." msgstr "" "Tehniskā žurnāla līmenis.\n" "\n" "Lūdzu mainīt tikai tad, ja esat pārliecināts un zinošs, ko tas nozīmē." #: resource/client/forms/client.glade:1617 msgid "Logging level" msgstr "Tehniskā žurnāla līmenis" #: resource/client/forms/client.glade:1639 msgid "" "Specify whether to show a notification when limit configurations or " "allowance changes" msgstr "Nosaka vai rādīt paziņojumu gadījumā, ja ierobežojumi tikuši mainīti" #: resource/client/forms/client.glade:1647 msgid "Show limit changes" msgstr "Paziņot par izmaiņām ierobežojumos" #: resource/client/forms/client.glade:1663 msgid "" "Specify whether to show all notifications.\n" "\n" "If unchecked, then only important ones are shown." msgstr "" "Nosaka, vai atrādīt visus paziņojumus.\n" "\n" "Ja opcija atspējota, rādīti tiek tikai īpaši svarīgi paziņojumi." #: resource/client/forms/client.glade:1673 msgid "Show all notifications" msgstr "Rādīt visus paziņojumus" #: resource/client/forms/client.glade:1689 msgid "" "Specify whether to show seconds in notification area.\n" "\n" "Some desktop environments, like KDE5, do not support text besides " "notification icons." msgstr "" "Nosaka vai atrādīt sekundes blakus ikonai notifikāciju panelī.\n" "\n" "Dažas no grafiskajām vidēm, piemēram KDE5, neatbalsta šādu opciju." #: resource/client/forms/client.glade:1699 msgid "Show seconds in notification area" msgstr "Rādīt sekundes" #: resource/client/forms/client.glade:1718 #: resource/client/forms/client.glade:1742 msgid "" "This sets how long a notification is shown for regular notifications about " "time left and configuration changes.\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed (not recommended for regular " "notifications).\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Šī pazīme nosaka cik ilgi uz ekrāna tiek rādīti standarta paziņojumi par " "laika patēriņu un ierobežojumu izmaiņām.\n" "\n" "Vērtība norādīta sekundēs.\n" "Vērtība 0 nozīmē, ka ziņojums tiks rādīts līdz lietotājs to aizvērs " "pašrocīgi (opcija netiek rekomendēta izmantošanai parastajiem " "paziņojumiem).\n" "\n" "Lūdzu ņemt vērā, ka jūsu lietotā vide var pārtvert šo opciju, kas nozīmē, ka " "šai opcija nebūs nekāda ietekme uz paziņojumiem." #: resource/client/forms/client.glade:1749 msgid "Notification timeout (sec)" msgstr "Pārējo paziņojumu ilgums (sek)" #: resource/client/forms/client.glade:1774 #: resource/client/forms/client.glade:1799 msgid "" "This sets how long a notification is shown for \"Critical\" notifications " "about time left (when the icon turns red).\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed.\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" "Šī pazīme nosaka cik ilgi uz ekrāna tiek rādīti kritiskie paziņojumi (kad " "ikona par laika patēriņu ir sarkana).\n" "\n" "Vērtība norādīta sekundēs.\n" "Vērtība 0 nozīmē, ka ziņojums tiks rādīts līdz lietotājs to aizvērs " "pašrocīgi.\n" "\n" "Lūdzu ņemt vērā, ka jūsu lietotā vide var pārtvert šo opciju, kas nozīmē, ka " "šai opcija nebūs nekāda ietekme uz paziņojumiem." #: resource/client/forms/client.glade:1806 msgid "Critical notification timeout (sec)" msgstr "Kritisko paziņojumu ilgums (sek)" #: resource/client/forms/client.glade:1828 msgid "" "Select whether to use sound \"bell\" (short notification sound) to announce " "a new notification from Timekpr-nExT.\n" "\n" "This works only for enabled notifications.\n" "\n" "If this setting is not editable, your environment does not advertise sound " "notification support." msgstr "" "Šī pazīme nosaka vai paziņojumam jāpievieno īss skaņas signāls brīdi, kad " "tiek parādīts ziņojums no Timekpr-nExT.\n" "\n" "Darbojas tikai tad, ja iespējoti brīdinājumi.\n" "\n" "Ja šī opcija nav rediģējama, tas nozīmē, ka jūsu lietotā vide nepiedāvā šādu " "iespēju." #: resource/client/forms/client.glade:1840 msgid "Use sound \"bell\" for notifications" msgstr "Lieto īsu skaņas signālu paziņojumos" #: resource/client/forms/client.glade:1860 msgid "Configuration" msgstr "Konfigurācija" #~ msgid "" #~ "Copyright (c) 2018-2020 Eduards Bezverhijs\n" #~ "Main test (ex): Rinalds Dobelis\n" #~ "Beta test: SanskritFritz" #~ msgstr "" #~ "Visas tiesības aizsargātas (c) 2018-2020 Eduards Bezverhijs\n" #~ "Galvenais testētājs (bijušais): Rinalds Dobelis\n" #~ "Beta testētājs: SanskritFritz" #~ msgid "PlayTime enablement fot the user has been processed" #~ msgstr "PlayTime iespējošana lietotājam tika apstrādāta" #~ msgid "This shows the time periods that are available for your use" #~ msgstr "Lauks atrāda laika intervālus kas pieejami datora lietošanai" #~ msgid "Timekpr-nExT notification (PlayTime)" #~ msgstr "Timekpr-nExT PlayTime paziņojums" #~ msgid "" #~ "Specify session polling time granularity (how often user sessions and " #~ "activity are checked and accounted).\n" #~ "\n" #~ "3 - 5 seconds are optimal, don't change this if unsure." #~ msgstr "" #~ "Norādiet sesiju laika uzskaitīšanas biežumu (cik bieži tiek aptaujātas " #~ "lietotāju sesijas un uzskaitīts to laiks).\n" #~ "\n" #~ "3 - 5 sekundes ir optimāli, lūdzu nemainīt bez vajadzības." #~ msgid "This specifies the frequency with which actual user state is saved" #~ msgstr "" #~ "Norādiet laika intervālu sekundēs, ik pēc kura lietotāja patērētais laiks " #~ "tiek saglabāts" #~ msgid "m\t" #~ msgstr "m" #~ msgid "00:00:00:00" #~ msgstr "00:00:00:00" #~ msgid "Amount:" #~ msgstr "Daudzums:" #~ msgid "Add" #~ msgstr "Pievienot" #~ msgid "Subtract" #~ msgstr "Noņemt" #~ msgid "Set" #~ msgstr "Uzstādīt" #~ msgid "Configure time limits for week days" #~ msgstr "Pārvaldīt laika ierobežojumus nedēļas dienām" #~ msgid "Set the number of hours to limit available time for particular day" #~ msgstr "Uzstādiet atļauto stundu skaitu izvēlētajai dienai" #~ msgid "" #~ "Set hours and minutes at this user's disposal for this particular day. " #~ "Don't forget to hit the button!" #~ msgstr "" #~ "Uzstādīt atļauto stundu un minūšu apjomu lietotāja vajadzībām. Llūdzu " #~ "neaizmirst nospiest pogu !" #~ msgid "Manage intervals for the day" #~ msgstr "Pārvaldīt intervālus konkrētajai dienai" #~ msgid "Specify START minute of the allowed hour interval" #~ msgstr "Norādiet SĀKUMA minūti atļautajam stundu intervālam" #~ msgid "Specify START hour of the allowed hour interval" #~ msgstr "Norādiet SĀKUMA stundu atļautajam stundu intervālam" #~ msgid "to" #~ msgstr "līdz" #~ msgid "Remove" #~ msgstr "Dzēst" #~ msgid "" #~ "Remove selected interval from the list. Do not forget to hit the " #~ "button!" #~ msgstr "" #~ "Dzēst iezīmēto intervālu no saraksta. Lūdzu neaizmirst nospiest pogu " #~ "!" #~ msgid "" #~ "Add specified hour interval to the list. Do not forget to hit the " #~ "button!" #~ msgstr "" #~ "Pievienot laika intervālu sarakstam. Lūdzu neaizmirst nospiest pogu " #~ "!" #~ msgid "Specify the END hour of the allowed hour interval" #~ msgstr "Norādiet BEIGU stundu atļautajam stundu intervālam" #~ msgid "Specify the END minute of the allowed hour interval" #~ msgstr "Norādiet BEIGU minūti atļautajam stundu intervālam" #~ msgid "Time limit for the month" #~ msgstr "Laika ierobežojums uz mēnesi" #~ msgid "Time limit (month)" #~ msgstr "Laika ierobežojums (mēnesis)" #~ msgid "Time limit for the month is enabled" #~ msgstr "Laika ierobežojums uz mēnesi ir spēkā" #~ msgid "Time limit for the week" #~ msgstr "Laika ierobežojums uz nedēļu" #~ msgid "Time limit (week)" #~ msgstr "Laika ierobežojums (nedēļa)" #~ msgid "day" #~ msgstr "diena" #~ msgid "Week limit (days part)" #~ msgstr "Nedēļas laika ierobežojums (dienas)" #~ msgid "Week limit (hours part)" #~ msgstr "Nedēļas laika ierobežojums (stundas)" #~ msgid "Week limit (minutes part)" #~ msgstr "Nedēļas laika ierobežojums (minūtēs)" #~ msgid "Month limit (days part)" #~ msgstr "Mēneša laika ierobežojums (dienas)" #~ msgid "Month limit (hours part)" #~ msgstr "Mēneša laika ierobežojums (stundas)" #~ msgid "Month limit (minutes part)" #~ msgstr "Mēneša laika ierobežojums (minūtes)" #~ msgid "This allows you to set up weekly and monthly limits" #~ msgstr "Šī sadaļa atļauj mainīt dienas un mēneša laika ierobežojumus" #~ msgid "Apply" #~ msgstr "Iespējot" #~ msgid "Apply weekly and monthly limits" #~ msgstr "Iespējot nedēļas un mēneša ierobežojumus" #~ msgid "Weekly and monthly limit configuration" #~ msgstr "Nedēļas un mēneša laika ierobežojuma konfigurācija" #~ msgid "Set track inactive sessions" #~ msgstr "Uzstādīt neaktīvo sesiju pārbaudi" #~ msgid "Set preference for showing icon to user" #~ msgstr "Uzstādīt slēdzenes un paziņojumu pazīmi izvēlētajam lietotājam" #~ msgid "Set restriction / lockout type" #~ msgstr "Uzstādīt izvēlēto ierobežojumu veidu" #~ msgid "Enter session type to be tracked" #~ msgstr "Ievadiet uzskaitāmo sesiju tipu" #~ msgid "Enter session type to be excluded from tracking" #~ msgstr "Ievadiet neuzskaitāmo sesiju tipu" #~ msgid "Enter username to be excluded from tracking" #~ msgstr "Ievadiet lietotājvārdu kura patērētais laiks netiek uzskaitīts" #~ msgid "suspend / sleep" #~ msgstr "gulēšanas režīms" #~ msgid "lock" #~ msgstr "aizslēgšana" #~ msgid "please-enter-translator-credits" #~ msgstr "Eduards Bezverhijs " #~ msgid "Hide tray icon is not passed" #~ msgstr "Slēdzenes slēpšanas pazīme nav norādīta" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct" #~ msgstr "Slēdzes slēpšanas vērtība \"%%s\" nav korekta" #, python-format #~ msgid "Hide tray icon \"%%s\" is not correct and can not be set" #~ msgstr "Slēdzenes slēpšanas pazīme \"%%s\" nav korekta un uzstādāma" #~ msgid "" #~ "Whether time for inactive sessions are counted, if this is unchecked, " #~ "time spent in console (not terminal) and while screen is locked, is NOT " #~ "taken into account (this very much varies from DE to DE)" #~ msgstr "" #~ "Šis nosaka vai laiks, kuru lietotājs pavadījis dīkstāvē tiek uzskaitīts, " #~ "ja pazīme nav iespējota, pavadītais laiks konsolē (ne terminālī) un " #~ "aizlēgtajā sesijā NETIEK uzskaitīts (šīs pazīmes darbspēja ļoti atkarīga " #~ "no grakiskās vides kurā strādājat)" #~ msgid "Set the amount of minutes to set for particular day" #~ msgstr "Uzstādiet atļauto minūšu skaitu izvēlētajai dienai" #~ msgid "Specify END hour of the allowed minute interval" #~ msgstr "Norādiet BEIGU minūti atļautajam stundu intervālam" timekpr-next/resource/locale/timekpr.pot000664 001750 001750 00000173242 14017261747 022504 0ustar00bezvfedubezvfedu000000 000000 #, fuzzy msgid "" msgstr "" "Project-Id-Version: Timekpr nExT\n" "POT-Creation-Date: 2021-03-01 22:11+0200\n" "PO-Revision-Date: 2019-03-28 09:50+0200\n" "Last-Translator: Eduards Bezverhijs \n" "Language-Team: Eduards Bezverhijs \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.1\n" "X-Poedit-Basepath: ../..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __:1,2\n" "X-Poedit-SearchPath-0: common/constants/messages.py\n" "X-Poedit-SearchPath-1: resource/client/forms\n" #: common/constants/messages.py:31 msgid "==> print help, example" msgstr "" #: common/constants/messages.py:32 msgid "==> get saved user list from the server, example" msgstr "" #: common/constants/messages.py:33 msgid "" "==> get user configuration and time information from the server, example" msgstr "" #: common/constants/messages.py:34 msgid "==> set allowed days for the user, example" msgstr "" #. TRANSLATORS: please DO NOT translate the keyword "ALL" #: common/constants/messages.py:36 msgid "" "==> set allowed hours for the specified day, or \"ALL\" for every day, " "optionally specify start and end minutes in brackets like this [x-y], " "additionally specify ! in front of hour if it doesn't have to be accounted " "(free time for user), example" msgstr "" #: common/constants/messages.py:37 msgid "" "==> set time limits for all allowed days, the number of values must not " "exceed the allowed days for the user, example" msgstr "" #: common/constants/messages.py:38 msgid "==> set time limit per week, example" msgstr "" #: common/constants/messages.py:39 msgid "==> set time limit per month, example" msgstr "" #: common/constants/messages.py:40 msgid "==> set whether to track inactive user sessions, example" msgstr "" #: common/constants/messages.py:41 msgid "==> set whether to hide tray icon and prevent notifications, example" msgstr "" #. TRANSLATORS: please DO NOT translate the keywords: "lock", "suspend", "suspendwake", "terminate", "shutdown" #: common/constants/messages.py:43 msgid "" "==> set restriction / lockout type (\"lock\" - lock session, \"suspend\" - " "suspend the computer, \"suspendwake\" - suspend and wake up, \"terminate\" - " "terminate sessions, \"shutdown\" - shutdown the computer), examples" msgstr "" #: common/constants/messages.py:44 msgid "" "==> set time left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" #: common/constants/messages.py:45 msgid "==> set whether PlayTime is enabled for the user, example" msgstr "" #: common/constants/messages.py:46 msgid "" "==> set whether PlayTime must be accounted instead of normal activity, " "example" msgstr "" #: common/constants/messages.py:47 msgid "" "==> set whether PlayTime activities are allowed during unaccounted (\"∞\") " "intervals, example" msgstr "" #: common/constants/messages.py:48 msgid "==> set allowed days for PlayTime activities, example" msgstr "" #: common/constants/messages.py:49 msgid "" "==> set PlayTime limits for all allowed days, the number of values must not " "exceed the allowed PlayTime allowed days for the user, example" msgstr "" #: common/constants/messages.py:50 msgid "" "==> set PlayTime activity process masks, for which the time is accounted, " "example" msgstr "" #: common/constants/messages.py:51 msgid "" "==> set PlayTime left for the user at the current moment of time: \"+\" (add " "time), \"-\" (subtract time), \"=\" (set exact time available), example (add " "one hour)" msgstr "" #: common/constants/messages.py:54 msgid "Control sessions types are not passed" msgstr "" #: common/constants/messages.py:55 msgid "Control sessions types list is not correct" msgstr "" #: common/constants/messages.py:56 msgid "Control sessions types list is not correct and cannot be set" msgstr "" #: common/constants/messages.py:57 msgid "Excluded session types are not passed" msgstr "" #: common/constants/messages.py:58 msgid "Excluded session types list is not correct" msgstr "" #: common/constants/messages.py:59 msgid "Excluded session types list is not correct and cannot be set" msgstr "" #: common/constants/messages.py:60 msgid "Excluded user list is not passed" msgstr "" #: common/constants/messages.py:61 msgid "Excluded user list is not correct" msgstr "" #: common/constants/messages.py:62 msgid "Excluded user list is not correct and cannot be set" msgstr "" #: common/constants/messages.py:63 msgid "Final warning time is not passed" msgstr "" #: common/constants/messages.py:64 #, python-format msgid "Final warning time \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:65 #, python-format msgid "Final warning time \"%%s\" is not correct and cannot be set" msgstr "" #: common/constants/messages.py:66 msgid "Final notification time is not passed" msgstr "" #: common/constants/messages.py:67 #, python-format msgid "Final notification time \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:68 #, python-format msgid "Final notification time \"%%s\" is not correct and cannot be set" msgstr "" #: common/constants/messages.py:69 msgid "Termination time is not passed" msgstr "" #: common/constants/messages.py:70 #, python-format msgid "Termination time \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:71 #, python-format msgid "Termination time \"%%s\" is not correct and cannot be set" msgstr "" #: common/constants/messages.py:72 msgid "Track inactive is not passed" msgstr "" #: common/constants/messages.py:73 #, python-format msgid "Track inactive \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:74 #, python-format msgid "Track inactive \"%%s\" is not correct and cannot be set" msgstr "" #: common/constants/messages.py:75 msgid "Log level is not passed" msgstr "" #: common/constants/messages.py:76 #, python-format msgid "Log level \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:77 #, python-format msgid "Log level \"%%s\" is not correct and cannot be set" msgstr "" #: common/constants/messages.py:78 msgid "Poll time is not passed" msgstr "" #: common/constants/messages.py:79 #, python-format msgid "Poll time \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:80 #, python-format msgid "Poll time \"%%s\" is not correct and cannot be set" msgstr "" #: common/constants/messages.py:81 msgid "Save time is not passed" msgstr "" #: common/constants/messages.py:82 #, python-format msgid "Save time \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:83 #, python-format msgid "Save time \"%%s\" is not correct and cannot be set" msgstr "" #: common/constants/messages.py:84 msgid "PlayTime flag is not passed" msgstr "" #: common/constants/messages.py:85 #, python-format msgid "PlayTime flag \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:86 #, python-format msgid "PlayTime flag \"%%s\" is not correct and cannot be set" msgstr "" #: common/constants/messages.py:87 msgid "PlayTime enhanced activity monitor flag is not passed" msgstr "" #: common/constants/messages.py:88 #, python-format msgid "PlayTime enhanced activity monitor flag \"%%s\" is not correct" msgstr "" #: common/constants/messages.py:89 #, python-format msgid "" "PlayTime enhanced activity monitor flag \"%%s\" is not correct and cannot be " "set" msgstr "" #: common/constants/messages.py:92 #, python-format msgid "User's \"%%s\" day number must be present" msgstr "" #: common/constants/messages.py:93 #, python-format msgid "User's \"%%s\" day number must be between 1 and 7" msgstr "" #: common/constants/messages.py:94 #, python-format msgid "User's \"%%s\" allowed hours are not correct and cannot be set" msgstr "" #: common/constants/messages.py:95 #, python-format msgid "User's \"%%s\" day list is not passed" msgstr "" #: common/constants/messages.py:96 #, python-format msgid "User's \"%%s\" day list is not correct" msgstr "" #: common/constants/messages.py:97 #, python-format msgid "User's \"%%s\" day list is not correct and cannot be set" msgstr "" #: common/constants/messages.py:98 #, python-format msgid "User's \"%%s\" day limits list is not passed" msgstr "" #: common/constants/messages.py:99 #, python-format msgid "User's \"%%s\" day limits list is not correct" msgstr "" #: common/constants/messages.py:100 #, python-format msgid "User's \"%%s\" day limits list is not correct and cannot be set" msgstr "" #: common/constants/messages.py:101 #, python-format msgid "User's \"%%s\" time operation can be one of these: - + =" msgstr "" #: common/constants/messages.py:102 #, python-format msgid "User's \"%%s\" time limit is not correct" msgstr "" #: common/constants/messages.py:103 #, python-format msgid "User's \"%%s\" time limit is not correct and cannot be set" msgstr "" #: common/constants/messages.py:104 #, python-format msgid "User's \"%%s\" monthly allowance is not passed" msgstr "" #: common/constants/messages.py:105 #, python-format msgid "User's \"%%s\" monthly allowance is not correct" msgstr "" #: common/constants/messages.py:106 #, python-format msgid "User's \"%%s\" monthly allowance is not correct and cannot be set" msgstr "" #: common/constants/messages.py:107 #, python-format msgid "User's \"%%s\" track inactive flag is not passed" msgstr "" #: common/constants/messages.py:108 #, python-format msgid "User's \"%%s\" track inactive flag is not correct" msgstr "" #: common/constants/messages.py:109 #, python-format msgid "User's \"%%s\" track inactive flag is not correct and cannot be set" msgstr "" #: common/constants/messages.py:110 #, python-format msgid "User's \"%%s\" hide tray icon flag is not passed" msgstr "" #: common/constants/messages.py:111 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct" msgstr "" #: common/constants/messages.py:112 #, python-format msgid "User's \"%%s\" hide tray icon flag is not correct and cannot be set" msgstr "" #: common/constants/messages.py:113 #, python-format msgid "User's \"%%s\" restriction / lockout type is not passed" msgstr "" #: common/constants/messages.py:114 #, python-format msgid "User's \"%%s\" restriction / lockout type is not correct" msgstr "" #: common/constants/messages.py:115 #, python-format msgid "" "User's \"%%s\" restriction / lockout type is not correct and cannot be set" msgstr "" #: common/constants/messages.py:116 #, python-format msgid "User's \"%%s\" weekly allowance is not passed" msgstr "" #: common/constants/messages.py:117 #, python-format msgid "User's \"%%s\" weekly allowance is not correct" msgstr "" #: common/constants/messages.py:118 #, python-format msgid "User's \"%%s\" weekly allowance is not correct and cannot be set" msgstr "" #: common/constants/messages.py:119 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not passed" msgstr "" #: common/constants/messages.py:120 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not correct" msgstr "" #: common/constants/messages.py:121 #, python-format msgid "User's \"%%s\" PlayTime enable flag is not correct and cannot be set" msgstr "" #: common/constants/messages.py:122 #, python-format msgid "User's \"%%s\" PlayTime override flag is not passed" msgstr "" #: common/constants/messages.py:123 #, python-format msgid "User's \"%%s\" PlayTime override flag is not correct" msgstr "" #: common/constants/messages.py:124 #, python-format msgid "User's \"%%s\" PlayTime override flag is not correct and cannot be set" msgstr "" #: common/constants/messages.py:125 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "passed" msgstr "" #: common/constants/messages.py:126 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct" msgstr "" #: common/constants/messages.py:127 #, python-format msgid "" "User's \"%%s\" PlayTime allowed during unaccounted intervals flag is not " "correct and cannot be set" msgstr "" #: common/constants/messages.py:128 #, python-format msgid "User's \"%%s\" PlayTime day list is not passed" msgstr "" #: common/constants/messages.py:129 #, python-format msgid "User's \"%%s\" PlayTime day list is not correct" msgstr "" #: common/constants/messages.py:130 #, python-format msgid "User's \"%%s\" PlayTime day list is not correct and cannot be set" msgstr "" #: common/constants/messages.py:131 common/constants/messages.py:134 #, python-format msgid "User's \"%%s\" PlayTime day limits list is not passed" msgstr "" #: common/constants/messages.py:132 common/constants/messages.py:135 #, python-format msgid "User's \"%%s\" PlayTime day limits list is not correct" msgstr "" #: common/constants/messages.py:133 common/constants/messages.py:136 #, python-format msgid "" "User's \"%%s\" PlayTime day limits list is not correct and cannot be set" msgstr "" #: common/constants/messages.py:137 #, python-format msgid "User's \"%%s\" PlayTime operation can be one of these: - + =" msgstr "" #: common/constants/messages.py:138 #, python-format msgid "User's \"%%s\" set PlayTime limit is not correct" msgstr "" #: common/constants/messages.py:139 #, python-format msgid "User's \"%%s\" PlayTime time limit is not correct and cannot be set" msgstr "" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:143 msgid "" "Unexpected ERROR while loading configuration. Please inspect Timekpr-nExT " "log files" msgstr "" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:145 msgid "" "Unexpected ERROR getting configuration. Please inspect Timekpr-nExT log files" msgstr "" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:147 msgid "" "Unexpected ERROR getting user configuration. Please inspect Timekpr-nExT log " "files" msgstr "" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:149 msgid "" "Unexpected ERROR getting user list. Please inspect Timekpr-nExT log files" msgstr "" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:151 msgid "" "Unexpected ERROR updating configuration. Please inspect Timekpr-nExT log " "files" msgstr "" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:153 msgid "" "Unexpected ERROR updating control. Please inspect Timekpr-nExT log files" msgstr "" #: common/constants/messages.py:154 #, python-format msgid "User \"%%s\" configuration is not found" msgstr "" #: common/constants/messages.py:155 #, python-format msgid "User \"%%s\" control file is not found" msgstr "" #: common/constants/messages.py:156 #, python-format msgid "User \"%%s\" is not found" msgstr "" #: common/constants/messages.py:159 msgid "Connected" msgstr "" #: common/constants/messages.py:160 msgid "Connecting..." msgstr "" #: common/constants/messages.py:161 msgid "Failed to connect" msgstr "" #. TRANSLATORS: this message must be 80 symbols long at max #: common/constants/messages.py:163 msgid "" "Please reopen the application if you are superuser and Timekpr-nExT is " "running" msgstr "" #: common/constants/messages.py:164 msgid "Started" msgstr "" #: common/constants/messages.py:165 msgid "User configuration retrieved" msgstr "" #: common/constants/messages.py:166 msgid "Configuration retrieved" msgstr "" #: common/constants/messages.py:167 msgid "Track inactive for user has been processed" msgstr "" #: common/constants/messages.py:168 msgid "Hide tray icon for user has been processed" msgstr "" #: common/constants/messages.py:169 msgid "Restriction / lockout type for user has been processed" msgstr "" #: common/constants/messages.py:170 msgid "Additional time for user has been processed" msgstr "" #: common/constants/messages.py:171 msgid "Additional PlayTime for user has been processed" msgstr "" #: common/constants/messages.py:172 msgid "Weekly and monthly limits for user have been processed" msgstr "" #: common/constants/messages.py:173 msgid "Allowed days for user have been processed" msgstr "" #: common/constants/messages.py:174 msgid "Day time limits for user have been processed" msgstr "" #: common/constants/messages.py:175 msgid "Allowed hours for user have been processed" msgstr "" #: common/constants/messages.py:176 msgid "Timekpr-nExT configuration has been saved" msgstr "" #: common/constants/messages.py:177 msgid "User time limits have been saved" msgstr "" #: common/constants/messages.py:178 msgid "User PlayTime limits have been saved" msgstr "" #: common/constants/messages.py:179 msgid "User additional options have been saved" msgstr "" #: common/constants/messages.py:180 msgid "Enable PlayTime for the user has been processed" msgstr "" #: common/constants/messages.py:181 msgid "PlayTime override flag for the user has been processed" msgstr "" #: common/constants/messages.py:182 msgid "" "PlayTime allowed during unaccounted intervals flag for the user has been " "processed" msgstr "" #: common/constants/messages.py:183 msgid "PlayTime allowed days for user have been processed" msgstr "" #: common/constants/messages.py:184 msgid "PlayTime day limits for user have been processed" msgstr "" #: common/constants/messages.py:185 msgid "PlayTime activities for user have been processed" msgstr "" #: common/constants/messages.py:186 msgid "Please select a day to set the limits" msgstr "" #: common/constants/messages.py:187 msgid "That interval overlaps with an existing one" msgstr "" #: common/constants/messages.py:188 msgid "That interval's start conflicts with an existing one" msgstr "" #: common/constants/messages.py:189 msgid "That interval's end conflicts with an existing one" msgstr "" #: common/constants/messages.py:190 msgid "That interval's start or end duplicates an existing one" msgstr "" #: common/constants/messages.py:191 msgid "Interval start cannot be the same as end" msgstr "" #: common/constants/messages.py:192 msgid "Interval's start cannot be later than end" msgstr "" #: common/constants/messages.py:193 msgid "Please select an hour interval to remove" msgstr "" #: common/constants/messages.py:194 msgid "Interval removed" msgstr "" #: common/constants/messages.py:195 msgid "Timekpr-nExT interface is not yet ready" msgstr "" #: common/constants/messages.py:198 msgid "" "WARNING: Timekpr-nExT administration utility was asked to run in GUI mode, " "but no displays are available, thus running in CLI..." msgstr "" #: common/constants/messages.py:199 msgid "The command is incorrect:" msgstr "" #: common/constants/messages.py:200 msgid "The usage of Timekpr-nExT admin client is as follows:" msgstr "" #: common/constants/messages.py:201 msgid "---=== NOTICE ===---" msgstr "" #: common/constants/messages.py:202 msgid "numeric time values are in seconds" msgstr "" #: common/constants/messages.py:203 msgid "" "weekdays are numbered according to ISO 8601 (i.e. Monday is the first day, " "format: 1-7)" msgstr "" #: common/constants/messages.py:204 msgid "hours are numbered according to ISO 8601 (i.e. 24h clock, format: 0-23)" msgstr "" #: common/constants/messages.py:206 #, python-format msgid "%(n)s user in total:" msgid_plural "%(n)s users in total:" msgstr[0] "" msgstr[1] "" #: common/constants/messages.py:207 #, python-format msgid "Configuration for user %s:" msgstr "" #: common/constants/messages.py:210 msgid "Time left..." msgstr "" #: common/constants/messages.py:211 msgid "Limits & Configuration" msgstr "" #: common/constants/messages.py:212 msgid "About" msgstr "" #: common/constants/messages.py:215 resource/client/forms/about.glade:17 msgid "Keep control of computer usage" msgstr "" #: common/constants/messages.py:216 msgid "Day" msgstr "" #: common/constants/messages.py:217 msgid "Enabled" msgstr "" #: common/constants/messages.py:218 common/constants/messages.py:224 msgid "Limit" msgstr "" #: common/constants/messages.py:219 msgid "From" msgstr "" #: common/constants/messages.py:220 msgid "from..." msgstr "" #: common/constants/messages.py:221 msgid "To" msgstr "" #: common/constants/messages.py:222 msgid "to..." msgstr "" #: common/constants/messages.py:223 msgid "Period" msgstr "" #: common/constants/messages.py:225 msgid "Weekly" msgstr "" #: common/constants/messages.py:226 msgid "Monthly" msgstr "" #: common/constants/messages.py:227 common/constants/messages.py:229 msgid "Session type" msgstr "" #: common/constants/messages.py:228 common/constants/messages.py:230 msgid "session type..." msgstr "" #: common/constants/messages.py:231 msgid "Username" msgstr "" #: common/constants/messages.py:232 msgid "username..." msgstr "" #: common/constants/messages.py:233 msgid "Process mask" msgstr "" #: common/constants/messages.py:234 msgid "executable mask..." msgstr "" #: common/constants/messages.py:235 msgid "Process description" msgstr "" #: common/constants/messages.py:236 msgid "process description..." msgstr "" #: common/constants/messages.py:237 msgid "Time" msgstr "" #: common/constants/messages.py:238 msgid "time..." msgstr "" #: common/constants/messages.py:239 msgid "Importance" msgstr "" #: common/constants/messages.py:240 msgid "importance..." msgstr "" #: common/constants/messages.py:243 msgid "Timekpr-nExT notification" msgstr "" #: common/constants/messages.py:244 msgid "Timekpr-nExT PlayTime notification" msgstr "" #: common/constants/messages.py:245 msgid "Your time is not limited today" msgstr "" #: common/constants/messages.py:246 msgid "Time allowance has changed, please note new time left!" msgstr "" #: common/constants/messages.py:247 msgid "Time limit configuration has changed, please note new configuration!" msgstr "" #: common/constants/messages.py:248 #, python-format msgid "There is a problem connecting to Timekpr-nExT daemon (%%s)!" msgstr "" #: common/constants/messages.py:249 #, python-format msgid "There is a problem communicating to Timekpr-nExT (%%s)!" msgstr "" #: common/constants/messages.py:250 #, python-format msgid "Icon initialization error (%%s)!" msgstr "" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:252 msgid "Your time is up, you will be forcibly logged out in" msgstr "" #. TRANSLATORS: this is a part of message "Your time is up, your computer will be forcibly shutdown in %s seconds", please translate accordingly #: common/constants/messages.py:254 msgid "Your time is up, your computer will be forcibly shutdown in" msgstr "" #. TRANSLATORS: this is a part of message "Your time is up, your session will be forcibly locked in %s seconds", please translate accordingly #: common/constants/messages.py:256 msgid "Your time is up, your session will be forcibly locked in" msgstr "" #. TRANSLATORS: this is a part of message ", Your computer will be forcibly suspended in %s seconds", please translate accordingly #: common/constants/messages.py:258 msgid "Your time is up, your computer will be forcibly suspended in" msgstr "" #. TRANSLATORS: this is a part of message "Your time is up, you will be forcibly logged out in %s seconds", please translate accordingly #: common/constants/messages.py:260 #, python-format msgid "%(n)s second" msgid_plural "%(n)s seconds" msgstr[0] "" msgstr[1] "" #: common/constants/messages.py:261 msgid "Internal connection error, please check log files" msgstr "" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:263 #, python-format msgid "You have %(n)s hour" msgid_plural "You have %(n)s hours" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #: common/constants/messages.py:265 #, python-format msgid "%(n)s minute" msgid_plural "%(n)s minutes" msgstr[0] "" msgstr[1] "" #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) left" please translate accordingly #. TRANSLATORS: this is a part of message "You have %i hour(s), %i minute(s) and %i second(s) of PlayTime left" please translate accordingly #: common/constants/messages.py:267 common/constants/messages.py:269 #, python-format msgid "%(n)s second left" msgid_plural "%(n)s seconds left" msgstr[0] "" msgstr[1] "" #: common/constants/messages.py:269 #, python-format msgid "%(n)s second of PlayTime left" msgid_plural "%(n)s seconds of PlayTime left" msgstr[0] "" msgstr[1] "" #: common/constants/messages.py:270 #, python-format msgid "" "Feature \"%%s\", which is used to detect idle time, cannot be enabled!\n" "Idle / inactive time might not be accounted when screen is locked!" msgstr "" #: common/constants/messages.py:273 #, python-format msgid "UNEXPECTED ERROR: %%s" msgstr "" #: common/constants/messages.py:274 #, python-format msgid "PARAMETER PARSE ERROR (please check parameter validity): %%s" msgstr "" #: common/constants/messages.py:275 msgid "Command FAILED: access denied" msgstr "" #: common/constants/messages.py:276 msgid "Command FAILED: communication was not accepted" msgstr "" #: common/constants/messages.py:277 msgid "n/a" msgstr "" #: resource/client/forms/about.glade:7 msgid "About Timekpr-nExT" msgstr "" #: resource/client/forms/about.glade:16 msgid "Copyright (c) 2018-2021 Eduards Bezverhijs" msgstr "" #: resource/client/forms/about.glade:19 msgid "Timekpr-nExT" msgstr "" #. Please enter GPL3 licence text in your language #: resource/client/forms/about.glade:20 msgctxt "timekpr-next" msgid "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation, either version 3 of the License, or (at your option) " "any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " "more details.\n" "\n" "You should have received a copy of the GNU General Public License along with " "this program. If not, see . In Debian, see " "file /usr/share/common-licenses/GPL-3" msgstr "" #. Please fill in translator credits, each person in new line in format: name.surname@mail.xy, name@mail.xy, nick@mail.xy or so... #: resource/client/forms/about.glade:26 msgid "" "Eduards Bezverhijs \n" "(Translations fine-tuning by JP Lord )\n" "(English fine-tuning by Phil Hudson )" msgstr "" #: resource/client/forms/admin.glade:155 msgid "Remove excluded session type" msgstr "" #: resource/client/forms/admin.glade:385 msgid "Timekpr-nExT administration" msgstr "" #: resource/client/forms/admin.glade:403 resource/client/forms/admin.glade:409 #: resource/client/forms/client.glade:261 msgid "Icon, isn't it?" msgstr "" #: resource/client/forms/admin.glade:432 msgid "Notes, read carefully ;)" msgstr "" #: resource/client/forms/admin.glade:435 msgid "" "This is the configuration app for Timekpr-nExT. It allows you to set time " "limits for your individual users as well as general Timekpr-nExT options.\n" "To use this application, you either have to execute it as superuser or have " "to be part of the timekpr group.\n" "Please note that the \"Timekpr-nExT Configuration\" is available in " "superuser (administrator) mode only!\n" "\n" "Please configure carefully: do not lock yourself out!" msgstr "" #: resource/client/forms/admin.glade:465 resource/client/forms/admin.glade:3016 msgid "Users related configuration" msgstr "" #: resource/client/forms/admin.glade:476 resource/client/forms/client.glade:298 msgid "Username:" msgstr "" #: resource/client/forms/admin.glade:504 resource/client/forms/admin.glade:516 msgid "List of usernames registered on the system" msgstr "" #: resource/client/forms/admin.glade:530 msgid "Restore" msgstr "" #: resource/client/forms/admin.glade:535 msgid "Restore configuration from saved state" msgstr "" #: resource/client/forms/admin.glade:586 msgid "Information about time left / spent" msgstr "" #: resource/client/forms/admin.glade:610 msgid "" "Continuous time left. May span more than the current day (realtime, " "available when user is logged in)" msgstr "" #: resource/client/forms/admin.glade:612 msgid "Time left (actual):" msgstr "" #: resource/client/forms/admin.glade:626 resource/client/forms/admin.glade:657 #: resource/client/forms/admin.glade:688 resource/client/forms/admin.glade:732 #: resource/client/forms/admin.glade:763 resource/client/forms/admin.glade:794 #: resource/client/forms/client.glade:411 #: resource/client/forms/client.glade:425 #: resource/client/forms/client.glade:456 #: resource/client/forms/client.glade:502 #: resource/client/forms/client.glade:728 #: resource/client/forms/client.glade:786 #: resource/client/forms/client.glade:857 #: resource/client/forms/client.glade:885 #: resource/client/forms/client.glade:985 #: resource/client/forms/client.glade:1011 msgid "Format: " msgstr "" #: resource/client/forms/admin.glade:641 msgid "" "How long the user was inactive since last login (realtime, available when " "user is logged in)" msgstr "" #: resource/client/forms/admin.glade:643 msgid "Time inactive (actual):" msgstr "" #: resource/client/forms/admin.glade:672 msgid "Time available today (saved stated, not real-time)" msgstr "" #: resource/client/forms/admin.glade:674 msgid "Time left (today):" msgstr "" #: resource/client/forms/admin.glade:716 msgid "Time spent today (saved stated, not real-time)" msgstr "" #: resource/client/forms/admin.glade:718 msgid "Time spent (today):" msgstr "" #: resource/client/forms/admin.glade:747 msgid "Time spent this week (saved stated, not real-time)" msgstr "" #: resource/client/forms/admin.glade:749 resource/client/forms/client.glade:717 msgid "Time spent (week):" msgstr "" #: resource/client/forms/admin.glade:777 msgid "Time spent this month (saved stated, not real-time)" msgstr "" #: resource/client/forms/admin.glade:779 resource/client/forms/client.glade:744 msgid "Time spent (month):" msgstr "" #: resource/client/forms/admin.glade:861 msgid "Allowance adjustments" msgstr "" #: resource/client/forms/admin.glade:885 msgid "today's time" msgstr "" #: resource/client/forms/admin.glade:889 msgid "Choose this to adjust user's time allowance for today" msgstr "" #: resource/client/forms/admin.glade:901 msgid "PlayTime" msgstr "" #: resource/client/forms/admin.glade:905 msgid "Choose this to adjust user's PlayTime allowance for today" msgstr "" #: resource/client/forms/admin.glade:934 msgid "hr" msgstr "" #: resource/client/forms/admin.glade:945 msgid "The number of minutes to be adjusted for today's limit" msgstr "" #: resource/client/forms/admin.glade:961 msgid "The number of hours to be adjusted for today's limit" msgstr "" #: resource/client/forms/admin.glade:977 msgid "min" msgstr "" #: resource/client/forms/admin.glade:1004 msgid "Add specified time (reward)" msgstr "" #: resource/client/forms/admin.glade:1020 msgid "Subtract specified time (penalty)" msgstr "" #: resource/client/forms/admin.glade:1036 msgid "Set this specific time limit" msgstr "" #: resource/client/forms/admin.glade:1101 msgid "Information about PlayTime" msgstr "" #: resource/client/forms/admin.glade:1134 msgid "" "Actual PlayTime available today (realtime, available when user is logged in)" msgstr "" #: resource/client/forms/admin.glade:1136 msgid "PlayTime left (actual):" msgstr "" #: resource/client/forms/admin.glade:1150 #: resource/client/forms/admin.glade:1181 #: resource/client/forms/admin.glade:1269 msgid "Format: " msgstr "" #: resource/client/forms/admin.glade:1165 msgid "PlayTime available today (saved stated, not real-time)" msgstr "" #: resource/client/forms/admin.glade:1167 msgid "PlayTime left (today):" msgstr "" #: resource/client/forms/admin.glade:1196 #: resource/client/forms/admin.glade:1212 msgid "" "Active PlayTime activity count (realtime, available when user is logged in)" msgstr "" #: resource/client/forms/admin.glade:1198 msgid "Running activities (actual):" msgstr "" #: resource/client/forms/admin.glade:1253 msgid "PlayTime spent today (saved stated, not real-time)" msgstr "" #: resource/client/forms/admin.glade:1255 msgid "PlayTime spent (today):" msgstr "" #: resource/client/forms/admin.glade:1306 msgid "" "Brief information about time spent and everything related to time management " "for this day" msgstr "" #: resource/client/forms/admin.glade:1307 msgid "Info & Today" msgstr "" #: resource/client/forms/admin.glade:1348 msgid "This lets you configure time limits." msgstr "" #: resource/client/forms/admin.glade:1350 msgid "Week day limits" msgstr "" #. This is meant for very short (e.g. one letter) abbreviation of hours #: resource/client/forms/admin.glade:1370 #: resource/client/forms/admin.glade:1865 #: resource/client/forms/admin.glade:2265 msgid "h" msgstr "" #: resource/client/forms/admin.glade:1374 #: resource/client/forms/admin.glade:2269 msgid "Choose hours to be adjusted for selected days." msgstr "" #. This is meant for very short (e.g. one letter) abbreviation of minutes #: resource/client/forms/admin.glade:1386 #: resource/client/forms/admin.glade:1881 #: resource/client/forms/admin.glade:2281 msgid "m" msgstr "" #: resource/client/forms/admin.glade:1390 #: resource/client/forms/admin.glade:2285 msgid "Choose minutes to be adjusted for selected days." msgstr "" #: resource/client/forms/admin.glade:1410 msgid "" "Increase daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:1427 msgid "" "Decrease daily time allowance by selected time unit (hours or minutes) for " "selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:1474 msgid "" "Lists day of the week and additional information about the day's limit.\n" "\n" "Please enable / disable days for the user." msgstr "" #: resource/client/forms/admin.glade:1550 msgid "" "Hour intervals for selected day available to the user.\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead.\n" "\n" "Please note that if the day's limit ends at 24:00 and the next day's limit " "starts at 00:00, then the user can work continuously past midnight.\n" "\n" "Please note that multiple intervals cannot be configured within the same " "hour.\n" "An interval can start or end or contain a specific hour, but not more than " "once. This is by design, not a bug.\n" "\n" msgstr "" #: resource/client/forms/admin.glade:1581 msgid "Hour intervals" msgstr "" #: resource/client/forms/admin.glade:1603 msgid "" "Create a new time interval that will be available to the user.\n" "\n" "After creating the interval, please edit its start and end times directly in " "interval list." msgstr "" #: resource/client/forms/admin.glade:1620 msgid "Delete the selected time interval from the available list of intervals." msgstr "" #: resource/client/forms/admin.glade:1688 msgid "enter hour intervals" msgstr "" #: resource/client/forms/admin.glade:1742 msgid "verify" msgstr "" #: resource/client/forms/admin.glade:1746 msgid "" "Verify configured time intervals. This is a mandatory step to ensure that " "intervals are correct.\n" "\n" "Intervals which have problems will be highlighted." msgstr "" #: resource/client/forms/admin.glade:1821 msgid "Weekly and monthly limits" msgstr "" #. This is meant for very short (e.g. one letter) abbreviation of days #: resource/client/forms/admin.glade:1849 msgid "d" msgstr "" #: resource/client/forms/admin.glade:1853 msgid "Choose days to be adjusted for selected period." msgstr "" #: resource/client/forms/admin.glade:1869 msgid "Choose hours to be adjusted for selected period." msgstr "" #: resource/client/forms/admin.glade:1885 msgid "Choose minutes to be adjusted for selected period." msgstr "" #: resource/client/forms/admin.glade:1913 msgid "" "Increase weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" #: resource/client/forms/admin.glade:1927 msgid "" "Decrease weekly or monthly time allowance by selected time unit (days or " "hours or minutes) for the selected period." msgstr "" #: resource/client/forms/admin.glade:1976 msgid "" "Weekly and monthly limits for the user.\n" "\n" "These limits are applied to user together with the rest of limit " "configuration." msgstr "" #: resource/client/forms/admin.glade:2016 msgid "Apply daily limits" msgstr "" #: resource/client/forms/admin.glade:2021 msgid "Apply limit all changes made in this page" msgstr "" #: resource/client/forms/admin.glade:2042 msgid "Daily limit configuration for all week days" msgstr "" #: resource/client/forms/admin.glade:2043 msgid "Limit configuration" msgstr "" #: resource/client/forms/admin.glade:2064 msgid "Settings for PlayTime activities" msgstr "" #: resource/client/forms/admin.glade:2084 msgid "PlayTime options" msgstr "" #: resource/client/forms/admin.glade:2108 #: resource/client/forms/admin.glade:2147 msgid "Enable PlayTime for selected user" msgstr "" #: resource/client/forms/admin.glade:2110 msgid "Enable PlayTime:" msgstr "" #: resource/client/forms/admin.glade:2124 #: resource/client/forms/admin.glade:2161 msgid "" "Enable PlayTime override for selected user.\n" "\n" "This setting overrides time accounting in a way that time is accounted only " "when at least one of the applications on the PlayTime activity list are " "running!\n" "\n" "This affects only time accounting, intervals are still fully enforced!\n" "\n" "If no processes are running, time is accounted as idle thus effectively it's " "free time for user!" msgstr "" #: resource/client/forms/admin.glade:2132 msgid "Enable PlayTime override:" msgstr "" #: resource/client/forms/admin.glade:2180 #: resource/client/forms/admin.glade:2201 msgid "" "Allow PlayTime activities during unaccounted (\"∞\") time intervals for " "selected user.\n" "\n" "This setting allows the user to use applications configured in his PlayTime " "activity list during time intervals which are marked as unaccounted (\"∞" "\").\n" "\n" "If this setting is enabled, the use of activities will not be accounted " "towards PlayTime limits, otherwise applications in PlayTime activity list " "will be terminated as soon as they are started during unaccounted (\"∞\") " "time intervals." msgstr "" #: resource/client/forms/admin.glade:2186 msgid "Allowed during \"∞\" intervals:" msgstr "" #: resource/client/forms/admin.glade:2245 msgid "This lets you configure PlayTime limits." msgstr "" #: resource/client/forms/admin.glade:2247 #: resource/client/forms/client.glade:1253 msgid "PlayTime limits" msgstr "" #: resource/client/forms/admin.glade:2305 msgid "" "Increase daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:2322 msgid "" "Decrease daily PlayTime allowance by selected time unit (hours or minutes) " "for selected days.\n" "\n" "Please note, that you may select more than one day for the adjustment!" msgstr "" #: resource/client/forms/admin.glade:2374 msgid "" "Lists day of the week and additional information about the day's PlayTime " "limit.\n" "\n" "Please enable / disable days for the user and set time allowance for " "PlayTime activities." msgstr "" #: resource/client/forms/admin.glade:2423 msgid "PlayTime activities" msgstr "" #: resource/client/forms/admin.glade:2445 msgid "" "Add new PlayTime activity.\n" "\n" "Please specify activity mask and user friendly description in the activity " "list directly." msgstr "" #: resource/client/forms/admin.glade:2462 msgid "Remove selected entry from PlayTime activities." msgstr "" #: resource/client/forms/admin.glade:2506 msgid "" "Please specify a list of full process (executable) names without path as " "case sensitive strings to be monitored in the system.\n" "\n" "It's possible to specify RegExp masks for processes too, but please be very " "careful about them as misusing this setting may lead to killing unwanted " "processes for the user!\n" "\n" "NOTE: RegExp is an expert setting!" msgstr "" #: resource/client/forms/admin.glade:2546 msgid "Apply PlayTime configuration" msgstr "" #: resource/client/forms/admin.glade:2550 msgid "Apply PlayTime limits and configuration changes on this page" msgstr "" #: resource/client/forms/admin.glade:2569 msgid "PlayTime configuration" msgstr "" #: resource/client/forms/admin.glade:2594 msgid "Additional configuration options" msgstr "" #: resource/client/forms/admin.glade:2629 #: resource/client/forms/admin.glade:2652 msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account. This " "varies among desktop environments." msgstr "" #: resource/client/forms/admin.glade:2633 msgid "Track inactive sessions:" msgstr "" #: resource/client/forms/admin.glade:2669 #: resource/client/forms/admin.glade:2692 msgid "" "Select whether to show Timekpr-next's padlock icon and notifications to the " "user.\n" "\n" "Please note that unchecking this will disable showing all information and " "notifications to the user!" msgstr "" #: resource/client/forms/admin.glade:2673 msgid "Hide icon and notifications:" msgstr "" #: resource/client/forms/admin.glade:2744 msgid "" "Select a restriction / lockout type for the user.\n" "\n" "NOTE: please be very careful, think ahead and read every options description " "when changing this setting from default value!" msgstr "" #: resource/client/forms/admin.glade:2748 msgid "Restriction / lockout type:" msgstr "" #: resource/client/forms/admin.glade:2770 msgid "terminate sessions" msgstr "" #: resource/client/forms/admin.glade:2774 msgid "" "When time ends, user sessions will be terminated.\n" "\n" "This option is a restriction!\n" "\n" "This is the default option and most likely is the one you need!" msgstr "" #: resource/client/forms/admin.glade:2792 msgid "shutdown computer" msgstr "" #: resource/client/forms/admin.glade:2796 msgid "" "When time ends, computer will be shut down.\n" "\n" "This option is a restriction!\n" "\n" "Please evaluate whether you need this type of restriction!" msgstr "" #: resource/client/forms/admin.glade:2814 msgid "suspend computer" msgstr "" #: resource/client/forms/admin.glade:2818 msgid "" "When time ends, computer will be suspended (put to sleep).\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" #: resource/client/forms/admin.glade:2836 msgid "suspend / wakeup computer" msgstr "" #: resource/client/forms/admin.glade:2840 msgid "" "When time ends, computer will be suspended (put to sleep) and will be woken " "up at start of next available time interval for the user.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes.\n" "\n" "When woken up when there is still no time left, computer screen will be " "locked and put to sleep again after some time." msgstr "" #: resource/client/forms/admin.glade:2858 msgid "lock screen" msgstr "" #: resource/client/forms/admin.glade:2862 msgid "" "When time ends, computer screen will be locked.\n" "\n" "This option is not a restriction and is more suited for self control " "purposes." msgstr "" #: resource/client/forms/admin.glade:2893 msgid "" "Select a time interval when computer can be woken up automatically.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" #: resource/client/forms/admin.glade:2897 msgid "Wakeup hour interval:" msgstr "" #: resource/client/forms/admin.glade:2909 msgid "" "Enter start hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" #: resource/client/forms/admin.glade:2928 msgid "" "Enter end hour for the automatic wakeup function.\n" "\n" "Please note that this option is only effective if wake up by RealTime Clock " "is supported and enabled in BIOS / UEFI!" msgstr "" #: resource/client/forms/admin.glade:2966 msgid "Apply configuration" msgstr "" #: resource/client/forms/admin.glade:2970 msgid "Apply additional configuration changes on this page" msgstr "" #: resource/client/forms/admin.glade:2989 msgid "Additional configuration" msgstr "" #: resource/client/forms/admin.glade:2990 #: resource/client/forms/admin.glade:3661 msgid "Additional options" msgstr "" #: resource/client/forms/admin.glade:3017 msgid "User Configuration" msgstr "" #: resource/client/forms/admin.glade:3027 msgid "Timekpr-nExT related configuration" msgstr "" #: resource/client/forms/admin.glade:3054 msgid "Control Timekpr-nExT Settings" msgstr "" #: resource/client/forms/admin.glade:3081 #: resource/client/forms/admin.glade:3233 msgid "" "Timekpr-nExT log level.\n" "\n" "Please do not change this unless you have to. You likely won't find anything " "pretty in the log files.\n" "\n" "Values are: 1 - standard, 2 - debug, 3 - extra debug" msgstr "" #: resource/client/forms/admin.glade:3101 #: resource/client/forms/admin.glade:3149 msgid "" "Session polling time granularity which specifies how often user sessions and " "activity are checked and accounted.\n" "\n" "3 - 5 seconds are optimal, don't change this if unsure." msgstr "" #: resource/client/forms/admin.glade:3105 msgid "Poll interval" msgstr "" #: resource/client/forms/admin.glade:3117 #: resource/client/forms/admin.glade:3220 msgid "" "Specify the time in seconds when Timekpr-nExT starts continuous real-time " "countdown before enforcing a restriction / lockout to user's sessions." msgstr "" #: resource/client/forms/admin.glade:3133 #: resource/client/forms/admin.glade:3183 msgid "" "This specifies the rate in seconds at which actual user state is saved to " "disk.\n" "\n" "To improve performance and still have great accuracy, Timekpr-nExT accounts " "time in memory at \"Poll interval\" frequency, this setting defines a " "frequency at which user state is saved to disk for permanent storage." msgstr "" #: resource/client/forms/admin.glade:3137 msgid "Save time" msgstr "" #: resource/client/forms/admin.glade:3167 #: resource/client/forms/admin.glade:3202 msgid "" "Number of seconds left for user before enforcing a configured restriction / " "lockout to his sessions.\n" "\n" "After this is reached and user is still active, the user's sessions will be " "handled according to specified restriction / lockout, and almost nothing can " "be done to prevent it." msgstr "" #: resource/client/forms/admin.glade:3171 msgid "Termination time" msgstr "" #: resource/client/forms/admin.glade:3222 msgid "Countdown time" msgstr "" #: resource/client/forms/admin.glade:3239 msgid "Log level" msgstr "" #: resource/client/forms/admin.glade:3250 #: resource/client/forms/admin.glade:3266 msgid "" "Number of seconds left for user's available time before sending a final " "critical notification that time is about to run out.\n" "\n" "NOTE: the rest of the notification times are configurable per user by user " "in client application!" msgstr "" #: resource/client/forms/admin.glade:3254 msgid "Final notification" msgstr "" #: resource/client/forms/admin.glade:3308 msgid "Control Timekpr-nExT tracking items" msgstr "" #: resource/client/forms/admin.glade:3341 msgid "Tracked Sessions" msgstr "" #: resource/client/forms/admin.glade:3364 msgid "Add tracked session type to the list" msgstr "" #: resource/client/forms/admin.glade:3379 msgid "Remove tracked session type from the list" msgstr "" #: resource/client/forms/admin.glade:3408 msgid "" "List of session types to be tracked.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" #: resource/client/forms/admin.glade:3442 msgid "Excluded Sessions" msgstr "" #: resource/client/forms/admin.glade:3465 msgid "Add an excluded session type to the list" msgstr "" #: resource/client/forms/admin.glade:3480 msgid "Remove an excluded session type from the list" msgstr "" #: resource/client/forms/admin.glade:3509 msgid "" "List of sessions to be excluded from tracking.\n" "\n" "Please, do not change or experiment with this unless you actually (not " "wishfully) know what you are doing." msgstr "" #: resource/client/forms/admin.glade:3543 msgid "Excluded Users" msgstr "" #: resource/client/forms/admin.glade:3566 msgid "Add a user to the exclusion list" msgstr "" #: resource/client/forms/admin.glade:3581 msgid "Remove a user from the exclusion list" msgstr "" #: resource/client/forms/admin.glade:3610 msgid "" "List of users excluded from tracking.\n" "\n" "Please specify actual usernames, not real names here. For example, \"jsmith" "\", not \"John Smith\"." msgstr "" #: resource/client/forms/admin.glade:3688 #: resource/client/forms/admin.glade:3707 #: resource/client/forms/admin.glade:3743 msgid "" "This setting controls whether PlayTime functionality is enabled.\n" "\n" "This is a PlayTime master switch, if it's turned off, it's turned off for " "everyone regardless of individual settings!" msgstr "" #: resource/client/forms/admin.glade:3692 msgid "PlayTime enabled:" msgstr "" #: resource/client/forms/admin.glade:3722 msgid "" "This setting controls whether PlayTime activity monitor will use process " "command line, including arguments, for monitoring processes (by default only " "uses the process name).\n" "\n" "When this setting is enabled Timekpr-nExT will perform a match against full " "command line up to 512 characters enabling enhanced process monitoring " "capabilities.\n" "\n" "Please be careful and double check your RegExp patterns in each individual " "user's PlayTime activity masks!" msgstr "" #: resource/client/forms/admin.glade:3728 msgid "Enhanced activity monitor:" msgstr "" #: resource/client/forms/admin.glade:3777 msgid "Apply Timekpr-nExT settings" msgstr "" #: resource/client/forms/admin.glade:3782 msgid "Apply all Timekpr-nExT settings at once" msgstr "" #: resource/client/forms/admin.glade:3802 msgid "Timekpr-nExT Administration Configuration" msgstr "" #: resource/client/forms/admin.glade:3803 msgid "Timekpr-nExT Configuration" msgstr "" #: resource/client/forms/admin.glade:3832 #: resource/client/forms/admin.glade:3849 msgid "Status of Timekpr-nExT admin client" msgstr "" #. This is one of the notification priorities #: resource/client/forms/client.glade:27 msgid "Information" msgstr "" #. This is one of the notification priorities #: resource/client/forms/client.glade:31 msgid "Warning" msgstr "" #. This is one of the notification priorities #: resource/client/forms/client.glade:35 msgid "Severe" msgstr "" #. This is one of the notification priorities #: resource/client/forms/client.glade:39 msgid "Critical" msgstr "" #: resource/client/forms/client.glade:133 msgid "Timekpr-nExT client" msgstr "" #: resource/client/forms/client.glade:164 msgid "Status of Timekpr-nExT client" msgstr "" #: resource/client/forms/client.glade:196 msgid "Save all changes" msgstr "" #: resource/client/forms/client.glade:213 msgid "Close the window" msgstr "" #: resource/client/forms/client.glade:297 #: resource/client/forms/client.glade:314 msgid "Current effective username" msgstr "" #: resource/client/forms/client.glade:371 msgid "Current statistics" msgstr "" #: resource/client/forms/client.glade:396 msgid "Time spent this session or after Timekpr-nExT has been restarted" msgstr "" #: resource/client/forms/client.glade:398 msgid "Time spent (session):" msgstr "" #: resource/client/forms/client.glade:441 msgid "Time inactive this session or after Timekpr-nExT has been restarted" msgstr "" #: resource/client/forms/client.glade:443 msgid "Time inactive:" msgstr "" #: resource/client/forms/client.glade:469 msgid "Continuous time left to you. May span more than the current day." msgstr "" #: resource/client/forms/client.glade:471 msgid "Continuous time left:" msgstr "" #: resource/client/forms/client.glade:487 msgid "Total time available left today in a row, up to the end of the day" msgstr "" #: resource/client/forms/client.glade:489 #: resource/client/forms/client.glade:974 msgid "Time left today:" msgstr "" #: resource/client/forms/client.glade:548 msgid "These are the days and limits that are available to you" msgstr "" #: resource/client/forms/client.glade:573 #: resource/client/forms/client.glade:1171 msgid "Days & Limits" msgstr "" #: resource/client/forms/client.glade:609 msgid "" "This shows the time intervals that are available for use.\n" "\n" "Option \"∞\" indicates that time spent during this interval will not be " "accounted towards the daily limit, it will be accounted as idle instead." msgstr "" #: resource/client/forms/client.glade:634 msgid "Intervals" msgstr "" #: resource/client/forms/client.glade:663 msgid "Daily limits" msgstr "" #: resource/client/forms/client.glade:691 msgid "Additional statistics" msgstr "" #: resource/client/forms/client.glade:715 msgid "Time spent this week" msgstr "" #: resource/client/forms/client.glade:742 msgid "Time spent this month" msgstr "" #: resource/client/forms/client.glade:755 msgid "" "Select whether inactive session time is counted.\n" "\n" "If this is unchecked, time spent in console (not terminal emulator) login " "sessions and while the screen is locked is NOT taken into account.\n" "This varies among desktop environments." msgstr "" #: resource/client/forms/client.glade:760 msgid "Track inactive:" msgstr "" #: resource/client/forms/client.glade:773 msgid "" "Select whether inactive session time is counted. If this is unchecked, time " "spent in console (not terminal emulator) login sessions and while the screen " "is locked is NOT taken into account. This varies among desktop environments." msgstr "" #: resource/client/forms/client.glade:820 #: resource/client/forms/client.glade:918 msgid "Additional limits" msgstr "" #: resource/client/forms/client.glade:844 msgid "Time limit for this week available to you" msgstr "" #: resource/client/forms/client.glade:846 msgid "Time limit (week):" msgstr "" #: resource/client/forms/client.glade:872 msgid "Time limit for this month available to you" msgstr "" #: resource/client/forms/client.glade:874 msgid "Time limit (month):" msgstr "" #: resource/client/forms/client.glade:948 msgid "Current PlayTime statistics" msgstr "" #: resource/client/forms/client.glade:972 msgid "Total PlayTime available left today" msgstr "" #: resource/client/forms/client.glade:998 msgid "Total PlayTime spent today" msgstr "" #: resource/client/forms/client.glade:1000 msgid "Time spent today:" msgstr "" #: resource/client/forms/client.glade:1027 #: resource/client/forms/client.glade:1042 msgid "" "This option overrides the default time accounting.\n" "\n" "If it's checked, the time is accounted only when activities in \"Activity / " "application list\" are running, the rest of the time is considered idle." msgstr "" #: resource/client/forms/client.glade:1046 msgid "Time limit override:" msgstr "" #: resource/client/forms/client.glade:1060 #: resource/client/forms/client.glade:1073 msgid "Number of currently active PlayTime activities" msgstr "" #: resource/client/forms/client.glade:1062 msgid "Running activities:" msgstr "" #: resource/client/forms/client.glade:1086 #: resource/client/forms/client.glade:1106 msgid "" "Allow activities during unaccounted (\"∞\") time intervals.\n" "\n" "This setting allows to use applications listed in \"Activity / application " "list\" during time intervals which are marked as unaccounted (\"∞\"), if the " "setting is not enabled, none of activities are allowed to run!" msgstr "" #: resource/client/forms/client.glade:1090 msgid "Allowed during \"∞\":" msgstr "" #: resource/client/forms/client.glade:1148 msgid "" "These are days and limits that available to you as part of PlayTime activity " "restrictions" msgstr "" #: resource/client/forms/client.glade:1205 msgid "" "This shows activities / applications which are part of PlayTime restrictions" msgstr "" #: resource/client/forms/client.glade:1228 msgid "Activity / application list" msgstr "" #: resource/client/forms/client.glade:1292 msgid "" "Configuration for personalized notifications about available time.\n" "\n" "Please configure notifications as you see fit. However, please keep in mind " "that there will be two types of notifications that cannot be personalized: a " "final warning some time before time ends and a countdown notifications when " "time is about to end.\n" "\n" "The configuration \"Time\" value indicates a value of time left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" #: resource/client/forms/client.glade:1324 msgid "Notification configuration" msgstr "" #: resource/client/forms/client.glade:1346 msgid "Add new notification threshold to the list" msgstr "" #: resource/client/forms/client.glade:1361 msgid "Remove notification threshold from the list" msgstr "" #: resource/client/forms/client.glade:1410 msgid "" "Configuration for personalized notifications about available PlayTime.\n" "\n" "Please configure notifications as you see fit.\n" "\n" "The configuration \"Time\" value indicates a value of PlayTime left when " "notification will be shown, the \"Importance\" option governs an icon colour " "and notification properties as follows.\n" "\n" "Information - a green icon and an informational notification will be shown\n" "Warning - a yellow icon and an informational notification will be shown\n" "Severe - a red icon and important notification will be shown\n" "Critical - a red icon and critical notification will be shown, this " "notification usually is shown over all open applications and stays open " "until dismissed, however this behaviour highly depends on Desktop " "Environment in use" msgstr "" #: resource/client/forms/client.glade:1442 msgid "PlayTime notification configuration" msgstr "" #: resource/client/forms/client.glade:1464 msgid "Add new PlayTime notification threshold to the list" msgstr "" #: resource/client/forms/client.glade:1479 msgid "Remove PlayTime notification threshold from the list" msgstr "" #: resource/client/forms/client.glade:1538 msgid "Notifications" msgstr "" #: resource/client/forms/client.glade:1562 msgid "" "Select whether to use speech notifications, if available.\n" "\n" "You may be able to make speech notifications available by installing package " "\"python3-espeak\"." msgstr "" #: resource/client/forms/client.glade:1572 msgid "Use speech notifications" msgstr "" #: resource/client/forms/client.glade:1591 #: resource/client/forms/client.glade:1613 msgid "" "This sets the logging level.\n" "\n" "Please do not change this unless you know what you're doing." msgstr "" #: resource/client/forms/client.glade:1617 msgid "Logging level" msgstr "" #: resource/client/forms/client.glade:1639 msgid "" "Specify whether to show a notification when limit configurations or " "allowance changes" msgstr "" #: resource/client/forms/client.glade:1647 msgid "Show limit changes" msgstr "" #: resource/client/forms/client.glade:1663 msgid "" "Specify whether to show all notifications.\n" "\n" "If unchecked, then only important ones are shown." msgstr "" #: resource/client/forms/client.glade:1673 msgid "Show all notifications" msgstr "" #: resource/client/forms/client.glade:1689 msgid "" "Specify whether to show seconds in notification area.\n" "\n" "Some desktop environments, like KDE5, do not support text besides " "notification icons." msgstr "" #: resource/client/forms/client.glade:1699 msgid "Show seconds in notification area" msgstr "" #: resource/client/forms/client.glade:1718 #: resource/client/forms/client.glade:1742 msgid "" "This sets how long a notification is shown for regular notifications about " "time left and configuration changes.\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed (not recommended for regular " "notifications).\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" #: resource/client/forms/client.glade:1749 msgid "Notification timeout (sec)" msgstr "" #: resource/client/forms/client.glade:1774 #: resource/client/forms/client.glade:1799 msgid "" "This sets how long a notification is shown for \"Critical\" notifications " "about time left (when the icon turns red).\n" "\n" "The value is specified in seconds.\n" "A value of 0 means show until dismissed.\n" "\n" "Please note that the desktop environment you use may override this timeout, " "in which case this setting will not have any effect on notification." msgstr "" #: resource/client/forms/client.glade:1806 msgid "Critical notification timeout (sec)" msgstr "" #: resource/client/forms/client.glade:1828 msgid "" "Select whether to use sound \"bell\" (short notification sound) to announce " "a new notification from Timekpr-nExT.\n" "\n" "This works only for enabled notifications.\n" "\n" "If this setting is not editable, your environment does not advertise sound " "notification support." msgstr "" #: resource/client/forms/client.glade:1840 msgid "Use sound \"bell\" for notifications" msgstr "" #: resource/client/forms/client.glade:1860 msgid "Configuration" msgstr "" timekpr-next/resource/server/000775 001750 001750 00000000000 14017261747 020343 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/server/systemd/000775 001750 001750 00000000000 13716566163 022040 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/server/systemd/timekpr.service000664 001750 001750 00000000534 13716566163 025077 0ustar00bezvfedubezvfedu000000 000000 [Unit] Description=Timekpr-nExT daemon service Documentation=file:/etc/timekpr/timekpr.conf After=multi-user.target [Service] Type=simple User=root WorkingDirectory=/usr/lib/python3/dist-packages/timekpr/ ExecStart=/usr/bin/timekprd StandardOutput=syslog StandardError=syslog Restart=on-failure RestartSec=30 [Install] WantedBy=multi-user.target timekpr-next/resource/server/USER.time000664 001750 001750 00000000654 13772711236 022006 0ustar00bezvfedubezvfedu000000 000000 [USER] # total spent time balance for today TIME_SPENT_BALANCE = 0 # total actual spent for today TIME_SPENT_DAY = 0 # total spent for this week TIME_SPENT_WEEK = 0 # total spent for this month TIME_SPENT_MONTH = 0 # last update time of the file LAST_CHECKED = 2020-06-15 19:51:49 [USER.PLAYTIME] # total PlayTime balance spent for this day PLAYTIME_SPENT_BALANCE = 0 # total PlayTime spent for this day PLAYTIME_SPENT_DAY = 0 timekpr-next/resource/server/timekpr.conf000664 001750 001750 00000004725 14017261747 022675 0ustar00bezvfedubezvfedu000000 000000 [DOCUMENTATION] #### this is the main configuration file for timekpr-next #### if this file cannot be read properly, it will be overwritten with defaults [GENERAL] #### general configuration section # this defines logging level of the timekpr (1 - normal, 2 - debug, 3 - extra debug) TIMEKPR_LOGLEVEL = 2 # this defines polling time (in memory) in seconds TIMEKPR_POLLTIME = 3 # this defines a time for saving user time control file (polling and accounting is done in memory more often, but saving is not) TIMEKPR_SAVE_TIME = 30 # this defines whether to account sessions which are inactive (locked screen, user switched away from desktop, etc.), # new users, when created, will inherit this value TIMEKPR_TRACK_INACTIVE = False # this defines a time interval in seconds prior to assign user a termination sequence # 15 seconds before time ends nothing can be done to avoid killing a session # this also is the time before initiating a termination sequence if user has logged in inappropriate time TIMEKPR_TERMINATION_TIME = 15 # this defines a time interval prior to termination of user sessions when timekpr will send continous final warnings (countdown) until the actual termination TIMEKPR_FINAL_WARNING_TIME = 10 # this defines a time interval prior to termination of user sessions when timekpr will send one final warning about time left TIMEKPR_FINAL_NOTIFICATION_TIME = 60 [SESSION] #### this section contains configuration about sessions # session types timekpr will track TIMEKPR_SESSION_TYPES_CTRL = x11;wayland;mir # session types timekpr will ignore explicitly TIMEKPR_SESSION_TYPES_EXCL = tty;unspecified # users timekpr will ignore explicitly TIMEKPR_USERS_EXCL = testtimekpr;gdm;kdm;lightdm;mdm;lxdm;xdm;sddm;cdm [DIRECTORIES] #### this section contains directory configuration # runtime directory for timekpr user configuration files TIMEKPR_CONFIG_DIR = /var/lib/timekpr/config # runtime directory for timekpr time control files TIMEKPR_WORK_DIR = /var/lib/timekpr/work # directory for shared files (images, gui definitions, etc.) TIMEKPR_SHARED_DIR = /usr/share/timekpr # directory for log files TIMEKPR_LOGFILE_DIR = /var/log [PLAYTIME] #### this section contains global PlayTime activity configuration # whether PlayTime is enabled globally TIMEKPR_PLAYTIME_ENABLED = False # whether PlayTime activity monitor will use process command line, including arguments, for monitoring processes (by default only uses the process name) TIMEKPR_PLAYTIME_ENHANCED_ACTIVITY_MONITOR_ENABLED = False timekpr-next/resource/server/logrotate.d/000775 001750 001750 00000000000 13476006650 022563 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/server/logrotate.d/timekpr000664 001750 001750 00000000160 13476006650 024156 0ustar00bezvfedubezvfedu000000 000000 /var/log/timekpr*.log { daily rotate 7 notifempty copytruncate missingok compress delaycompress } timekpr-next/resource/server/dbus/000775 001750 001750 00000000000 13716566163 021305 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/server/dbus/timekpr.conf000664 001750 001750 00000003243 13716566163 023631 0ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/server/timekpr.USER.conf000664 001750 001750 00000007167 14017261747 023455 0ustar00bezvfedubezvfedu000000 000000 [DOCUMENTATION] #### this is the user configuration file for timekpr-next #### if this file cannot be read properly, it will be overwritten with defaults #### all numeric time values are specified in seconds #### days and hours should be configured as per ISO 8601 (i.e. Monday is the first day of week (1-7) and hours are in 24h format (0-23)) [USER] # this defines which hours are allowed (remove or add hours to limit access), configure limits for start/end minutes for hour in brackets, # optionally enter ! in front of hour to mark it non-accountable, example: !22[00-15] ALLOWED_HOURS_1 = 0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23 ALLOWED_HOURS_2 = 0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23 ALLOWED_HOURS_3 = 0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23 ALLOWED_HOURS_4 = 0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23 ALLOWED_HOURS_5 = 0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23 ALLOWED_HOURS_6 = 0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23 ALLOWED_HOURS_7 = 0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23 # this defines which days of the week a user can use computer (remove or add days to limit access) ALLOWED_WEEKDAYS = 1;2;3;4;5;6;7 # this defines allowed time in seconds per week day a user can use the computer (number of values must match number if values for ALLOWED_WEEKDAYS) LIMITS_PER_WEEKDAYS = 86400;86400;86400;86400;86400;86400;86400 # this defines allowed time per week in seconds (in addition to other limits) LIMIT_PER_WEEK = 604800 # this defines allowed time per month in seconds (in addition to other limits) LIMIT_PER_MONTH = 2678400 # this defines whether to account sessions which are inactive (locked screen, user switched away from desktop, etc.) TRACK_INACTIVE = False # this defines whether to show icon and notifications for user HIDE_TRAY_ICON = False # this defines user restriction / lockout mode: lock - lock screen, suspend - put computer to sleep, suspendwake - put computer to sleep and wake it up, # terminate - terminate sessions, shutdown - shutdown the computer LOCKOUT_TYPE = terminate # this defines wakeup hour interval in format xn;yn where xn / yn are hours from 0 to 23, wakeup itself must be supported by BIOS / UEFI and enabled, # this is effective only when lockout type is suspendwake WAKEUP_HOUR_INTERVAL = 0;23 [USER.PLAYTIME] # whether PlayTime is enabled for this user PLAYTIME_ENABLED = False # whether PlayTime is enabled to override existing time accounting, i.e. time ticks only when PlayTime processes / activities are running, # in this case explicit PlayTime limits are ignored PLAYTIME_LIMIT_OVERRIDE_ENABLED = False # whether PlayTime activities are allowed during unaccounted time intervals PLAYTIME_UNACCOUNTED_INTERVALS_ENABLED = True # specify on which days PlayTime is enabled PLAYTIME_ALLOWED_WEEKDAYS = 1;2;3;4;5;6;7 # how much PlayTime is allowed per allowed days (number of values must match number if values for PLAYTIME_ALLOWED_WEEKDAYS) PLAYTIME_LIMITS_PER_WEEKDAYS = 14400;14400;14400;14400;14400;14400;14400 # this defines which activities / processes are monitored, pattern: PLAYTIME_ACTIVITY_NNN = PROCESS_MASK[DESCRIPTION], # where NNN is number left padded with 0 (keys must be unique and ordered), optionally it's possible to add user # friendly description in [] brackets. Process mask supports regexp, except symbols [], please be careful entering it! ##PLAYTIME_ACTIVITIES## Do NOT remove or alter this line! PLAYTIME_ACTIVITY_001 = DOOMEternalx64vk.exe[Doom Eternal] PLAYTIME_ACTIVITY_002 = Talos[The Talos Principle] PLAYTIME_ACTIVITY_003 = GTA5.exe[Grand Theft Auto V] timekpr-next/resource/server/polkit/000775 001750 001750 00000000000 13716566163 021652 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/server/polkit/com.ubuntu.timekpr.pkexec.policy000664 001750 001750 00000001435 13716566163 030125 0ustar00bezvfedubezvfedu000000 000000 You need to have administrative privileges to run Timekpr-nExT administration application timekpr-client auth_admin auth_admin auth_admin /usr/bin/timekpra true timekpr-next/resource/screenshots/000775 001750 001750 00000000000 13772711236 021375 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/screenshots/timekpr-next-screenshot-icon-system-notification-area.png000664 001750 001750 00000057307 13716566163 034570 0ustar00bezvfedubezvfedu000000 000000 PNG  IHDR^fU OzTXtRaw profile type exifxڭi# >7qF>?0Uc{&ʖRy?xˢR~>w%wYlw#y! עҪ~7u w5}Yv?(^ZF)ƝB>y+!IRt8oޏΏ/C?IcBv5RKcK W`h ,.rǿss(l+טa'$7^"TAP+~G8ԗ98[Э"s /gA{7Y ֝')~oPi!ҝR}l5үžMg2B6~ͮ\Rxɘ:Oآ^]kd 9L"w"R_2edI,ܳFUm6HVx57=T-պX&nxXuJku)2G,͙AJ"3ڶȢm!uwQQ"wJ{糃Tl.'NDY֓pA8+KxZ$*D>ZjX>3RVl[}[AcwYx֯I!~Xg/iu"VA,pW9P 8$2gjLMRpbޓ5fdV 2+擠!-G9DhuقnZ{a o) -6ee,ZJI D$1H&ۭ9=R/%oO/A@4;[ Aer== Lqk K~_b#^\>=k026GInGize>E*,0T@v3Y-:n9Q@_WX~/Kg\5B0k DBC!@D5f7)ql o5Ն]ϮFABsAZ)SZ=mPe$XT[}G29bzc-edƦD$I"<jbΚw}81ћ$z'z~G*8Rw4s@Ppى2v.@6QdIjE*UD 4J/R+VWS7| \{0Ks&:1I&qb ˮS$sδE\Fm0!CmXHZ/Y4F= O U#tN@b#eHXlj NiS>=M յb)P8A`)Q⻰&-;F SJqHÊP3ދrBk[٩jq[F]z^҉ިlȌ0wBJfICŊ.*r8+)NHBy5Jol3 [ BXDأPŕ8X+slC-"bO}`8bm̤%J(PFJ {JKLwՃY{_Iȓ4 (PN %t]Ѭmڃ}>WMN"[# œV)mS6=1)DMsPZ"Ŀ8_ s4kRFH;HQq90Qrrm\;K}ej2\S{F@-bP`IxmZ7Tٹ,[M.J{S*tO~:A9DNT_GG|85QU)|N+7/ۧS4b4} E2Πb\i -ST4vj Ť.FhFsUdA)Cs =R!3l2Ѵݐt-iG'A.^#]Y KCkNL>+7*ZvccF.j8N3pwM`FGm⺣){0dȦJAB7-п27!0Z5wuv?n+rbKGD pHYs  tIME4mu IDATxwxTU?疙ɤޛt*`ャmuWwWke-@" !=$IfB(>OdιyyW{E9%XR)LGJ#4UڠK)\l_w D2'~zuӊM8bcyh 4> P&M⠃(v{r} ܹ[7&LUU%2ǣ<Um8~?vDVx&=Q{YK†8(|:-vl*؟9S`K/04(N8֜t%pؚJ(fX!t)v0L4QL D%>]oYimi|:!%fpMpiZHA4t].imTM%*ecUU4 'tTmo۲1L qBǔ$O4w!//˗*؞u&zaZz;r؁#a'CO2>k7֭pi[2 jݚ;CQ';@unT1>k~ߓcA<~80L]JzoJ@AQDt:c?v+ٿ;/ bL)!r!C}.p0'p LSR>6yfk2c.b#/1jpv(8 eH\2d9݇Cjئ[1q,˦,K63O/$_Qb)r̐.=K&M`jbl$=kѫj?5Ck+?Jv d𳑅4="*j>CQT~?m49M۶mQtQab&H4χ仱E۶1L#Jf`Vf/P"ߏuM/v,4MlAU~őǹ_BffV]n~M%Kѭ[PTT]=Jc%{7k>P0-8Ntt=zX,p䐫*Mg:VDki @z'$RJ0 wQutU mv% qsS6ެ̟aTll{?OP,A؎S4_+0M88d+o1- USQ[QM.nf[nb ihN(x]v;?wbgӹ@h&UӲAU(@p4!#d3LҝW\E$v֗ҵ^ޙ*AH1 ہΦ{ ~{ #70MDo=m8bEy*#iQaQq=x *QA&~xe:>G R64D#99s|!Ӷj O^_-? !QMo6a ƌπ:>G=&,TUgׯ@ _FvvNW߱bTVTLO'++;vw{߅q׃q†v> Q7bCڈbl~ǡs/A 2S?n@z𰇠޺a:^<y^]$.BRJ,?c>[}+/ą?Ĭwfsc3Nu7|YZŀ=XQptHwo?~@ ]ol'kهL^^ά9^exoR1%׳ұ -́#qq(kDl޹q&VgM;ӷo̭MOQT2r6vV1s7$U[86[lacA~5m$'Gmۊ}MI3\ ?qaAT 3փN>G궴:#AcYTH$Eۅ~Š:6椎bJu1;52d" IeRU {JL`q(j-OkF."'ޞJÒy a~.k׬g 69 AQQ# Ĵt X JE6ˡ|V_r/atz ?쟓YmR>c\ЯY,B;8l.3Ǜt?Pg7Az GQTpgQ՚k q\r#6ܓ˴, ۲AjX1ڿ 0TS`J`>l7BH#%B%j~^IIQ p߲F,!~m>a#P"`@Z2O8%:T=*MGPy$Ji\v(2 VSjuWLhSL2k&ahչGN57_%pIIq'Ubh-3tp,˱-!cZDIӗp8?QeٔEf=|/n ɑC?Gsy>gpmy\M*2yE;3OƇ`h`*=?~vF!뀿? &|#Wqmۼ\OF śy+!-HFzo+H)[Bpq=|ySLgtރI?G"-6HR:2H0l_FqZ:a@?x[A˞rs:ݦ9ԁrdng>Y~4.n~-qW9|R,dž2lL&"N]d9x'׎S˲1EMnâ-~_RY]3_O̝%ݓG20k6K6J"s XasƹCȥ-Όtr wokA\xx.,aݎtw= Wj8ko+M]1snݖ-[6*iI4E!"t{nCӴF_"LWv`-HcRӺS+Ք,A6n3@>r8'B$ DꯩfNHHLNhM92o өh'躆zo$BÇxLt8z~ VhzN4Hڕ>GӃhz`0:tHB ʊttULdNnQ|vݷ}ɬ }doz_>eqA| ,t* 18;qs1z `Ht9b4ܧBEBpU:랆W}[c.)x އiS'b\pm hE)5]àGsf4V:WW ƱmMSLbrc"*~99w'>#dnWʬAfNKL*izЃ=JjH䒻Bĉ#mp5^5H'b%Qň.v_?jnZh(" )%aQ .&e7ȟ.f#*Pw0ՠ[x@r1SޞrYb'=-o#@ᶱ8Ḿn&ՓkEWjJг{;ڵ>8a~{ cPYO(2MaB7TVn$- 3dD]TIޓـ,$@zwx'h*o &Ǜ3qM8YŖo&BIQ3X^GV||B"Vz/Ga^{^?5e5JI覹m[:tM@JLh+O_OKs秸xgy|6PpM7s΀^d9S18id٣?13[!TT1>kleu -3-@U̜߬1)%GsB͘MJ]{ۆgײjS\dvKՑn\Y`ۀ"3S*04U V|2rlrEn`NvzJUUc}imKBf}=up8?b:D0V4~X FQ>-jK:hbeS j`r ,SւJPie. MՄla;Hp*(+s7aҎͯ`sIm[S[ .Jy2jF,ӱjǢt)\EYlC6hdd rlIZP)_ Mʾ}g"_&>WϦCYAneխĶ,w^iM[kG ٜҿ׽27׼1fN㰱Gv $P]]"8{Nyrs?Ii lJw8ه:X#'"g#2o&NPTSVhPjڻU/}ƶc}ɂf|'wjlmtL̜1-ҖJϓz$ȺoN1(r}_ x*Df-ʖM/טh@TCJ;čJRB vLeRAyqm赒Tfđu,G.yHoL.=3(ܴ IJagH b CH1/?9M6*p`ccE&;e] :^u ;TPj2 l`Ǧ8S/OxYh$R-CU$R:8JK@(h>SPrtM*Vɀ0W|7AulY55~q7XMup8u8ݶ}[)pZs|ysQK'HTUôl}]uPJk{]vq<2Z*fO_gWM$;xkUOa/Bk4)-)i+Y_*uMP( N->uz@gFfgOd_0 X}#eک/Me/ yc?)?"m}cB{Xoa@ m9OȚ U0%Qؙ c%3OB`iD䩪Qnp3,47>չEG4BPT%&tDM4۲ٱxdmyƆ`Fդ6 lˎUq=*DzvpzF75Ƙ-B(n|EQl 0lb|$G=3HUvts#.y?bSx,҃9TWiئQ]*|it>f)sQ䪭FݎO83I@%+f0e/ ( NĜ"ׅt>7:^ɽ7Dϫ3NnGoJZ*;ß.A- sX)}T'ʕ8N֍v0w/=`㶛HxMkrrr䲫x_4?`e& wt/oN0t8gs>;vl=IUUUܵ0MM :FKB'z֮5ض*W3ADD\l7☣<:i'qn RNI^@6U'ش%D B7glZ>pFk c΃;9H>Iu(6[:kD77Q~ϯPU˲lpl-<՚ V4Jk۶m Ĵ,֣(AO( `Y+ծ٬/{Ԇi ? 2פy8|D}MXֆ / !ֆd!C`ջ$WuqǝHKT]ޭ IDATOGN4W[n;qonD,H8HGbٮ2BYw y )݃<.*FL%FQ <JSi4Plө>%Ȥ"Zt)ON+Slp$R'g9cEčKc@uJ6]'ayiH;V-g4MIHR4%I RI3,@h~&ZS$Ii]SR!U KX {6$$I.KR$r5Zfôc#vU±I`Jm%SkUs絪į捒HLVS: l MoY ni`N]N #$Ԓ$Pk8d4bq*|4!5T8<`mM:F<=gׂ4$2l϶FAC(WIUS%ǙLRl|%Qhh^C<lj dJnYw(lJۨ/YZ"^7)ħPoE80 `Wqw6ZE5hE}O* 5֧JS%Ը}y?dՄ2h۶5# E~ڶiδݪc ǒ JT!i׭OϬ$qη ><E25u ]IŠ&<[$IyPKv&Yٙ ~`j(ak)Wʈr$#E$m6LLˑ@$JrUO7~}IODem#" 5" %I 4SCxV[oWIDQoxPP$O#%Qi`V]1{`ts 6O-Q.kY!/}#qŹ5nU1n-[TLUŸA{pg]jϏnx eZ_\}-_RY`-=W3oFw)r="~Su꺺A[nr>ڎR|ˌ JTYsި.tm$``7s߬Wn[674ȟ^e*'ڋJF֬\A}y;\cãw 栿õ;gW7:,ڞ'_++LՆy47=^9!?s.w-Ρ7O/J4K߻??{d^#?AmK.#+[b\qwލ Tl`Wy8"r$SȃI$-ଳ>B:gqikU]Dv8I` Mvɠm8URMqI`A)TI&IrUI&jھFmeDQW;/B]c;ȰU;4sϽk۷]7</Q1C.8K9_:B'pyCJ{g-K4mQU{@Dow ج4y6]nX_ +G%h`UVc-$?`;J ܫ5AT0=)8[,1U8u1?Z:G_1}r`y;pN^{Sg=8}T/|_s,q+{޴?`E\ j5biJ#e,.w1sYTg^[-go,Uo]̥ua`M%Z2AYm<Rc<++w":?ȟZ]F&6m2#<SK(M5# 8 >'0j޸D sE0g%_FȃB*ґU_ .)G4@OЃQas$tP#DPR%Z";I`*(CP˲_PvԴ4鎭 2iS+CKR@0 aA@.W G(l_M̽Mf ~Xn@:]*jUs"^FÉrkӖZOuM~V)۷Z7Xz(PsƖЋͬ\^M-ϲ8Cz[+ؿ^~  c\p $hJ3V)ќ:#qcl:߉**zᐶ1a2Y,"xlNJr> ZO}W_/:ή8%q&ONM<$5 ?`|&L#Lֻ4*Z@AKSR͌1(~JeVJƒ#-X!K3%͉QP{ʦF6,ef-! ~W~r0d [zeىu5+ꗃ&-ٿOjZrf(eQ(iuF0_.ښj,YKV;>p>?T@zɔ#:yCə }ׯ["Bk ;QO H LP ʸ2­31O2R#Q/8 w'ħ&V#= Je# f oDUz:vT* (]шZ>/̡'LZUAߖ5̘+Tgr7t8r z&g,bY˙2yޅ#vf7WcHDh ?n'xw]9}?pTT+Sw_._oI' ~uy7t' ёveӘ4d;6nc"lG)|eP9uXvCЮ3)Gu}]#nDmCRmD^k%X31gE4MRH5 P ޲-kOc F`MUI5 *6XSϼj;)V]q>ir ޹*~Ϲ]NѪc, uz@}>g\|v]O#Ǵs|+l=bnng_҅L9'*@E2W`7ڒvdE}%\xMܔeRaﮭ^N?iUYf@d޽+/#R,od7yt8\ͪdkS+Gu_ $Ii`O㐇Xɠ/]EM}\<[.@wu4  L-ɭ˘k xh&өu#ԏ{{ݺ4niWꐩ **!%UM Sxurɒ Vi4Jގk#Ujњ0mfxut6Z}dJS$ۦ? d$00iuPِaE^a=&(lө{҃:As; ~l4$@H[bUct%%Ґ,bk\Ւ_-ȿX0mQ375 vP>WGr"F *dx:O/7ױU}̉a1_9BZqgr>+)͔0GtPEbo l`Xݒ-""$(-G]cٹ;|E%q)zԵk4fvsJg΃_ Κe0:rH1mKb(kF&em8X1B"S%ЂSTR%l˹t1]<%>pBͬ|{klݘ9nx ~f7_3iEA7 $#8COz ]UC[ .XdFDEq)kM4ƶşѴ Aީ~d#sw&?>9N:z,G @, kˏ,56Ӗ1|D:gyo~&,932ٜBi6jwۿ s|b}4!p!%) /-tN /a?2ێj%N] JXgP$:v#9gEO!t;L?~ʟ?ۥ.`1~N1eP3K9{39FknjF1wpa 3K3Z},Ir'L+&l?l $5njGGD#h竢rs!ivot ln.oփ,ɏ2ay"$ lxlK"8&TZh@&Okle6=l**дl&dž[LCXK_- 4 9^t8?]=kuWJr\9b3ky7wr,'GWy#p!sAmtȱV;°0Qz ˙~6D\̺RD.=ڐa?ds9W_ʂ_3m=3Ω, x#;Kټn&D߰tlH=ϋ)WlBmǵ&}hK^iN*;fCd;P\DQ}ȠaQӭ +bбpb,)|#}#Miqӭ ˻VPkOCh?'Xf?ϫKܥ* H#}<;'=B2Kid&op,7AYhw9WNxwDfv RIDATЊVhdw%\<`=+͔B.qh'\݃[XWa:w L8 Ԓ&JWJc9N\ͰsO-:fc껛)ANΘ*̷xwjl@Gwaۚ? a]{@w}vDnŒ9s5LoJ ɧ8jQ&.!Φ/u+@XdSJa^,Z'IyZؾB鏎#,*(ڐϦm`+[ܸ}KJ>eJpD6|xcM~lƈXp5mi:úC85Z.$&"jFx\{I7=gwl3s=T>χ܇L)&NNk<7!#}X3vrd[qގ#8xC4:_%nDCSusDTc{#'QaY $0J1\[f 9:ڿMI (8DE2dm_4(֖X[ 3RN_2 Vmgc~%G8[``ض˹Jv]k;F[oL*8>{gag@aR.,b Qp(c$d& U#$yJ*n1jY1Zqe"TdfeyqY=wt?^FC2r91= 6ܶ G0h) t) (B$oBuLԫe6$oլڞN= ?+nϓnibu=c0PSRoPBoO 5!κ:,Je:,dt,j:p @K!p&RhQ \8ݏQ=5+D*& v=u Z(nƭO|u+zHSۆՀdS  uxq;m8QDX+ZC_JN<x o._$ 6-܃o #^O?C/?ځhGSG數cWZpc+E Vܶq9\z/Gc\CM#yu@@nFq io[n7"~l=-Cl&"Ʒ>0ஐPC e$yӭ? ;8s]@ K"KxA{!ՠ ı7?ć[Sk=g&ds*B y߉U);RI,۵w`.tkqG/VlIzk'~9G?/Cغf'vlHl{_qn{)?{N<-kĎ*zgp jCp.t?WяDXֶKIj8t0eGI1%u9BQ)R: NwhwV0` O})))))Y {M_Z|'&.B)k55xғ4+A6~QNh|uL))))))kBOuL".LaH%2g *V<ڤLf hI+d"HIIIIII]S xC .b^e8NE Ղ@H8 0&Vih UM!V$JIIIIII]#X,-wf/D0O)er\DST衲$JIIIIIIj d{<] 7쟨:m(r* r4@!VfM=U$:Z!0P!S f*nsH=Y:Æicf+1Zʄ`@@!!.VB*(&Vd,CZ ֤HIIIIIRR),T=B_ȼ@`&oq(n-@f\E ͪ+Vl,#%%%%%5K5b_ @01B sLE%=B s54Ƅ )))))Yn4:Ǵ5Q01d`YH(Vq[@!L k"c @`J1\F2kfLD2ĕao8W` mv "F.[ȄnnBq)ULplh0br/LT U [I(z17W:_t?8ݟɼY!n<4ONlQJHBe@ !& +TCCy0so )/y|I8o\7AZK*ׂD".@VXJT&R&yuȞr'i:_U< ^&ՅϐJuÃ_3.tqU^<@"c^9 ՄSMj ɨ"u,ivA`.oB'@fa i-TB %T8l`&F(O}\=m۹HW˜pB`ǠLBwc'd DUU)*:cWtrҶc| +8lRi@ ՐbO2yvi|wk~5%XV_~2se۝g5j]Q)@6 Hi]eܯg;=j[% 'f98$bi;^"p+~=h<~N \V8me~mrcN+Y~fefw s_ۈA5!UԨ*@ !x& =oXO*P 0d&B/1r۪J(qW&!?ɌD̯+;Y("7ff|vb } VB40kO6 zU̻_3$!SEBd] pY WD >@ h뷮  3P[rW $Qikn쯦3@fTN 1!0Z.JɼO% <7IENDB`timekpr-next/resource/screenshots/timekpr-next-screenshot-admin.png000664 001750 001750 00000317232 13772711236 030003 0ustar00bezvfedubezvfedu000000 000000 PNG  IHDRfAi1iCCPICC profile(}=H@_SR* v␡:Yq*BZu0 4$).kŪ "%/)=BTkP5H'b6*v"CL}.Js|׻>U&|", xxz9YIRωG #e8xfȤbf%C%"*FBegRc{2i!E,!2j( 1Z5RLi?8drȱ*TH~wk&'ܤP0н 4}l \im|^ok#onkp >!9P(gM9`qd pp){={nErx pHYs.#.#x?vtIME 1{*tEXtCommentCreated with GIMPW IDATxw`EǟvK !!@B (6bkEbga" / EZR$rID1\nwfgyf΢  @߸>I/1 o%/ B|C=~܊G{e{W*"; B6 ?sңʒnG.A=˲qJRڷn.F|Qx˫3^S32t!5U*.'NQޜ/7 {?k]V&qEI JU.'Z. XGA p4D`oiQHLcj$[V$GmT/T#i;g ̐Gv@P$D#g,H9 Dnߟ2I cLt!Ie뉏꯹!^`Euu8EIBCRi?ljGnEU_xBe8(q0S8㐂:h$*`L0!X1b KrIF:@"K>B\ѷ.T[|4z^jݓ&PЛXc GAKvݸp jnTOj_afݎݯ2q̜lcOi$0t^ OFyg/"#?J)HEQr:[ z>eh:Hz5xL X#@b:iE@\3 uy(#$ $ G@C!03A BP()4%4W҈<AV4Id".Aq,N5BP( @%HUqxSJ0@8WLJ #r BP(Y bnx;!(Z֋A΁cq8DLՋ BP("IeQ6VW')0"nybѫ( BP[T6azѵȎA'az BP(s cQl=U `0 KT/R( BNf;$ "AШ<-xA"!_B\o<=(JO fZXyRcfs81,]^BNDIjhlf>_jttJRYYYx(Lei5 {U؁Q0j-= U4IcZ40モZ^1ZG?"pсTJ{E 6rxu2;/0hsj"F1(6c7B!a陥=$?P(p:3Gq!(BxxxFF$'JyHp8uuפgPFVrh30i1&;NR|約M9.~XBZ Hyf ݡ&4HOY?Zs&١bBXl5qJ[5Ӯ{<ĪG+v9*gcc]܏݈d}Td9Y6 rq뛇mX:K5PZz?Vc现`x!Ƹ䋢tT'uJ!tSߐ85%aaFYb )SHc㌹֚uy8;~tATL$$CL%bcy Ml޹g }'؅5zcoPi YT}t؃Rya{Msߞ_苛AݒwY6 rih4 X,@E1*:_jjqqqH=5)aCyF)Pեi"_.iB9@``Xe(a%"UGM!H/LfV8,6HaZMv=l3M'& ǫXEcMS S h7)aBsj&H-Kd6D1˫5vZE4՛MQ`X^4r`&i$˚WEkꭄ>!֗ښ, S(A hj27[ABU4we@No=Uni574ma9!0L8O4)a*u64wK<%xPBhn20,i5)\g*4y~_s߼zѣ51 {鿞bӮ#2ƻ.ƙ+uɏ a7we@׶ oT5qmSgmƺ|Ʋ?媳}nn <`3d7~_ݩ"ӹ'dtEQ[k݊Vk kT5R(b;(l6;YQqvr.oOA19AZdZ}zNFI d\Z-@g_轌ʹ !j FSۈ8v$C̾*46ym֠B |1$t1zMBphxqy{H>v4t{g_u>+wp-P_(s=vx\`߽}a3?dq+͉G<`ez?_>ݵʃOxEC٦??\RbKծ?"eڌ") >;T?;J8Z,'.R -i?Ơmץ-)׿z;zkô ?X?ڌB(W޿u #+p 36mMMBUu0.ٰeIY0mA#X,}g(|iw,jAhduT!kC4==Iuz3pv@=skyQ"C]_T7Oz1xl/L VdP N1;V"F`'쮾4{y4ӭ=;˜~@}w DwPH9gA3lûnhyH~ ^~yVu!CiG;wԙ.YnCV  O2<:?2mxCq] eTv!v꽷5^RO]ȃMǵvVUvV\~)HL?~'_&>kM{V}ݕ fs^ /gyjǫ<;UrnoW'@oû ,v=;{9bU#iP#o&âSs'Աv.~ ^tu+IDBOeD/UpeDS623Ͱbo)iHrީN ̎>]ZdVIuvwBBN~ݡSҠ$}B ltplp[,{u>x:yapb" {W9y͓7"EH xl/U9:pB&._Mǜy \6YnJ)H7`xѮ} GK'uWWnG'(w8ܳ|F pG'Az^ _Gq|l~!{{NX "bYaL|zHҥ Su+mk5h\H;QPjW؎գEA[}nq_o{b(2 Vo=P3,4X8rGpm4u?b;v?o5=> Ւf>m|DٞlrZ6*!51DAF%qՒ{>B}aA+AHHlu}Ԟ2`,/)'i㦌eCojFuQQvgi3uOZǗ !noдNݴ mĽ̌X}1m)Oι6ҏ6Vjf⻭/>Ϗ;0 ?kB'r]k8f`ov9<\=cN'>ToF0_WqGw瀷eEʹsKUu͠yXbO6O~ۚ )Ǔf}]M킵o^ya0^[a=2UZwȿt̚Vb`5y yG[i#HٯV\z ujㆭx}?S^54l/ +jQ8*QeF/.&>lظ귐aqZL^w[5<5 Nn]4s]obM Mݣiw>X5 &?uUУjv5'mS>߮lxf;,dsc<b9 z`MN\%ե5kHNEF}dLԐ+^[}x1y˖%Qߘ3c/|qyu汐^Ļaz⟭vso^^?u,P}FFvy-a$~℥~QVl[,H 1p!!|hLLT&% h/Fl*ݹvjj K퉴Cf\o!"LKu,Ve]t_~WXA0dFHp{P1\ǯ-s0!g JIÊ_}p W>|}Vim’W$D e `/nW/f&&8"%+)C0M|- )5AQ}#4k;=#ʱtW9YqZFۄM4uOC@xjGkΝ߳jv5 W͟mOA{6Å\@̸.܊ov3O >M]ExWOѦ%e_9W1G//i2,CHGų\؉Y?|xe#\fzZvo^ O;T/ӽUc{ݝ1l lڎͿo7ydϛ$R`t:uff@aÄ([&ZzSd>9Wqo9~G5_ŇFѫ|X22CEo9gnܲ᧟6h?zU#"bY!$D 烃:ӱJ%* $Y, bsdr44jk:"Id2aڱ255qt#G2@r:wT" Rkѷ$%P($Cr ؎mCnN6yŸcGW_׮X!54d"Beuɺ~u|<X-R#GLXmG:z; Y!ljF9-kMﶕ6ۈ28.c}w\JS(vV~2.s9iR~ǒwD̸w|,}VB 6n<0aׯG""Roe믧ΚN0&D$Iī'R㲪a1ΠVy (^!J#(MS$U\u<ߩfN$H***qʔW^I5K2{'Mjڼc;ĢOI{tT{Wa[ԽUxWh.?x(b9g[ 1)J ΁Q^^ kB!ULLĉaC"$ ΨC2 $0 bBoWQ/-Ee!L0!fUfmS BÇָ5Ǎ۶\qeW$ICQ"CiJ)RZi>Ϲ~E~Тx=EU}G{嗊׾I/SѮJΫ;T_V&..~dCn~^zH@j~xu vk&SW1.:Ix_|:;t#C Y5`}78.YH|e5F'TłKHlǽr_^ܼI,sxzʫ{s7.x*-_=%u6PEťy$֋V?o!!">uqيUD艃ÿl?pʝpm!vaXb9haV.3:&"%׌CRnw0JMҼ' { V|ҳfͻ׺kk/yoi3 J0n3 r/ZxhɿoX}hHUUͽ^]:Bj[.RDDW*, BOW @< m# eV"AeSN~yDŽx೼R q 1QF U%I\PFh5kO5B#oںzɑwݕ4?4@ w[gڳop/>@aٿ[U{SpH'Wdn*!X(AnJW@۩؏|:YR\w$t^p,?09 *.k/\.[CLWkK">@a<{Ou{oMSKf6ZOV{JE 烺l73rDTYt/*q3,)*T/=녪zPpuASn:%lr֢ZX[˞uc&?w mJ\%_@[փF럑BЪ{@o1WpE_-x+RdOf~n{)c$.ҳ8Xx [4߼-a'hQf`$]~L/a"O[(S0 YyE}L_KD ˲<2ʒsEXel 1!kqa^P -!FpEqcWc%(Ijd$KfYF$VېXVzX[@[W/?rTwk0h+Lxd8cj6Ti285 re1gpIF?޵;N6y oTg{]Y;xc/D= :Qj~-ΒFo{Le }BٹI;p̙pPye)|ڈ,]dq{#Vrs~;-y ltplp[,*!4ۺOBBN~ݡSҠ8}W~1㽫\^&Nf iJTJ^y+x^Yq- 9ayV>x%/(yA! JB[I"qJ\=ܪ kdʺ~Mt4|#7݄m6}*ŮG;pt_ݲGa _0`==Y!,/)'i㦌e:\? " OL :aب8Xz GĴmN*TLt~~\߾qH׿!g@]78?8x`bꊊ:Y;we̾JϾm@Ӻ7n:quQQz~nĴˏ<9K?X5ݥ!!)]x^b^_7P(f͇oټiBпi'ᱍٌy+OOFt ebˍ,0+I0r$,=DFWD( ̻*^~߾OV겳&}-zlzg+:mceօ/._F=1J+&j`~oZ J@up1QdU Ӳ uz =cߩ( sKUu͠i ]1.X; #SU{m]K }&jĕ_ln:뇎&oyP9md)uKoRB/g$뷭ِrqzO_[iƜ6$*mpӹ6VJfʇM._pp |- )5AQ}#4P؈'hӒMKmW3Jw](>oDTY=/ݗlVP$ ?:/[鹄S0G//i2,CHGy)^t6B˃n~6a+h2aP7Ԃ{+ ]PxjGkΝs~Ρ2,XjUm'īg3\ȥ<Čϭf;4]BʴGV,ۅOȽ/#7tHӒFw7!/bL#%B0βwLKK]yDw.{(s<璉<ǹ>ˏK#?=ܢS"z~/I%I¢$XQrJ(Ngb1ءlt"VB-n IDATəV*R7p9OReV+P(#R9,2:kk LbÆos T<DZ< .rlŀð,ò`eXuJiYWu ik :S{"fk؋]qe s|OE8*Ҡa,֮}KGBP(କX0eQCe-aэGJ˳qcYyzM5f&G@%X XڐC$NП(,aW?^0ukY:05E;V^l#ฌ1qe*}ޕBP:x6NLc37mBcD "oI2g8ZA5rl@pEqǏ-ʩy[5!91#7#PwCLĖ)i)$9E)NQtJSU K{bz92BABP(ieT!s L0>zǝ^6, zQ={8T"@n>tPZH9yY jͨOD0&sy˖Y+BP(e޺ҹsWB!\@0&b99xxޥ. <ll6w>e9Spb^97!cla" B kו= BPΈjD+%jʷAIb$$[xih7Spvźn}cqݖw)cVlY>5bF NIA| S( B9ɬ\4+*w:]!DlacXw-p:W -5 jK$ 0NbG^VFBP(g"4Df&640 8n INmP RK,Ɩi\YwUGwؾla I $ptY4X BP(wd cϚoG 'D8qZ%+EU|= BPMhx&""(1H!|eJ)M5.wq1nll<3"EDmA.-/H4z DtqqXPK/9NVRP( rJ=-01d9k `9㸖"\WEA&Z<#(Mxx?ӋFD8֜?JXtn.bYl>ԡ) BkiӦ5k@XZ%>x_l- &^Zn}}GNO?mkppp~̪U/K/`9֑&Mxz:__OS( B9$cT'L3*,XmG.0~8Nmfg^7lٲ._|1$BH֋"[y$BHRXj*VBSP( rH-mG}"$cLs 1}tgX 䴽!y6KgeeuXؖ9v!֬AD@6#qot BP(导@$Hr$sS\;ؽZ1Lpp(w֯_vIĉ[K/² H,G$)8!S*W_nMP( %vn޴ $%1 ;ADr@fiZ455y{7:tց,g֋f4Z{`X6&h'=Գ) B.ϼj;>?{-wK7HЫ (] ( J^P!( *J t$4 $!!\ݖyKrIn/BH~?+;3O3;3| f0]UIbiiui,YXH$ׯ_=IT I$ ͱPuj..HFٍ OKbLuDR5\QQQ\g#˛R~uU@-o$I:1Uj*Z\C0,ТqY_ C8O[;-~-o$H]m΍>V1lh)׷(rOs"ͿTs!&"6m%I uUF@콓SBA}ǽ1:Ē7r(*53OI!wċc_k` cWtj#4c(_Rz̪Uԝ#Ԏ UcSu9k \| lځE _IG\ R櫥#-U.oˁkrӔ{ZS_QzMyڇ/J.8fﮛY@'*Hk )],{O +3{c{]-w,u$$T!fX]EEX{P2#}[M g0YGVy{׊s)C`GwP{} t\Sd΀*5ulc җ4(eT^ L-,a!Unު---333f CY:&&&}1'N|ᇉU9e)S_u"I;Dg̬8;S^nֳgpTUkN ZFh 1v-,FXbf[!UX:~޳͛0aPu"A `i;'2#U"!,B3#VLё+O_xXّ̐z)cIK;zͽ GE"i9>:x5qJHh $4wq,2a$y֭%cRz}I]#4k'e0H-^vfK9eQGO?v❡S+jG O-s|q1& *IP?{}B#jM9\a`&B=M^ z6 '~WT1 YiИ@mE'u͛e1!oj ]ϑhcM5.8U_ԀX/BK 9nmQ5m :' L=1]Lr@7dzޮO`jLs2uLd2XCb!ApJ5ss2?A\gmll"""-pٲeׯfrrr޽V#XIA$"""y>mnd$Q0:#2"1U #llhk7 DzO/ij=f ak,tAip ⷨ%}znU3g!Vtz}| fFa侞Ñ&a5kECu9774C0G8[os,KCkuOC2bu\i 3 0~͐!B6C.H433ZQV4hsΕs4haAټy… )u/\"`} ʊKodKK Pш>! eˠykBc/>~bc~+ ̻=G\^FD[U&+wO&3 eM9%6pRUXwըj4У #XjTQ7|`K 0euWQihk1ΊTF#maKŧLLcuq Jq`qϯFY|YcqT="I5ytLրnPQAkDӄÚX"ѬAUPFZ~Au>00LMMw&rz3QQQ\g ~N:;E33:Ԋ|BGia0b0E_ܔtp'W.d'\u_X fdyDb&}/=8} 3L}:V2BJl%)o<]=~f'%]wꜪI{WgA~b|KwՆ4J)E֯, N Jz Wq 1N=#yXq .F3#1NhE%1;~\\kzm:MmV9e(jcMn5@f^0GӦ; 7{1ݬAk^m,G񕫀BH$`S3]҃)F%%%/JVtqً-һnf.Yp˜OUxʑ/bEX7۩`stǧdYNd=6?!n>֐qTBO ΍~}nFӐ~GVXF JsԶ]B6(QjE)?]zo\D-9)ŷ0P8)ud0_^8 UKtU|w;akn@#Ч~p#)U/ohC?g)>Gp0#achCKcMYC~eF?M۔jy+2nǩꜸg 'XbL&c uz]j]Q˾FGX,o"ID !DڿBD-Ztf|ͺ{HReR) d"5KNN:ۭ[7KKK=(-]r5k gׂD"Yt9s⋈@"@"Fekڅ̛+޶p >w^D }orCb;݌Ro=-[I2oq#$hLw;`b9SO0ɋEqu1&v!c<A9j߰S 8Se@"3UPPrCyjC& 1_wxt($lc_ݣ&»sT]ƨ#RSԬNnÑp)>5̂Ffd:ܐE~u?@d\uEq2"zO8} q_x_o@qZ%paڷC묕osF~5.GD#BHdDѰ$-.Vϣe@=JI+P/s%>{o م8ؐ$-_v$"D$ EP" R x|g_};;;\r„ YJ@0##C>Ŵi\]]@R]/T*F6O(Κ5kɒ%Fοf(Z]: }LfY6=;~ty şHZj`:5*R1˲6vcJ1"h ދ/4hO8G7n܀;_ ~Aݺuo5/VSFJ' IDATb+̲Tσ'VVL%''oܸqϞ=AddK;;P-Rq#6ˈ1'?4p_r B =:ʕfZIUNQKyP-6=` 6,YȘ[\2dȐ#F|u?Ha~~ٳgcccoӗ_~9i$Ԍ kW kTQTuem-D l4y}hǁKqi#bĉt7j\voΛOX4Ypc/R3zG8Ձp}[\f,˼\bS*@bfoҬAnJ=wl}6& 7aXtosV?|iC9cN Pr6lذ[Ϻ3F^,߿8J UQ(]ʨV9ٻi #k' oukŘ: .iܧ)!BEI};xku=S; !{٬#*Ed;wcma}6ڷ:$cnINN7o^DDٳ>R|'^xx~۫W*aCdTgz32"T&JK0QO?ݺu+6IK l*B̙3OP4Z[ac;Sh!# jJjPV, (P$rp wu&O>am{8 VTcja7%`_mZ2}vII"gW[N-vN٤onRQ֡TR`u8xETQFR*mKI:x O]9rWBd1UGZ}\b׻ jpQYKU%6=~?kmz..`c L;!԰ Ӏ=]!;jzBaZI23NP㐩R :98s+MiJyz藤'wkX.|XXPOXM )1caQ|xi??'O^!C<C*=ft+0!">{ y)w]cb2Ƴ+'3 #ov9XFLSW .Ѱţ\7SK7qL^ç}SJD^V"8EcoyxJP;e/͌m{3[p dAft&aQY#gf1fxp);teIdD9K($"D$Dm\իW+b~Y+TZjJ&}٥*Qx0-6zFТ~ނV$!2ooC;w?}1ڵx&_/F$4+\yGo9I7_I-s~5G{QF$I3ƤbW2 Q_:w!y؄aZSx݇IT#vsLϠ1.2]gmommk֟yΣ5w,Xyܞ7r_SƖFJ00ie[ k}޾};--˹ΝlUl%(Ř(-"Ia03;:oen&Z0"^rܔ[paSKp+mzUn5C+: v:sfƦpyʙk~v1zx̏6Gt&Zր 5XpݿN\|MZXL<-5%!iPPɵk*fiF"9ŃtbVSkO,\ְG")QaZAmli\r?]-X bWH h#0GK+;8<[/WC(yO׹*,,D[r_|}eB_bԊݼ~ê7>u56%[A]6"Ģ1I?8akHwp PK:3!mekP7}!mQiy%X̛)!%H!58iK`N-9h};:[Y<-v>ۡHl?ڑ3:[㲄_9IJSЅIqFup8/1!ϲۃ#|*{^jqpr! j[X6W/m2vdÏJd^6ƎladAۥ~TE*7M !(/جW6INL|}}B_v.чvV*<"M8StΌ^VZX-zn;Fhbضn!!Xx4|ka$@sw"]P|fw;WEUZo83Ofs%iNgMrbض2t‘nBQvfM2mO]9҉&L\᷃KG޲Iv1j\YEC=?\G]@bsz**yꯏGMms|9)ei_5\ Q.jm_HJ\BWKPp7N#S4Viya_>g7' Ԙ`{1RJ  hGYƖa"{oERRRi dR<ݣoUdY3񔱞#SE1˲L܋|XTbyB*mQՈ./H84 &5+pT)ps룃W HwYڵE2PRnbpsG?8ȓ@;_\I]o;:b ?ǎ Q5 #k' oukŘ:$@W:Aj˜ƒ]jg$wcma}6ڷq$c!n**zAEj\ZOJbCUX_,D[5xIRV%H ˲ՉF,XA}]*˲ V2*H' T*J}ڨߙ .aLo@'=NTGjE&ˣRƖaj>g,)*Ȓb"9>:'9D,RPa1qa}DEE'w 6J )y:rv~ޙa2nᦖ &4'6./f3$3>oSMM\'+(>UebGe`gTDXۈ{)饓dj6C`X IZB W*EͬhZdڭZ-UȐh UEEHXVG2gv㖜={VVl~~q^ n^Uku#O tjLmz0f@8?֦ۨK1wu&O>am{8:VJ:{cTrAEHlal_{C<8 Lb|@X ru'hHeU_RH:tJ0php9oJ忬`dNc EήdS厾դh%1;~pp\ƑFQ`N/gϋBcC,=q6)){x sȢQ~RyBՎz[a#?\p, @Nu,Sw%n$hF? Kͩ#ͪV]'?L>bpë~9@ĮwO=>}%ˮr TfEήV:/.rT!&E M1=qڅ=L jSW~+ºWK[8•C:}V&6.h'#WUJYWlpswu}7kȸ|`M MtUf$ 6OyU>tK.#o,OYׯ$ ;[.[ppP7K [()v): ۃ?!1}X'wnv{ ;M6ٯ&ZA_Zjv´P)2|qEF8Xwv,KD`ȬQ_pB ?t;M4&،{-k&@87  ddH]H0VȰ TrG*,ռڼjX#_w4~G;r0tש' 1#[9U $23{/[Ro=-[I2oq#D!Fd̛+޶p >w^BM#rܔ1 ǩZHUZ5&hYPbWfpGr Jt(O-u1M]N'6kf3|Թ}P۽;"OPwbP,IB' 'kRQJM(WPkr<8J{yWv u{<>h῁7G̀?HM%~u,0UZXHR9ٚC3 24Кc7U#]"fXaieX\Q.F$YVTDT`;a<."^/m;o'5V -]hNJDj#E?|ְgLkSȲ {0v@r?ceNڐݟΜ-^ݔkpEν;#)PObv'm%GLQGk3MwEe$q14|i͐4M1 M3:Wf%DeE@ѫim_K{$}Sh5L{QT }ȸ>Žg3(O<1e|FDczT HBq C:d'Q C3?O Z'XC94cz/ GEacہlƅM{ P<չ9?~Mk/wI:σt7Q͕og(U p 2i o)qMn9|#9OE*_noͮqt_?Rvkߖ()Y)KgR<ֽ]E9m٘bd2`܄a:ŚGD8?q~6)>g]t tn.ť a' Cw7Yh#]`,Zg*(gݾ^Yx,.+˸}S(߼ːZHTEB@ ֨IjXsFs 峈 [Vhr>HG+3{̻Y/YH ؖ?ms_^g)ew}I1&;=2'$[3[wýq*.>_Ӌ4}MwAEV] VOY܎M;[f, ` 3˭*y} ATtݨYL)@\"Խ{W96s3_سkc:x5qJHA}mOux@_3D%'>D$A|̓2>+8neqqy))^^&Oҥq1E@"H[eYZ3Mt%_>0wH(55} ``[DxVH$L)Q7ضrAJ/ Ma~Ly:7ig?& WN$@R7B|.Wn2Osy& 1hezLC޼KpO>D&rf2"}ժa ylk;ѹ("/$ +kdYVk"MibbP\luD꒒!H(l'#HjJC%ش߭?M$3yv76fF! ,  6D$ &4'6.xcRTs@9*U&ZKt\v/jYcMS4.%)@(YcaajBŹyyTzJ:0gOgwOyeM{7E #]>ӗ>He|Kn0Y"Ww{|&[6P@]tKڻ:'ct jLS<_WYKqQN" ?oKLͮ: q\{'S^ ͊>OT|{q 7#Uu騸7/\Nҳ uYİo:ujC鎃K ü.EfcF_[s2<Zc$띞'11 Kooyc6rADt@Oo6 ˰{goK+~0E]X5ʒS$ SR20_M!'B_8_o6lԂ?lT+le@=mRV hvRo=-[I2oq#@9nJ{ǘ؅UFNP{}̛+޶p >w^\7o8qe@&A|dc/KqzQru/E;ࠓ⼆/̓Ϝ}l`f0*mMɓ#R( 3FŁa@ %P  H!)x:+$5@Ċ'ʭOIpf?[)%E_e99wwdT*@onڡWM_nu Vˆ;~mȯ0σ[ gJ8xHA,)VRӴh5M)6"4Ds2lyaSaGkO5Biu0@*2~^F|>" ^_Pܳ/.qJ=oۘ/s%>{o م@ss;tFVH;PiH(ɉ۱QGq?VcjRSS*[uveXJEQjVQcth$#U`VNع ߹77P>~|k&UQ"IV h/* Ǣ LQj.܈YLi Tͮ<+Y#-M"Dٲ(5v"d2qy-J[U}bOO P{ӦlD9ivQlEEǪSYUGb)L+VVE~Dۛ7kbO#%vq}2((Ȩ#JwoKNq*>^?n A!P]FMdq>Vv`mJJnr_}`֭LtM죕EF< 4EH  : d?c( H)c˜h7vI1Ov5 X[W"BĠ>EF=NqV{g֤˗ jbyt39օJ%Qr|@#qsG%H"FQ+޴VhAv,xѽ). ct:$8ؑ_y~~:;a/E!P] :<KБ˾_1qŋݺtW05uzbJMUڥ[;Qy!FxR08R#BAj-ŢSXҩHEt:4V DQ9~]Ӧց\^f UKL4T#HD%"Njy*cN+PQjFUtNMJ?P|횮B,{tEHBB՛8&p0&$d8eKޭ[W&l[P(jes3ό|@?EÊ&~~} B!ꅍ%/|d,z5e={Ĵ4υ6D+L5MNN~jjAjj^r*..7../- xAb!B;2؋ Vsr3gN}ic1^*A0<-SVR4#/D"Q4Q١y0)w5aڕq8>u6\4"˼}D㫽-I,򶍗N{ !TO"ĴP6񼸈DlVٮ뼹4//…3gr.]ʻA htK~Pli١y\k%Q-Y]jѻ>Uϛ<-^ئrRoPުݤ7?jk~J/2{O\MI-Cwv4fVՆ~ƊEmYlN.xW^͏*xHӦӵ4/t:Q J++Uaaڰ ;S-Ub'̬]|5ϥ=8vKI-xrtrQ)eΦ/R?^k7r5}ߓF*6)翱b~wLaddnnα:7;3L|uЎ%7?tTYiQwҬ[NWk?<ܗ/z!?aC#023wjOMf[ÚAK ?}߹ =|xWo9xotSPc[sѩ-^y͆z-p%h#w%ʬO=hC[wq=&Xwf@+X{#FvQkhґE#3txaVk$ˊ<>kŘՍ=],Z4%I) **/WEel2 6&|-u7h쾅 (5F&^xq=g# dv>\fp $T.OYVwoomiu[U0%5v_ʻ볥-\8PYjDWVtU'L-P\Hc W,"B(5шڵl>#fV<엾lJ,|;2nٴ{VSZY6ݰ0iaL̷ x+ڇ{bۃt9 {@{I7 qgٹlfGrDe ~wP~xUӲ@:;Dfilbϲ/ K}{kEC>9'; <\坔E~YBAFuVҰIC;ݬ w$ { (ecy7~iAGwxP+n+hʗ<{MކV45=&\o\'wvZ'VƧ{1 IDATo+.U)~eǝ2FF3{+.bh2z0s9&FHEÑK OK[*;z+)L޵'/˙/Wۯ:sA 9r091qoC`u͏ nD0wpusկGƼ#'{2\OMѦBg((oRPVӠfOɂhFEs~o-'ݢlwP];~6g췻hx|*5GʷK,+ptss$Tuծ[+MaS lPjDxHZ.:oeTCWPDžRKRd{!UcUfnMNŖ8q:?i(ʘ:"g)W8|^BZ䋜.l|Nt.tCW`KxHm`oxkC ZxV{G?üK Se*+&<|nعoŚ@lgẼ[q?^'c{y̝jn-}[QYsT0c]*[_܍W;д?_f&|g 70#Bv 8{hSRfp l3av?=z #,H뿹Z8}gO=~?כ`%%G.ƌ;YxQs取iWzը4jE(makY}oNw kb]rD_ uɪ^ ڥeT*1o} /s%uY~VΫHZ]h~YZYYX MdT8x{ؗˋ1<Ŝl6.:5:]#oW7Oo'3̡Q~65'NU%xGwW!=*2:JCRDH1)2*CX.\ڽ{ieRRO]CJQYEUsUgUobִs+Es\VthCvVj.+J /7V+YjחZeʼqYGVI"o4^+_ciz!Ro5W*Xjyh f_# { g7Gvs?z(&9G;u-軷#r܌`%#>{voCnD޹٫1)~ v|Úq=z5͍yVf7D8{bXxm% Ǯ܌u;6V4fURTTQ5X>437Httxx]Ú;q,'~}P4%ʯu#QOn,Qٲ$¡"n]={5ev´[~TYRꤲr?[L3ՠ+ڱK_p_cDP'QAl۾ڵg͙i}-+惩{ԣ?<*(,}@s9:^at<_I&M~|7E) jn;h;"!>xOM I̚`t۱kN>68G)r6>B.AF?ըmWT_s5lD.=~!§W[r1E;;wuž\*Y;6l|eYQw^h<Ȼ_ѹv2ZM?a|TRƪ IM*Pb}cgLS>1PG,\p&po44w[m-p B_1qW~G\^:v&q\<8iy-1a *'߇)]L,]:;eʉgl_`װz"P]>X1 3lBD(0/4B!*?O\&u!BBG8Û B IܗB!P(F!B8?##B!,{B!ӏ2bjD!B*W,FB!d^ˈB!02"B!!BFF7B!zJd| B!2FFB!Ԉ2"BF!B)02"BʨZw ܬ\T7cFB+EbeB8+T*0`qBDRF$*YfbJ>}Z @cL]`ffnk@ϣaB!TZ(rӂyE H̕N.7]+MLdXE9b*@!T@P:2dg:<F󼳋[NvTfzT(دBU*2j'W(KSZXbU B_ #HE 0i(6z_!@HE*<^TH)z_!8229@G4ّ_޶\^,/ |# "c/{s' 2`bѻg{~yɑWnlB{gQS6&8){HM-Dܸ۷-X~o?6~[G9;37=ǚa)woѲ-u!* &FF#<{#^sܴLp96や=,]:_7&eN>1ugŏ\M(B9qjk'g[39-[wUc7yQ&[;9;(HnXoԕoZ989YӸ nj %8)E%e_=0u_#J^Az?ت["OoKmxBx5^k7r5-]ܲQ!P%$5?-]͒> ˽%ڄu06#&VrjzJ 2m>TakJ6A\{Zܣ7j҉ň9ny @=nàQ:9q`dj5nw pp#Iї&vƳQ%eż;,?ĺy>c}Ltq"r55 KfrBP~G \j2̌!*L|cFq,0iþKS Sَ.ͻ܌IgJF ,3|G$h$aT<ƣx7-cVv 7G3ٷiۉkgGkdK7$gh1z6PV' 9>m{i歛Du^}OL-t^O'-bq_G/|T"W︑.FSkN_QMV37j dp_[ ڏO J=tUmq,X:ԛg7zlRJz9s 1q鷪K ?}߹ =|xWo>[zͅӻ8W}ZLbZ(}C_<[s,ƞM.ݏM G- '.9#G 2+f=G[!Nװ]YuF[ e?#c?Ҫ²Dp_*\e]*4桭M,܃}w]*=QkhґE#~ZX<+5eE۱0pt@.xg RNm6)!%ߜ: bNOJb##3݇7[R[6})q^NS.gvȬRh\`AqXsu7t+]i}& x2nذc&5[)S;R`uXRhˍƴo[vݳSȲ˺}~KG ]V]3bk?m^~EiN7LJ;; T{;2e1^Ru?m<&!ZxÀc\IIwy Iwn]%8-+Po[vEܴIqﶬyeS([U~.?NڼPW;e5 ?-p@:;Dfie_Q70u_ rqRiw׊Z| &f%G6^s'x> "wg\Hcݛ4m×"M}=%N2Օ{ X65 (1/CJ1u nCPugEkC"X8n( K{~K)'_cA3=w{ k'cKG7wG}ad8֠/} 戉cF<4I~إy_<"n2w&h2z0s9&F77Uڕ ;&72o`*bțh؝|ɯGoN3ԵQH`W"HM87 !0:]h^;歵k[)ZW!p[GA~/j.-=< /e7-J:"g$;3 @HLxHm"ȁslV 9{G{NàvX]`U(SrXzIWl=p1*>S#Q"@cd[a)jwtR$ [Z+N^OǨS6fҴ?_fd {呈Ofe_g/ϨH[sT٪I,է܁/i|kXg[޲3WXQ*GL~ /<;6{=]ev(1#u0+L|×%d% IiLGBU}Xl$DڂX@-((1ksW5yÇ>ptp j7y\( ^v(X;Kiԣh$-w$c,\!x"+!Ts\Mp ^_~U4W+q]G;ǂ$ͪEwRrը#k <0 yP(,Lϫdfy07kQƒג;tutaNJ>Bh2gM=eJ]LG&f \վ= S] pǓIU i`J,;b;yyHӣ"S $&EFeH=k4wpqK+8&$=uPvЮYqI7ZZ)W!/#gό3Hz3# ]G\=zؚRo悙0oZ}KX FФ8t@^\"o6tTۈ5>Z+MlLhNr$oo޷+כibk\9瓍~a^gFӁ!"0ΩY ~maɱ9.njӓs}䝽<$8͝f+ClWQRc~zӍ:agۧ&Gv'amBUɏ%6w7OdP;W{q=G7e&[:CrXsleu=e=Nκ]]r¡le>UF)p!PU#3Γoybw'sWmdBf>t-No3iY[9`jͰL^v֪O;p-2򩠰vmVdR?n޾`Ѵ#HdЮ?1n9kRG[OSs}ޛ/{ל˥_%)*ޣnZz, & K'_{9a @j؈ow!dOkekZGTGӠasfoszʽ`j6y;0-;i<nAu4rnS =NBqVO 8w}ӟs-lB ѺEV~:|f>V.>!ݵ"H}@u_=o4n58c{לTI}l8qx^S&l}`\&(,}<-'Ж/QDac @†\kESAޭ|J}{R0|Z(BoY5RD`~QA͟s*#z`纃u]R7D%go=]u_!mh 2<͎=χbwɍ8czRpp^sV{וQG+x݅zدB'$Ft iY-˔ISbO ޕr q5II`~B2ͪF۠HCn0}󆝝]i)دB*ubcx |&bBN~B졡g!xبaz>!X*25u:Lc=+!!'J22bpD!zII$ށGQ*2$'^~B!rju q)I<R+ttvB!2H' :V"HB!^(H T:!B(V`0ʈB! a] BtbȈc!BQd8ʈB!*ȈB!!B)!BU52p#B!*!BMB!ST32 FO្'#mae"BadD!B/%6W ڲij^lȬw;Хؾ\DlUz>{6t?6%G+X4hj;zew%gAfެ爑}hɯルqNAl˛=6)CS{=ZHxqF} @;9{ͦ~: vB'2cma5``+ocAQ`gČ1֪~ڼbҷe9'; <\坔݉r8O )έeo &f%G6^srrDe1mzۖ?m2x!?nBE;("NG!W#*;zSMɌ& 3'cRn1jTpL]z1qoC` م IDATu͏ MBT^Zx^W & x&ra]Z4|!܊ߙT!-&{B!PHGFK+[?ݦ+:P1留0C:"g`ǩU @|×%d% Ii˿ƒs4oi;yy V!B  h Դ[@ /[YCn=qGpn_opm&U<Ն,d=eSe45'#& ш)t2B)c@!BU"jA4߾{=lhvP{4:C[ Lx1ޚ7%HlC;ޗٻ!FFEZQ5Lڜ Ev8#?ؑB1;;vDDvvvAAAAAZbm 2EBqBlll,-d2YM#QAz2X/HV'BrG---98j}QݻձS. E1OKKennUØS 5{!B/jdQݻk׮fff ϑ?E]B|^^X;D*V+1^(|e}] 8^"z##t:̋/ubqDq/j0`?"(@B~Fƪ!(J<ͥ Ў(}͟{2g[۳y܏(9e͔P'T9t5(#Szƚs `jf0K4TVUu|et] BH˕R*I=ʭax`yO".U|WqE8~u7ԵP9_ZP~V\_޼|ߪO?6H$V[3ݬ *K%6>]~u6|hVM^*FB15 SSIM,z0hC&D;}\4zodH-ohjO,7WmXWu3R Q˾}kXV~ Uoj4DQtU3gԠ ة~vtMХ\ݻe[ToW}GiKRՂұsu#tQ?O3H[AЌGY`շFkd ߵa9e3:Z*̅wBSջ1&RtcIeӸ+_YޒS21zgFNӝ nW+P5-Ku&#m&-Lr'fy n.AjLiKLll ݳ척n^ <[m[=oB@ {'FV.` H8dE71bt[!M%P2ƈ!Ky!gjG30ohmm~'YEs av֜ŋߍx5#9 l~o7 ͉~#c̜HՉn^7j̨ GyNŹYqs vnXh[l;nUæ/h7964u7s& ,XhG ̟?aK^"Tac%Y@sy!o٠yo)@wQLA^ o~[#Ҍ<}/mڼҭ{0O%_+zXm"D[0Q҇7M-)o1IEB$Q&Sf,#тMO2ӷ efyhH ?i%hjޤ'ːsP BܭQh?^Ѷw [`wR #C_}]B_nlm(ӗd-$Vߙ%+Vd_m1}~' ] \ILaāT*eSϛ_jARV 0(iǣ4{Cgi9 )%2 sW7uء=tlȜ}Oa%`2'}<$oS2mm1SB-ĸO 鱬dpEw3uһo|-ZfRrv$?3K ,\@+C}H9 Яh|O.t*{ƈBY27Nn$?9w/1/} *9JdRѨ5> 0 a!dqGG]9t&fwۣ>g)GK %<׷9jsjS99}I j*igΘ-#?o޼s-B(2^V&2R N[Xy]B_{aɡUI l$8Cv~?"LO ̕f!9v>le~tw^dۻŹԤdP ƷeJ01" 'oV@8 T y{J>g<^H-ۢ{o'Nj7â(LJ04"j4ȻHm_@_oiٺsP=޹h1?G#iAl&^8tzy;蒮?V\-^<9'=PץP$PQ\f_koob ۵յsMlx`Y1\^<߇3us!_f<Ώ_kY/4 ,NTmݗjΝO5IM 4y[^VW8_mt:lJ1u_r !@NGgZxt:(379B(7B|yjEKm/eD!T2Ac4a%?Y5lFr~M`fqBW4ᙝgks'+ 9MM7q`l!̠P$C3MF}mҏwY3ʛ$/<ј[8ulS9)ucq~ZzDR{sKw珓'86uO;nkNdC i3UebcRJBB8u3Ba6S>-ZՌy5:cip׿T.^\SFB)3NuM@PJ^03߻wo׮]͟ClT~qAGa4zӄ\q?kޞ}ǺoW۷<<?-VL&>3 01!{z׫㽪u538QyTs4 )U9Ez oT"!E"h8B!FLN333KMMGsj)=))R=/A)Ou:1Bt9ĈB>'\N 2F_'Je9mOͦG$B!tyiHWo# a(/BoX?ǔ*5ǁVqëfFB ռ3vvvvJyr"_`^}(Q1dmmUCǛY7ٴX wٻ !y 俾 c:E&jA$=W#7d!P=ˎ]@ RSSbsrT^'_窙J>K?]XZZ:;;kFP|n4C862/ϾrBSey*`!y 'H\LBO-l1/"/c"TZF".ή.px%R=[*/X;Y4>JBZ HuOL>yӨ.H$ueWW B腁!B##B!ȈB!02"B!!B##B!ǑﻍB!N>!BխȈ!BOBhVIK =bJ==o+C9#T*XKSvKB%5 sViP#RT+'gi>`-1.LJL033w.v vKB&0xܬXu!D"13W::ܸvE071aBQ0 U2v.n9ٙRv} uocO5j'WRb)-,R*Bڈe#dA2@8a'R>J6B=X8X) Tytn".rOB=^w1˼}|P8@1SJjwiveǚ ʃ_eި_)5ܷK11"T#\[ɴcFz{՝R׎z)&"r_䢽u)ojjKr#&=xrzC [G9;37=:+H~3XU+a#ÝE^skB:UehS KtV'<\ڶ%w'go?lI+A>xLoNw c?!}0+A׽YPÕW"G ߟJWrc-CJ#g͝ɞu r9y.w;O*h7hnw~߅\v{_I.Dbwg_߂W-p_/Dhner9Gb|4liSXf\CXWi=88Ha]zx3K?9q֌.=<,m ,jiw><*+@:pT$w­ԭg 8a k׹;%ܯYם!q2V7rI4X8>ח:QbmzjjD 7_nWw1d[ \Ǯ2 ʍ܏Z^Uvܛx IDAT3qOoAŸG|ZD&nt'ræ/:>0JVCª߰Q̚E l$FҦI)*7"K`SlWwFoc凜"=)w[ tjv 1yWdŗyO}e/˻o)*{Jfq[/yx/b|TKiRm_CN)aݿoyWЊ١>~W4nuU\V<ߵGcΕ+/cJ˥.Ta̪՗=&}2P .Bn5ʓcNz [Aˑe"ȃÒeMm H%Ÿp›t Dٹzy{UrT??ƒq|kFٔ'=㱹og"\q}&șK DvzBu%D4O%f17)1%>$hyc2Ƶc H9<޻ o^ˆyZr_{=2'}xϚ-xY>'\oߕ#5޵s =j1 JJS4qŕ=&|I_ s5T\ppmk KNdP$>]{?#ퟥ'd1}|q\p#xcYʒS[gCC-V-S? y5$3V'sHsɒ.ϼ7)>[pvV=kc|n5!ꁣc?yy&oWn5M(=S? 7ooתlk\Qs'n({7L.qTƐ*[1RZ#2%VɟY>OCmr,#_f@,#ezP:*!B-2YI:W'6;12•0}Iu qv59$\\[ sŋV2H1Ҏ{.gh)c`e̞m!LfZDɼO^D {g(^l{U tz1-;9ɅDkkK1#Ef8I(ęRP{qF!v`k:vf[Mc9 I!_!`97(*Ҁ΅N7&:aK{kZBnO &lo4Ss2e1}Sf'Z;ho}}Ko}ă4j?Jrj[Iw?Aq|lAE6/6Du3ryUda5V'Gt}GPtVpL!&.eƞ:w'jgsvytݘDVh5ZYǛ.ǚ#(_UɽW,u#,, D;Q_rHガ\C IS2p);{|d`W-䢾q*MH]}<]ċ"s9;yB|׌6zEEvB&֥G hVTr-MrP}4O_F#?E+f]&͠'& T.dtv6{g"_ʃelE48mOgzodvBFecR nŤ җ;|':Q+o)o7|s}ddI~Â!~x /XprnܬqF(C}m-DzЇ94\ Ԃ]!\=L~<Ȟ\5~ǻW?5 ޲+s̼j=ȣ5ēx@^4"0#k1A~F9g) >}?o9Yleꕶ 4a';ouGmi5x@Nx<؉fi\FŮo퉊K-mg?)^`! ϾCqZ޽o@( qrEA᾵[߁gWXȺKa*kVehܪ)\q́=n} ΃fvA'bQɬ 5xaBFܚW p?~YrU oP8Ry͊M\+ٿˀ-2Bt%Kl?qծ 9Dz3v3%۰򈖣DR[K,ϐQ01+c#&~חvդzN?.k)&3;?mEFA5 |gƭ~Y@=zώr t`_?OKfOS5)O|v >^!p p"im۹\GK흃"!)gϕNJCZI.dg-Z5#Vrz'b~{=>qOrGxuvڰzg%TQ{9K߰ku{̈*&-9r,E2/2tH>O(blY[:z$^:OfZEJ0'/Q?֡]\yXCQaAAA~D箘rם]x~~ <|40C^P d4]q#k<>Gy7wy}ăkZѫὌ78]Bx~4픗Gddo^_RZVTTh0q1&I#," !$B|m;d|aШ FhH2Jy䃟riY8hM)(aYL+{z~͟6m$B$ð6RnfXKGkW8;q!ɢV ^z5,1uvppX,na!Nˣz*LX\K\A΋E4&f;ѿl}\|dQ{:Z\ttcڷs/3q˧.ə3^8ҙ~$) X#S4-Ӈ2ullܝظ7oݸyNl\ll\Yu92$I6TUUih4 ܜO Hsclc,͍ch$?o HY =8 qD"t-7}e!%yRżs7pQ`p2Up{Wp=t^];LabCcm;d-fܼ-NϚlg^Yav'clq˱;[]=vqwvڊ nZڍ72Yppp~l'߸y3--,KD#h4FFFW$f}j(띹 ]p鯟y˓ FR8?z.i.7!Ih܈,j)daPLd|BB -(袻}'m,5 =hZ'Hv$" 3f|}77uN_SõS_{棽9\3u291 R?41-8Cr|o1uJ9q5>kW~6WoشJqK';Ӛ}^s6fT$BH( $BJޒs*h{*JRkhhhTTTVvFi! *`a 0& DYjbeqtH6&&q!VA|0k#lU&ǧA>m:P`uR| 0XE\hg KRV\}&&: -_#&/R2sn #EehhMxz$Mv+w˙QݚٹlZB a A6L:&-> 2^ NϚlgx1e6TOMS2~u!|O$$X_s/{!g;0j;$!i4vҖg9ڝxތ.*SJUѳ猬oz |eg*z)R*Y928\|qw_+@:pT$w­ԭg m066<3hk~ E`4҉ſU |!sRP7zA[i`)կ/YO /[:Q1[)% |xU>O'qq?\M-!O/>;S'+K{ Acš_ \abج$#wy(G>]rͯ3^\ b^32ɘ iK;qKZ$q>WwmV@;ZtuuR3(77BίQ}ھM,(CCoR(L͚[_gK<tjtF.{ЁGD֣lVFG?6s7.=$DQ([DRoɪ !3>ֵ|:R㓱C4?ؗ\q'-j7KZmX-E b̫ i'禐noR$EGz"D9!볯Nrg$m[~g#ע.spQ$3.ǞYr}Ϙ)/iBjHHֻ #`-ff3^miEMqV 9cYQ-Y@t:(yР~ )~,4Dܩs w3K޺/ƣ12QKu (+\qBa#: ّ5IقކԃkV(\ Tt&6$Ъ4;hƲ#CoWlLv?n˳I: `w ,OWQPؤ/IPe^Ke6eeYeYDbD"3 K?DnIv̻xug!)@=*>! ɫ7D 7c@N͟rIP&ʬVKkRP(M"?!Đeɜ-¥hCo&C]|w7M*+;9"SЙz `ƧbTTOH)~4ACx!EyR|0hrWUrݘףe,_G0[CTj4>25Hլ^NBhpQbb4 ȃ\^"=۷mwh2X@ ʚ2 ё^ӧ&&?%4-6֧w=Ux'^ )(Om_ IDATU}5I`H>/A]G07Y#cbRS{p>O \!y!r'jg&mEf?mJkCi`\Ud`'${Q8qHn *Hjcj|*7"*A߉ grX/qsYtzזzmkWg]7w֒ /_^dEQ$-$IIX IZ@p#ܜӈ@$I6 $He T:!N ^|Q=f:clz֨wfXY(G}ӇmS0$eg0&+k_ d;wP5.U61 "4rI* +HJ,9f'V8v R.631I GlN|bcXScJ\*NϞ/p0Rhr.]åA-B)r qљ}3Dj̫i`CtIi?"DP5OM͵v4ЊF``*$Dcf`4i8 3fGb9&3X T }7<@$9:-FVp ؐHⱥ}LNvdf_ ILu)S>\:ѧzNJb XpŜt_7ĝl}VlwDj"Sy.'>ܱKI:bmEHe2ӒVSv1ѲB6;`s* )/Gr:%:=6~YZu J2bR?*iZ ;є(/asqQ)(ZD,\I4Mt:25^o"3 YMM`NDyjK@H+AU=ՐQ#ݽQeQ\TԼgɱԋF`O+JMP8LX}Dlzr& L>/)! K.I{-\X r'M;c^^- bD8 Z$u%SSD*?W(nYp' kJ$h#uDdYn?a^ͬ߶qV5N]ݛf9n-d)LY|EB4ǖs1ȵEױҀ 72$I r;;; oqZi$VT\lvn@H^cJ:XYOčQĢ I\,jmhvf'\j72Ⲥ|2`?Xa6s|︾n)Mw3p_!1%.w!%.=GCuަ2")> C!'<<]k l0o,HdAկ)eyv4ぎXNԴ13%UQrՔS51R8hI5x-N=SQT,.L7@o D<3ɥ idzoبo(^]t;!<SE2O)}H@ aAI!o<7EcoSMXK..Ҭܒ X3֊Y ɉwc">\N.)G+O&\?9l^g_؊U3w"V$f"U/?s'RiSj7$~4.⬌Wmt8`L69 W&%d|f0n^Ҫӳ:UGYnyR2k%JFKHJUINbX (J"k)5+BdZ"]ܝٓ'NK!ҊYHHһCs_; N_/Avw-<:ƭY5'|;b19zR>`"d j0z !$[Kc1dR㓱Ϙ1 -׊ӳ~&ERXX7TV'#7ELjAydrmY ]F0G:8&H D5PE<:XQ"#aĬ1*:&TQOjbَ}KKdAH"=F vg@Q_"_ܥUjV>EN{.獛V|B :2\z%ҪIPaYB[N:IL8tG63nV2r]NJ͝dWfj?] d0[p;\*s,طWeK^ׅ=Fd3lڎ>ӛ VȌ??\Д]$m~Ә>G0~[MofOxd_+F wN-cmMڰeMpyʅ ?C߾9H W~~uMٴUK*b~\zꥃ\F3^-_y~]اA6QWTO_thd1+ŗV DN{9F Pk 4tA [k0cY¿Y}{Ȩ`Xb拧X 3"Iʶ[-< ={o:@g  ]9ۼȈyv}cƽ$;c8V0!X(DX3oe`r|~3.|? o3(Ȫjzmb%n-VF!% *+X&%2J,m8EW!$L?nl0 P#@^ @Vjc05׏B`ez%?{mTnq6bu9dsEO9!H!RWLaQdUi^x윴wR*i6'+ZG$lzdoeizu7[K;Y[B(f) F@f~+ H( hJ?4`aj&)n (ђV$cQOmܚBq(!.:ɫN~{w51Px}a;tGL9Ϥ qe͗E1`s paHwh,{͐`TʱlP!dJZmeBbbph#B!o= #AAs\\ðA$aO"$H HeccL߷ex}}z<y GssssqqV*asID 9p,rҼww{{#mGocl8A^F0<eYV'$:R7W} aER*JIjln;|j?;\߯\09.@'{ڣvfvޏlyю3Looo_ggL͛*ooʻCcs] ]ʼn:X};1cgOQ5NApF0Rzht@~0" HIj pI^kFlޥ{Χj3mX4nZ̋t-].՛yhck4YYٽ{ suuJR5444***+;[tcΦJTvD( %"DQ[cδOP^%l0:#atM6r>Ք[f_/ϮZ$->vTay%;|b'ђ.TEc?Zc"\ᝁut;xxz:Jk7M)U4sN.%{. 7.j;oxP Zq0`9.;;WPPTMhE)J__߬`Q/gȹ}Î3y:sJP6s?]Tg(i\g;0j;$!i4vҖg9ڝڙJ.ky%]BN_Vbu̼7!߆'tm͏"`ԙJ':WY)R7zAk[gݣ jiF+JN }fӾ Pf|057m]Y8eYgK6|qF,t-Hʽ:Ҍ/|~w7_O!K?N !1 p?|Jz^Z"G^"EYu?Fg!3ǝnXy[OL+|nި )CֹJk@3b[ ܢr=H"K:yFjAc܋/?n>ĭ[0q¶$毵[ŧ }W5qwȕRdcԜ@jTSoMҎ~ qtgN6K| Q+)r,J$k$ ƘaX,Ú#gJ.}~ iک mV]IzO*xZ*5eV#V I^9\<׼C,ZtWu+Sp魛7w7YɊ.3ߩڶ|W{+7%Cf*==j򌊉)9o- ?F>=Y[ۭ!?̋h,℀: گ 8XeOA e.ςp)!= >Y=>?sT ./bfo%bsiab]ivpR B5R:^8@"IkA$:C?:D9v~'7'B4i#($$Vg1`&iI` {G%ҫ tCqAu:cl9QW)eʌV蛾^6EE-O]aI=s9 t ^V6j$sB7ҹ _Ou(G|+@b]Hɱ꒿$3=:QEMlSݻ38xeFǤm(w?/ȏlA]/uE.{rlT#kD aN9/Tٷr^ @RW͜{ʗB@H|\ÚfM1@Żw_V?iKmaⲘ>l&Uc&z_|Fo;1P'y'AӴN,ϯzĺNiva \uޑ%tEyg{e;rŌH@эM, p@HBBĀ1_b0DGCfzc)i7j#\PrCFtjIFm[2ʘ{q;gi]!F@?_Q"{+NDs}BF.=SX5ղs%Ο,͕(/`k?v!א@fvJNST=2HPef2N}C 3B'+UgJ]QS<:&^$WGIJwݩ%­SIl Զ·]5|0 /;!}s٭+[7>=;6P8$T IDATn<5rLW{~f1I r;;pVi&::J޾ySm_] D& O"hcKsB{"Xi@:/Sgf1h>#MQ{5k/::n2%]NHUJbQc[2+-NrY )Z Zb=DG]yT|;ݙKo( uqf$qY0 si-aOq }8%fpF" e0W&+@qeo$I9L3BjF7A3{7 Ʌo`Ⱥ<8fZ,V-$64&ȕԥ$yzxHvWm%>mn||""̽ pq̾mg^NjM!pvvJM20eff֋]=<9$ԉ%qUE,u7")%VIR$A8!pDBc5~#(#F Nk u ؆{pFc;p39o<&鹨Vr{iڠ.2XnGԄ:v=G-?}rwoO(Gغ`SU"1`H"zw.zlmڟ͹T+ y-  F1F0U:P0m"bEIH@?؛y\'l"oQlRm*[ m$~@ SkwN:]nn*`'-5cU[/?zCKV!9> ?ϿȤRggWT*\nZ26 j:==Y*4X,YjevUp-$CڪB}и34+ (a+ur}<87W]qqqII)b @W"[!E/DTGxOI5JΦKdB#y_.Hj $r7, r]XO ~[k~췉-  `9E!Qg0FFBF0q$Io eY}2Z)g/{;AKށ]'^B ~^_ߖ(3ȭLw. ~r}u`l佭]7XkFRUDΕk58jGsi.tcQtzwo>[ q7Ϡ g~ϿV G9ya$voEt(sn//038 {\q(zNyIslN,5qa+I޾|?(FcyjjVn}L~A&5>I_Y  u 쿔]XVI>{cLWX?{Uхܲ}7-Hiқ( v"H)M@ҫHoK0t!=!{&1@6H9ΜiiL s \YmR9GK#>Z5%L L!YX,rvv ځ"ISBȢy;W3Nb z ((s=G0B;N @V CEu\~槷8i0n??@uнW t~nQ+bN#ILQ͇nFP_&Lm*1fxix`+'Jo<ghdN;ֵI?d }Ķ~D"ͨa>/ [ EY9{hcE#hc_|k?d+~{A/M^2}͛ڿpK9'N%skӰA;ӑRC985'Mޠ=nx[+.捑45e=뗽]g/|7|8¹9 MɿyjfOkjKeoܼժUKPho Z͈5u{I:ݻ[j3~@3I>(8h!AyDuy)^wZ0|L>\Ϻ _a2RK:jqM!'(:E6i=Ma4xޟIX?ݶӈ?O\$|3?NO߄HVq){@xp-oQǓW)<1.K7<ݵKlM׀V]Ȥĥ`; BN! æ|vpJ죊OPYP܏O`]{H0&45aPX{hCʼ=p0UDkԨX= yv]C~5ܛz/ʱʦTOL5딛K1;+4_)0]w>NvtA!q *6;p\ V  ɱ)9ʋoYcsUm|ᜲ),!RD{/ZUpHٴ0=.?1\ggZ?O+K˂BL` e'u!_/ ZSz#F-1 X^#4݌4Ӽm<|_gMZC"rk$ r6q5zpޮ$ĸ\ %%+-=-w Sjp}%rU e^6j?bmِ:wiI>[ՉOOʤ~<K.I0ƨX{KG7b#"lLLlpp#: |9)V+!gO9__Cˣ.^9>;* jMΕ}|z¹_wHdA@dH^tXI @Y.d5t~EC1&1>I<Uq|#;jdie<fO.<@ B'qtt  Hq>˱ r,1..)vvr24 ~\0; o&Fϻ>75g2ٜv]Ţ(ei$\]\bbbu:Zt,"!,-tJ26n(Ȅ);S6ñS{jt9'+OJɣp+pz;ʼn 2_'͎OTۆY q~=Ǣ}i;=`8ng$mG1{cf!*pi[v./ k`cCyx* (R(چT;+ s%;?%;WzGRB_&pNm}/sh?avHrW%ߡdʬ2d1 @=%x =˪qz؛}m$SƗ LZWEj]QK5:[-O1sgiFP Jr@*B9K!Iʋ)Un!Q@Ir=gzg/0C؛1 嘤#Ŵ ]wǼS0lAd>]\1_rMJnqAi0W9uA l,d^v 1ny[GJerLVe@, p)z VػҠ&6ֈOVE@RY8@I $ e$ޕb"ڿH]gK h\ޑR?́fTVcGD-] MחlS {O*`2 u}n{]ƈt$h?A25jhFWC.zMk+I2)&HPh|P$)U7'%߰wCB.ɺ}LNxp%cwLi-ӧڼiӶ6_[D}OqAVlai1_ ^{Йm@u챻ԀOJYuB7q1ٶ[!̪c-;1MQ s@y]7?Ld1vfOP瀠Dr[7݆IFB<8\!k..9͇넟n3X]M{+[]qV3 RP@ k(l RGMvydpV&v e˾?.z .+Rh.M @}&[B-U9'^!ƪtړW9NH,uگ\ {ZyY)+L$)(B{k3g)U /yQ̿$A6loAi{2n1C.Ǵپ9>> =GOJّLqGSʃ7)"k R?gpiFZ;kKo1{0,-gF}NQg;w,`XMTFBkܰ3~ V&@Mi=䆪+#Cfmqx2z;Ȼ [0S @ ${͗aE\ B=Z6CHNx@9N3}[K3z)5`Jb!!<)vNDY(ܺ5)Ɩb@+Nʾ.N@REh_3 7-bUcH[t7qyDUo݌ĄKr=Hwk0ߞ|c ͟Pǰ,dE57%7^ M${J*oUVs]^~A,.$LUw04bjVDHSNϹsGϤHH:tQ 6;.AeӦ V+JA!96NvtA!q *6~F H*Wb^8xyW[CS? wMK9w P &ƥ"po Ƀ:QGi hMPEpOf'o&&?wJ-,|CA_?)7u).5LO[[4[ٮ/ aX?rzJ ;-+'3/m]LtF)PF;_D*@s`'wR R& m.G0& NӶ"4 ax\@z $cusa/no&NOvJQEeI- (ƝHHDk]Ƅan3 v0'Dd(*s\3.YDw7"YcR(("(R k~BZىڤ]:,ehؽ2+XYy SՈ[߿3NYC*AJpQȚ W=,4AؼX TL>5y'/zʍu;x|d'Xb?4EQV!D$A)U:.V?eX/s"Orn$DlZB1OQi, %><A)\C}5+ بbEE%*sTa $] J3.L+8OHb]_ z|}[v-}ofuiR@$@AhmnEao[~ku 68$DTpjӛOh.e%j q۾uXwH=uu[0OXukKKz;UsjO|QƧwaeڽ{%^cMiF>oۢk;=:sJ[ܧfu[ĀKո=tiPGAR:@R)7Tnc粘8 $F`MԼlhQ5bAHT@O(jZRD}b @IFڰ8hdyǾbb-D)]_L[}Hκ`sW7g Uµyȶ3&cE+2, dq/5{ N^_HG/r)2R$z@}r}E!9>xzXI @Y.U;^'{}UwD&TQCGJ!KGGAinڭN\+6XV  ӝ\SF9V*#c*?Ys+ٷzzdPeD|$Uмos .?DQGw^ ģuۖ~f+dxyRe&mʾ}O _9to' p@\vԵ&GCbfHhfqu{hNm(>.C`yXc t-s 7y ŜV.:%; IDATD'8qFH WE̊,25эa}QCK}X!iB*&]Q.nr{M!-piԠQYFb̕8L<'>j!!>ݻy|.M[:sw2̓6} FK`_BcAwv]~86c32zG!J9h8z-k@0I.>2%$;!%.{ h،;F+,J9N~NDifCi J:v W#;V#ttv^ BB8|>:Ď@DL铮]oYv\C3w ({)^o.k$A?ܣÛ3Gl\rV򽑫*F8Ab5f&ن<#N8hnZbu?`̀< iiKtiim *USs>= HDuK:ǖ3bXS^@8S8;LX R5'aUs-X1h۠@7.:{zi HZ.$#I ŤԘ)$K-aoS>3$s iE$DJ&a@xYSun]d jϋ]{ʪM|2ƴQW`$A;bZ,!0nRVmӶUU!F:RKC&)0qDR⸇઼CSyrQR^K g65rL,.1SdED;BTLHϕ}JŠg`A%DzmCZBߓ/7(҄ZhZ.>&I9a^' hȝ>]}DsOC(y>S:Z=iN/'ۍƚ&ŸEIzyj Bn.^Uhs* ,e6Wyw{3q  ub sJ9, ml3 STX(Ҕdo~;g}*yXJBK> (7i~=l W+%& ZǜG5q< N~~~{H'OwPJ6j }cr9B3aPԭL&Q"l5P;\ŏLSѰ@(Rah39X B$U^yXW\`%Ct?sԆq)pWtuֱ'g ;#+2vk[MI HY5.S=@`+&uB!i4ev+fD a ՂODg *6vtkoHwG}6iu߷ Y&9鼐 *=oӵOUʅ2¹Ƀt!8Ԣ}9Wt^)#sI=wߘo+`N`>Ѫ)f}wmy*m'z^"&: y- b6bHp)5[w|}ۆZ2_idhJ]R2<׷ݹ&iJvl#7,]sZF6)oDU ]LTV<|n&KitҾZs`kcNp#\lǘ_7 $>>i̚hzAo)2KGHXwl`~*ݔ B.Y,6Rja]i+f?:$o;g:|¼mKX< ]Zղ6i#˻~靤u%LחlWtv.k\֐~ooF/[H`F֭\}jL9a{Vjug: *ѬE/pgmcwN ɹin$sV]GOtpau¡˷Җ/ϑ}Wl8~+S-tj+(t刓f) xY׭{כ.?7`oBղvp" s|ܙgَN| w}NbRqO/;YSveY&n_$_^TJpmWfc)x5q֟,l.9<Ox_.C}9p{T&͵ H<26fW۴'GveW7/[1srw{WvEiJ{ihgT~ԑ2"떃&yV nly5~;vZp±v{Qi–gI}T'߶Uۏ#m1QF]\VbI˶ƂjDW88W:ԕY4r#,e$&t:?l3&g$\G.5 |ee+/m5LyeJ/otaد}lF)7fU_/pj^~_NpKY92bx}.;@~ @~Ss#pv  WFx~NL@kyQ_ݡ7˓Op4:$m۹54JɐH{'Mh)zigAQE,Y0N& |\$`1(CU-U@ja1&Lt{檏޻ޒ0) 6nƸ YD8X<,&YQ#,z#srNC'Ny=>&R^98 up_ Rn͊'UMjY gЛf-fߴ-+|9 l:B%_78\Åa(/lr.bNCQEA48BԽl <#X 8umza d/sAۃABg[mϯ|lܫ % '2][84.nuٻ:ZAYe! %'݊ mgnDEFڰ8hdyǾbb-Di}Cm Ke{ s̺pK|赁-{:u5^_MҮӶt2?.[3g`/cɦb6{ֽu@WfҬx4ep\V H;Ґ~w?WITQlKFEv-*6[-s{GJ0@H͖a•dG؋2Fԥ#!:鬄(/͙\.5Ie*"k2N]d(eln H5cU!U rm׎s׏ᒥcIc[C lgV(^E^ӗ{]j4m!j{Ш^uhA!s$ l@yqc|1!#4y];"y,i"u}q@\C~9>߹/eA4 d8vD?Azn)7fţ$rЅtAf)SgaՕ<rHB:9B^HH{GքęC3TWAB|A)Y_j+A\%kWx 6+i!Ñ4edc \i3XS}a5:!,x*3_y&h7QP߶5 =Vgqdu5?O.$ KA֔yiuxḋ']9{TNJ ku˘t^->OMZ yo@oo@h#E[G߈JWohHZ.6F EbB $B iZ(&a9:F5wEAmP^rRni,_+*7,e"'͡Q9 sy%۪}'?IjsK94+MLIzUԩ( #DPL ?I{wߗ51QZ«8`,jg㣰}k8n" fX7#e*&1Od9GJ_ ݤK> ESY]^j.%|S: Hd4.pdM1)TAsX&úz*x׹+7n\\j| .}Gs c⢮߼_ Hepϴ-D7NT$v6z/>!!1FQA9\'+/;1TfFm`YD"Y79bTXkTѐh5d|E+@.vvBrë֟S{C|6-k*?E3mr]t kƟdK?)Ui0A sl..vYo7# =iC==;ͿMXC>I,@YP f5© A)VVz BFSOZ@W\K+3:DOD 08›#4@.,]~9Ʃy5 G_6Y1g d>8]k29 o l%kb֟@a F+gQrXa̹H nR,H[{82 "ĿSaLސ;_=zÔAG f7jOA`y<bcjVZ~땯?oUpV{8oQ#DXxK0U(!B $Oa;~HoE=?~(╙_yldׇNUkbCh}0CH_K;2;=8unp4b@/0$$%8t1w[$R'wGR'w+?7+ܛl )[4W @A{[I+&%iCpepZdq=YG'<O#M+: EGxmCQ R> &6til1Cԃ3\a3|hds&dMũw^\Ȧ_f=!2^ \tZm=N.|^l%(,S!߃a#PfC,p+S0N8t4<)igWY]=JHgهtrCtdM1tF$@}2~v'={*ס7u2N9e(yMH\a2Q3GV>(yU|.f 6^5oWF3A纬\!;D`}L)TC>ئ` ՂODg *6v]AMOu'p\Y i]v YM$]HAXYZq#ϼBMq l? mF/H z<_l>P $º߻W@H&y9;}l~߿^NE4wMYޅKNgm7O$,a*d 򤳻֯u)]KT}kZ+c] tT)\DeqGcr?>#G}sΣܰ~luE&rTcVreW?WV5ߛX5 P(4+ Vuz $R2/5F\ Ӵ':M+6:5cKtnM+Ղ/ɟ!S:[jiKHԢs^5TOY FJnݻp~VKwLiC5AZ[{!?HfxqHϛb% aOg;dŴ-hԷf>7`oBղvp" s|ܙgَN| w}NbRqO/;YSeY&n_$_^T,jV6?YE\\z? Y3F \?,1E ~Rsgh S01/n&އ9GH3oūgݪ,Wo+?iڝ$IZ~mjrqG] J~r;T .o\q`j70xG]v6lbL&_Tګ}s kߦ= êg_[1sU 6`Qw,Z8P-gJ[~Cus'=l@ÿڛz@zw.D``nEi:k(VݍaHޱ$maAQBzh5OP8U^Z.c@3 mr:ʚ /lC{ ba*Οv/9^asE9GwSWgu(oK?k+_xҮӶwm?}cm @BUx/>е1$DڿsmG74Ɯ1\IA=vOrjct\IQZ;ۭ 'cG_*0՘ۯqHu_ %d-.8č=x'Viu&tj{)! nيc>@Q1 16f,y;/#$ tDQ$`VE[_-ڱw{>\tL Lwf1YX?|{ҧѩW(^Aׯ{6;MR6j_uq[k ihtl#l Ee`ecʋk giNceI߭Op6#4#ށށZĠ]>?}3uuv׹K? så'#KR#'el,׎ݾ]*2J\C~9>߹/eAwBU팍͸F#R.2vQoZ9db+\TPv{7]2nٽ)R.).l\~obv2zƈsbHL@$M :AͭQ7ܹ:5Ay)JѴbVRUnvWYD8QO/+V;եG!`Ƥ>ۿZ:lD9>͛6N LhP6;EEQǙr1rGQ21Gq _)jlkaikk!|i"^ڲ?5S^;KmqtM%K~3e6^ \ƍ7i <ߟ`TFVesmX/uhЎ+Zk}ni;s#&+z#lrȱthRʜi!w=-v5QیkJ8+bMA޼_ ȴ~:mOoK2?va f7Q>AKem12EϺ iR 4>qXm+[ LD!miGd\.$avt|ozc?x*=c4΄,5?0|Bn@e1id485;+KK4)̉xNro7xM\j^XPHhf+F\湭g=]*gttqKӴX,.**6.@W-nb)**H$4MË &E}_ 6Kyh77RuJTJN lp߹kp˕EM/7Z ΁c݇t|.jӗjh]QZ޸v]*6/)@/n;gwQTk33[ɦ7RI K b\ r굋{-׎H)0B &ݙ9)d{xgvΔ3y̙'o fܽfORt8t L8(e"m丫Dq8x=z9o? y]ItSg ij$e3l^+7yuKW{s#&-8TD}ϛo>Fj ՝*xQ{֬[_m4~c,]>qGK]SjEBkincQ ]3<( @0唃}˩5.-o ^|a>]s*d]/?r gZJT0FP?vڙNi!sV9h]m_vqq( [g#d6|ࡖ ?~)]Pb}ŹC6|_KuC<ZeY__s5غ^FLߤyq9KꨛKJYq}Ò6]H{#LyF }e, !hL2Ta$rЏ;WT\OuJ`*-b}Fxû5R^}ڝw^p=sKRTP[UC3&MkPF0)9y>>洎_pujOm#UW=ߏn-fE"FRY,ڤN2?y "_,HFpYuW͎ DJ$o8[GTh aJx/`BSDҒ2h菹iRA@>ndHRAkk#6i]$#,2M#gK5} ǯHu(+߿ꦕWTE\Ѐa}fVR`_rB),++|bmEo1zuST_Cr* hOEJy¥Kx8Q4RBAoK ,y2^r j n8q@ b@p SopkNv86HFj:$ ۜ)uIQ .4WBU3 AYk!%WiQc}~OՇnە&-yĿ?칽2`Q테ϴŷsǍ\:t#R y]"PHw Q1ú}S&By]|}y:<,ů)Lc$˓7Nņ o2iBü$*m믍k7g;Psm&Y5kVd938"ܡezO\P߯*9.zkOϷ!ԟ5?(#te<g^-?y, Q цS`QE^ F#q?2"Pm LSMܬGl=k3 * "Ppsh6YnQ)ݯօK5Z xS8iK(!ԏ,MCT|S+-`)8tF;-PJ]<^Ӄ#Q'Q#!o1 #bU'+ϐqSc呯(NqFrz2E/K6?DrW>BWz5RSMU}UH)4 gк4:Gx9F6թW v:Q*:Jቕ Q#kӚcn79ɕ/$K7n $=^'v=PûDE룁ðD=jʐw gp4BN=s6C߹vR )~~}:?'1QpJJ,y]'.(_6knMch\[ BXB@Den?UotmfBW<==r Jda!ֻ+(RJM&h4icaDW^{⼈↿/xtɨebF_rUiGU q{^XZ_]ڐQ,9U^ׄ,s#@Y[᷿5('fFHڝ]<=>yE޸їTɷO/]*^]ﳕ+ _/FZtgE'8_oPoF'ޘ" uH3ʗȐ2{|ào{2c?k =|=Z~'-ϭ`|~Q͸﹇Cm_5ݰjZO_Z݊a⤿([j`Vʆ90eu^L]VJɷ Eϩ9cE^R^\_OełSia#"IpYcYN"W+(ӇOV2 XD`]o/&ڽ.5uAsj5An֣2^,3qRZBhBKRXUvV1[8z,\ huZfm7~/vN9牼8GNge)4,Wu~k_ې2qB $*.2"( V"Dd8:'Ui].7L޿1%<+ev|Y٧~ٞR[ݣuڛN{[BK0~TW/Z#J5;8agY*i"ǓHIDATS YE曺>gZC@`5`"n[h黫jC(QhAQ~=\ ׿q,jԝ$Qkf.*ucy1yQ)SNz.ָ.x񅆕tw ~ ,We>jՓ*-R}HZBЖIkg:E!PdB!!BCFB! Or!BCRuDھ!B1Bs?8ydQ7!B96*cd2FVUR'!#@O.}ZRiZ\ΐV8!B]:DQ4ƺ Bͅ#Dl1PX___QQ9($p($B!ڋDzbJjZ윜ZƱO<1ZbB!teaͭI(Kv&JLG!(U*pك5 hGB!,,ˊICFQ#B+01jQ/ `/#B@k;r7?к WMB  !#ir&eD]6!"?xX[~*@Μ*b\qZViD2eAt̎-f^%J!tq`5"OW$ )93/*Zwl_Z~y$Lm?" 'd܂VD_{]kg'Nj"VO9]Tk=gM7"yG ]]'ЊZc%Pc}kf$j lNQQƌBG֯9lDžЊGO/7DO>6L7BBFB}!/#O ea8o PY[suqQWX0hʮrNjiͼsET$*gMg.<`,|P7XWi9eJFۛylail.RSr4y5:t4c1҆#=i;܋mRF{j8Zr*i}ET-7Bo4r8X!j|Ex'Y!ag+nDe :#FSq`$ /_cfeFLO 4 v$6u3ZQNn$w""yyzxznj60G`DwAҒaNT*UJJ5 witn^|t P߇!bbٜ2}x(xFWe)}( Z_?%v'Ҁ`_Rw@X|}d-jQτGl[֮ݖ^%bg8wƽ(T`3 ( Tlʝ6` |Mi;6R#߉F,L_}t6O#Ɯm(RbZR voNACGQA ?ͯP*t0 VG9n8/%Td+u!aC:l,E̸- #=ġm'On9a9LfM+ fyE%Έ 9̬(OB.CmCFfpOu Bu g XPBȑA\ce'"XSJ(x ٖG-*MKLݽ&{܌R3S2%nrR_c:+Sӻ,ctzw6=!n$ Hu*N4@P/>QdSoF9!\5_FEJyYAAs!m$̭ To2[*Ӷo Ƒ>JEUv D"ah6YDZr_j k qZ`cp\tJ7is2)۴fNYB+Kb2 'u<a%R K "R ״o!#♳gDv>[T6!KKztceYǾKB@sC!S[@G?Qb6Yxcy,HbJiN[|lYh?]m5 `VKVAFvx„UH):<'!#0 `#.&*gȸn>[BEq5= !d=v 7dSKd}_"* "nm!\C> 5jNVc#xۻ%OD+@(J^t:muu5cB!tE]byENu4aOz9S(*R&B!6 B]*舢H)'4LFXWj4Uޞ:ZۄG!Br`ؓGL&j^^'_p7Bb B!"d,@!B ߘF!Bm26$KG_B!BH$mȴ5Zma~>F!B6^,WktQ#ޑR3 !BhH8Fg6u:}Dk/cchV5U/"B L _[S=^F 3 !BciB!AԈeD!B]!Bu2hB!EB!eȈB!!BCFB!!#B!!Bax٢vrG+Bm9W!#m(9zᓓPùxVe>痏^}w~g~̷n^RG4Y͗UpVaB)ɔdNϠΎs'dW-wW(𸺖gy{c pn3+ }z(r\Uߤ[lzxfw__G42Jwo__jDoB+6d$Gou^y"}Yw|公4-HG=Gv m}d rX5/7.3Z<OV+p;xοGye6ŋ[h+pa_g҉?%wJݺ])9e O^tF@珼qWޛВ_xrkoUnkEkCjI-h|c&Ϳ8}c]8lHKvcym]6U5?nU禽Ҝ hů>NKGrXBhilfh,)^a9vm~\ط~o[qsBFfU .lY]{vMx笅ޥMoq K7.{P5_Yr#K{ JO o:El齛Yiļy}z{,d5gS.+R)Y_rJä&"s30 6׶ϽsNZY{p% ^뮄S[!oHk֦4;;y+i ٪%=Q9;HO3NLkr!  Ꙁ`I_ f~ @Lw[QJ"Bt4?qO ְv<6,yǾyE Ru~ωX2VP!2NE\,0ѡm4up{\8w@` ڼ;/|a o'ڿ[ a_*s{ ze[A]i5D6ۡnC*{%*ajMS !b^ʈ !n(Psެxwtxgҏ|ऽ|QnAHELsdO匝r#cI6Q}jUB ϙ z f)>-fT$*IDXLp =}4DM偟~/lۧ g4 iPR>AlMnCɰ>A\yfzjvTuz侃eNXzXt~JKwx-yU]D=t'_~Zٝ{NvEGQvb߇)*kѭu҂]vZ.\SfFp^ζu„}"O%XBh 7h$ʄy Ǥ}zX[|>W9M|*y\۷~W 2ьf׷!{4{¸&?û`pwXb="wPdv_H˪ c"$W%Μs L)IiurXo SH/N<|Y#5jbPvv;:AN+]@S6)'!/;aCwq>)@ViKTئ4٬WԽn!IW6|h?$ʅB)Dl|q%r?,~EiO<.[UՀ6(o&v*b I9;1og#`wVWG]-v1sxD"%}j6 qd7傒M\\Έ#Uy,_痿lLb} EE0 p`@EB)OE3PxC_lX%\uM[8qD]{I:X(/'N2uY#<= ,:zXG\2UPW 7Xb` ۝${)B\[$#]-5onnqpI9~N2ݺ&[xګ&؝J[dgWWdZ=BƋ ލOLSH(KXX H )7vFZP1ktnI͡)}U2UE"pʑUI8xNzPio.Y]pp:H+jA[u^գpQGOM Mtu Ē=*@7);,J؋}]D²(B 7 ]DQ:b[ i8Ze7XOz~v@6\Sbb)C;icC ҦFDRDD5U&|", xxz9YIRωG #e8xfȤbf%C%"*FBegRc{2i!E,!2j( 1Z5RLi?8drȱ*TH~wk&'ܤP0н 4}l \im|^ok#onkp >!9P(gM9`qd pp){={nErx pHYs.#.#x?vtIME 8)vtEXtCommentCreated with GIMPW IDATxw|Tǟ9mn B$tD 6bGQڮb^_˽"XAł([B %$l=ec$$vϞ33g v=` 1PT~F)082֦By ܄IpveNkj5~Y݂SGY'3/ 5F]|NOni~,7BL+A3.Iy3,kVrk'phiT;&,3$G(9M~Y3'g\X#Ps d-ҤOg~@O N}J0B*$x!3Z'e,X R}R*θ-rfEŬ\гnHO E/jFG,J5Ir+BYw43-EU}7yujgYU8"1PF,I9m*5EX3v'k(3kX4¦_E /*Uu-1YZv=ybZYu G0*a`)>.}س Wk g^OYgg7ot- Ayzi+QUBPtVkv~O7ڪUOtWaMl P0m9?W*xQ*ϸ䵀 w*ie x+#€#E`F~B0BcDgVAAJE=yU8 c&0ZNt:Ayr# r1HPAn3B8Ƅ`>'9T.8UdAA ZtoWr`1lQCWZ fa"DDyD?ؾ"q,h*AeU҈HZvgPFF  HBT @%x# ȹ/+5I3$xXF)D1"0(0ƀ1; F}.Gb/ =>DɄ"+9'$w6xN8 \V kzDuPo;QrR(0rKtvB<i)e'K 21uyIKw5ߓ%{8[n={N?"i1FYaiD40,.ctRDDDZZ#G$n1>SSz#yͬfD=|MJFGO$nXXri!(0ʪVR**.ћbȧ[g]6[5g7n6|'5:N:jC3\kXEF3X^q]닾vwF]}vcaũ [JKK}xP?ؚ`j%.)@xQ28 8^o6_)jWvd2N fSI jEQyd 7J*ueh1‹b"y>UQ)ECxIWC=UW%eNj),~ZůqDp:&"#:Bݥe^ FUtݮrW)xVA#gF0K쫎E:sL}}u( !\N^o=zWԹS#k:6ެUFeOJVw){2Gs}o>6H4w빔7_=X_v"7"9.n6rrqζ::-'v?7X%h0|Cû'pꋭ!bw3˞{B-;&D-N.;KBӐzWf&&D8ql/~_bR}UgʝCífrX?ʬnYT)ZMG;1I[Kk޸>OuD^kctT Bݥ};c!+?]ToSKUYPU; !#(6e.?//e}n*?/Lv>IblXbvU@8WJ>UP:UPari4-4wz'S9"e`PShBqOw@3cXAu.Wos1o0т}":CSzu20,gF{NMI~-#rWbWQLSF UUi~-$VTTwLcO-̗xVc/`6MPE=r]nyؕ{#&n%Y#ШTwYʽa< dw_g7  P z͢@CϫzgqK Z^rLQhI:B\[h 0*;C9YI?SO*ys,ԍAZDQ@?=O^@QU5r*)Ւ*ʴrq@-"G^cC3MRՕX_[]IO#H"j XS)@@~1V| p;QE*?o {3𓯬Xs?bhN<0EQb8ޮ Az Rgu.VAam[H^oo9CM|֨ն?KWb0R` 4x=vzI?{=*]X|+m6Q@GZ%  zM4x*PxJJAT.QvThe'zLcOtތwbVAA3VJ>֏gLI5߬{܇7!w[׽Ui'5Y5+Q_߆u>`꬞VA;wBcM~_:ef~N]2Eғˊz|?i/ 'OFGGRz ,[PPh4+%_8ؘ1hy쑩hn'2d @`e ZPKzҰѸFjE+/=fHHE.$)+Z/ߔ|M@pB w|(Go<h_ޓ 'RNu=a`(sfQ`ŧ=6؉~:Y F0KpW&?2oG\ ycSR:o>fHZt KdimGh֨;vʩ<<ǹ8iq1 I2*'u|ǣj(c2#pjiHadψdʇvy3f>NKh8.j +R5E z( y=ebeo=s/'?>AVݫ jPl2n8nI`QIjyҀ5jCeWU!No5<~J V&EeLMu~U@x^t#J厍 5qef)xrlVW'0cxa(#]q99Ts KRM}fU7 ׋ڞ2Ԍ0Uc\fWV#T}8fbf1H2O]E4V}J}֨uzc f`bM4Kmcrb4 Bh{p{`W}.((,-uLBjgB`sQZzN >~tM&}Pk`?h\ Z"H[8,/w8hz< b6 !u9q'GfH0^ׯ\1@ ExxVXFAA <}A`!AABQAG4@/AA.GGA|AAGA䂑||;AAGA’|AB  # E# EJ> \>J>   J>  ( #   J>  g* GAGGABwCADA%A†@оRXܸѓ=pphhm6!$DddLK FDGA.BmwmZxsjO~S\}{klqf ^Ӽ^s.woKlQ`D$y9qGT] 9FcjRjQﲇ;>}A~H:tMI)۽;' ?8i\]X,A %xɒMKKKqb4AoDA'(TKsdȾ}=в\HA/:Qԉ$ BxNԉqj)jȪW(S"bBN=ڶuk]w6on 8ȏ \HFɧ|p}N^}TTiTo.Q'%I/՗DA<<P*ů~Qɲ(8L.Nozo2&z֟qx0v޽yfW}PIo0u&ޤ## ȹA,1 H[v[=s5,̞JtH:>N 8 o.˖-۱c{ou$LzXQkz]yyM vi^~ǟxo#3Ψ{p|@ѣGz'NyI3uΠӺĶӻm{_`qAAPسFed=hΨ :ɨtX{B zevf& v9Ng]It]=V^%AA?CNyG4[|+-$Atz!!!$htYںuɓ'h4=Mԉ:$tAKXYΟ;K &hHE2I'ثW~b*˲j~ڵkL6t\OIZ߁֩SyZ/  ((h>#"|= fX\O/q| lmj9k׮  >\5t2TQh  mV[ş8^78_r+Sq!!! 4tB7ox{ti~To~ A-{C][evJWbf9_l6KҩnT ?i_*w/$J`ӻv  V j9N Wjx3csrr8P5333!!i?CzznѣGAAAJڻ?Oj-^ Җ{<>%߹fltHND^AHӖt=LJiy(:9#G۷o7?^^ 3Lk  m{ xBxג8x^gteʔ)zk~~~ j=ՇPZa=/RjׯZ}_TΝ;?=@x-9My7bAA{DQY&yyzGr`})))/r`G<0p8jmzsFXoݺuz{jg2fΜcǎS!BU:,҃ 4jvN IDAT78(<4Pb:ur=]tYd !$=Ji[VMHHHKK;r }h !&M~' C (n Ty|?tHPqOM7999cƌ+:NOwj2xয়~:==u>}lܸO> vOI>q׼8:Ȱaöm6gΜgy_EEڵknZkN57LLL=6p~!{C7tӌ3>=u>o6K1#<1،ؼcݺu}C=t5p᧍S2JV~)n0 H :'58 P֝4\bccE}۷z'56J)uIh3J> $ EQ$Ф$jTcM<Ə?~LjTըJlEYQ XtAyط@dMT(8m${i6`AMJ_'TMU5U4IL]8}Ai;+y:)])**BqK ^,UYUUUV[˪*+o٤Ȳ 7 z0:KJY[+_Qj|w~QdEկ*~aVgI!5ŔEAi^y%'#n=GUYU|WYvl!e'NDL Җ%< G>Ҽ<Ӗǧ/>Wk1>Y+OQ|aG^X,Q݊AA/fs=>̹+-d\? )Ž-BiQQNN{qu}A% z/1 [7%W~W>!{e + ֘{ !BHHege>+~^V \>鷵Zqa /<[XbA3'rͦ>}n`;,.{~ܾ_xyzO{|~{͇_o/ rsCb+ck9^6~[bak=tOQod{|>_y|>k[7OQ:͙g? +ڿmq/;7o])pKX/'@^9\g]PNn_ޢ}^-;&ۦ# .'ez^3qM[j~?>_.+mUYvݻ;}{,+Em}ޫ0iDu^].y`~҅_-g[o+]Z>8+ݰgGG{y߂}u3z}bhTLȵ!U+xi]SO.XYzr+9wAp~U#2.:-O׻345J#1`1tFOy@-G./4WDmZ??g_3 AYޓ0- sz1vӟ$mV7ŕX̻ RĚ56)EˡGۿ\P7]I:s 3J)T4U'$kɎL<~ǧWDoU=oбc?,VR?U_ۓW,aq}nK4XjfL3 WyXK%kf;k()wydb{ĉC:w/ǿ9}T4$uKuz K]^*;WȱMvV%6cͷ_H[ywe~Ѕ&\r[F$U^3EwNI]ӹys{St}s+lϜ֯˻ݳg%<2!%b'$iYǞO?M81#'2y)F5UUKN*~{oӒҸ]<{w]|| we92.Z).UE#WSEK]|D̾ťd ;~zDDV/HFx?^g6p|_>vf`2,'wl)j?Tسa{ p7 fߧ]"gߙQû vnqf#qMW>]pwu\9?; 7ax]MٓSRحJ~z~zcݳ,n}S:J=Y133nh/8u[a57c%u?;:m˿\ v{MgƜyny͂%'3︿ohS[ \dR'ҜC,)"o[]bg No'$$wWUUE:QDc~EU/ˁ;}NEl^hYAˆ>~?yLVaum;dk~sͥWn8M"|t֤d^U5 ȬI?zlҭ5]!mkMR s{-u2+m {xͱ<yVW~]{wzg '7*$v E[t||Tea?_]yی},ÔX).'A 6Va 5A!i<$my\3$ط454nl==1&Oݻ& ~ߦ^ vOt5W cR3$n/ns<2v叿uG`}ONnOڌ溅nE%]n~k>Ťw~{USTIUQ:Q $ 2M[SW=cC rs/].?,|nݣ?ϐF/G(_c_k&GN=>c~J"8=wy^.Kyvn[Kӫ%{l1npsU)>tLܢ.ԟWw?X0Ņs'θ@KXݿs8of鱈!."?k>G$FMOCm4Y&B^:kS/ٶ.{"u/zk{&]0nْk~sG4{x&1RΆ֟\*OYٺд4{jdt /R^8T&j^ TK+޵pR#&MVAs+]5Ŧ;_<:4wɌW/Y?>{e/<E^]Jmc7c3~ŋ^scj6Ĉ F#x=S**<'ONN8czz-Ǎ3ed`+ _^z_-aPCbq]hnLݺ ;7nfey(Q**[,bX.33bCjm!, : =RwMC+5.7qU7K9 rǡA(||A(Z z W.و  UAA.xGGA , \ت  (   J>  ( #   J>  ( # IAAGGA )' zܔ1Fi_μPR`i(lFH8`4BB 0(!(䯆1 hy-ZK~qaU " W"@3c~Qp"lGF1.hy-Z)q{JKK]қ(RWQktL܎&^rsފ*EsW8q<ϟ~[ظ CEpcZmkՒc_B+̥YY4By¹T>])cV Ҧ%42ڢQ Wrvhy4Cw"\6j*ѲS:=N8,u>n mC!-7TU+ ]/%| pAHo Uw'0.a-zsYb^ELטi)Z?21λq3\ KxlÆkl!4*:6@M4:f Mю,}{᫞ψ34x>3Me?2oW[_װ|3F؍h9z^Pϯim<#g0צw\ :=S#zKX`Zyϭ[mWgޑ=6:XUms{lkO 7VOSbC|7vܽx),CcbLB*7˿]i MFwoԍw m~{BVjm&E/H~h iSc(8g?a={մǯ:1AŵKSge;g'qç?=~=DR6viOi^_'yk-@'?aZOst!1c,Bϩ[my-{gɷ\XIvVW\ Adž-j1ZkߝzIzq^|F;wV:&e_$VgJIN@zA2ΚgS/ ak署do[]/s]=ճ/:\w}lώJ[6_5Pɯ+;J8wWNoIRZO~Sx=ˢo9X,Q>ХaIG{Zu2m#>km&1W |N 2zC?%3ِ9cD>0?o >̝ާƯԱ뻅Vm?$n&L+wn?^XV]h%WOeD=?-UR9KL!nޔn|p*#-(s`L|Uo1Mɦ#ncT.#}鑵.vsNF]23>Ҙ8KLrrge^>uoY#+o7_yC<4fI}& [ 똚H7%O43o[7QkǞ&Mh$mxv IDATǶbo-yjLR= ^%~x t3vvqGWcϊϿ߶cqĽN.-Z/,&g/yy~бZ=LLVb~b..hWgGFVHx)i_/E`us kLcHFV0g<,i仇Iپ? /Mi N鸘ڵ{޲ v̵I)iT'> 1Pwn~G˜ܞ % a:ǎ|N/LIEWP)LW.uw<BOz6u]Tܲj{``R'[o﷒Z9 wK;l/Uz#?u9Aa1rpV7N՗&?D xVvy -rB̫wv[7P#Y`܅^ؼ@ 7>xW_qוo[:t=9Uh<#4w vnqf#gp^"Tk-Qo~ ))}YXbB ݟ7 fߧ]"gfl o\oΙᙻ{֊w $b* |Y}D0E pqmzQYYL޳v}-#;5JZWg_2lhl rIk_:{RLGO[`uز ׿x畱@(+Vl>FICzx׳V Ƅ*7)z' /=i<$my\3$ط45k4#Y]Sӓ}ƺPMez}\1ZJͯ%;Æ؈}|cgN\~,X@)E;tSݺmƶ@'Mř~Klecj.0ª̳uOy׿xFk ֋.,FK\Nzpͯ)XiۊǎzkWxΰ]_kniB3rK3YͿzW,~K ,:)'9Ĕ108{ ۟0"JX}# ucڈ[y< BҠҶ~|Ё},<48.v|/9A1q?൓RDN;-tiG.~'f\DTrRe8&ѫq|B @CV~jy.C~YVe=Stcg8fwppޛ(E{FԠ&vƟhfh%K,aw9?(R|?nvf7bJHڃiQ(]@3=Tmg-l-7_5᳉EYu25#uj\B^mۘ[ 4VMN:%($>,I^$,Ws_ճW q%^[e㰩mPſޫP#^GBMmp ϱjeP8jKE )0,,Qjye9{_Ν8}A;Bi"`izR\HvԁW+- 9s~ $^<9hbJyw$"U3 ʯ}c/BΟ>ysCWC&RzpFFb^Wk{Ȼ'ΣN/^Zl; @跙0}PnUl0a{̠vXMuZ5FȞLTb p]4 IfB@34[ߟJ0 <U][5_X}3oڥ*%1uޯe3; [3]U% 2Lߺ܎x$U>cڝ>[Uf˘*ᚹw3cq̥jVsдDvN/?@rs^EXEI錉E5wuJF$ؿu1Yl-r#3:k=wI[?QWT#6-Z99ԌZîuھei԰( #ѭRu;lX3K3w ZXLaelvģ&>:ҭwgҴcsk]gkk8D[s;wƱ [(l%XYI d}1DփbAؽ Zڟ\u0U^z$zzW᜻}SWk6Pڱ`B߾拎ΊM9|<ŢlfnJZYy'%Db!vih>zCZ/V6|uNXJ1tQvJf \.M<5تD=; d.F"ԴC;gA^Ȱ~PUb_1ޝO,=f# d@g)MZzk|/K1$:ݿгH33Mzo¼NKbn>.z'w |,{ou{[!d&1o8ԷJ/c+! sdլ@WH],As&ݿ۾Xe :j{@Ҿo{n9ԁ¶ChgR6557HѼgrs43ou%3![LcכH'QhŎ6)cG.t#BزKz:f%ɡ$rU~~进 y|kD߈opى)2(=Nz84Fܿ͘ ˇ'Ͻ40ƆQ޾WI,qv Y#] 6N:5GRHc֓&#?Z <&50G {OP;udصoQXF1V}oyuOec57] HO$G@~G19KL ]C$7,b>Hہnit ]}F`E`kyvts Ok{OՎu5yO.5ѻ|a!|waqk k.ݣη?hݣV-\~-sf٬̌‚< ;~ `>P8Jg`lbz(?+3C(wp] `>PT*uZjJVfՔ1j ,,`0 -- 4e+|mU*`0 C5w27Qb0 C``0 ]>`01 4*0 ?Ī˖Fm#BӔfNuLg WK~ yS v :}7c)Q*? \=_rZ|}u̫mW@of 9gl+!#?0Oj/F;~ⱅ\̈́1_N5b5m*'S GwY5)$=*F&qr2˪I0L/&24؆}FAѧ[V'Y}pFoaη-[amlEߝzlS*ѡ'ǥfIb~kﭗp5{2w{9 `su*4ez~ ۶:cUJ )B:yء- B򸨆$`gj:Q7C8Axji⤞|T%nՎɘ26<o48-Wp"ZzlS جs~wz/=8G!U\d< shp@3,'Ua'?'Nz+ƩXֶc T:Q]=;}PU&zܿxe@,g^ፇî}Jz2]zϦFHM:O!Jd,BfsS٩j+cIYwG3dp=kBFla\L*a :\)?wوo\RSG^ ; u|x¨QM-hK5X!MED.gJ}K2_Il!1OSҤiGOm'"&m]+/JXvSϴyoȞ%ʻgۡW4Jk? :!"Za+µ\[aA2LqFmGrBtrT¬ispP(t'=e{ƷyɈ.6hlJ{QT4mQ@YzHZߟ/ۤV\% @'DƳ};!p෺xNz.zE1.,-XmEXkJvnmBTi.;ǻ#O-rooWE_b$)CnPvVV\ B]wˤH$UװO\YitD rts@݇CQ6;m]F*mR\(<\4_˗>ޡVp4l.bƹt2b^R.v1\'ȨO&;>N;h˜/'lf"+Yfˌ#:%:Vi,ְW0 GeY=ٗ dD{x9ё9"WWSfN` bdjJIQ;TUL#C WVxsƦi̔KTЙ!Zvki:-~i[pICR ^;TņDzn,Ja sxvq9|{Sr~ 1WUlx,k,@uvjH#ͧOtק O(N\O^>!15&q1Jj2/O Joө ɬe@㑪?YRIX@+Vܮ*ֲ4[rkK2eXXjJ:^(zYE%~JKaP*mŴ+gYeJ[xAƄ:1"Zaʵⶺ*Ύ'_tJbZk; R|6ǡF-{b}~]7dcv?WN.1s1l@-JQG&]Nm9UkVɑrIs#\uvj*;@ff܂`h-[^H[xC_Xi|$l޽KAĔOfG$vҏn^~n`[ylE@'E*Z;͏$\E'ݐg'j*BtRt¬sBw蔧w^ >eO.ҰWrMm (aK]VlfjmIuG/KYi2o程ṾXȡCMؼLijT{NɎ! x؈0yafRؽkןtMfZ?wAo,Uttu!'ib4Q,b#=+{as#*>&_Z*GhXCeQ^n.*DEeljz{󚁫sf0볠e隡fSA}p/ťYkx SyHOȹ8z=s%۸ȭoP=X5vmY j)˪bsN.9O^ϧ +uz4W̩~t\I:-*FfYxd󩿗1qlr',+S9Q3#Qa_l:k}Y]]>bX `01 ``0 Q|+`0z #":2s,J+}1 ^gWz|c09Wa=|L4 emP~sai|!4GN=b`0q>{Ǡْg)rm^S_{4Si[=a`0oGnr6kgz:s-Lt IDATAc+q'׮M赴 {!xqzvG>&ɑH ,|z^}0mU7,ۧrnj贈snYcZ*+?NU 9ymTeH~?/܁%kZX:q't2'@\de0caGV&5bIXxnݻXϻr%:է-0H?xF9]* Lq3 MW5fUO.jRqIĉ7!'x*쏱Myl\l~;c`˯o8[7 |HKC{7I>2Ǜ:l{'U[w')f=ƌRhuvGo%1b{߾_|͡RH͖$\ݳq9 Rlov0Bl}[?JJ)R!oJiL̼" léD}FnifVG^8Z%z:bkJd/W0N=tqR!ҳ8oҏj0:rAB=kjʯvTQK݅BZ}R|@kÌC_U.eɺ{Ic6.Ȓ~-aM&[^z+7lE4!CDe0Mm`e2dhbg'h\3fCM?2"2% v lqJDdͰ(i܅=w24yvtyY<|mςDݫ,U$kAx0irC=4Ex)_sY/.ݻ4m9Z+DDX:֎*=yp|8/ (>3&7DFJmP$Ħ vIYZjc8 h)!._\pL5a(<[:4MӚ31:.-5u&n<ޥ,aR?\sayÛG+N&{` \SOK $ϕR-aFDݽ]>]G⛹4uw 0^IK.('*2*q@/y?}d;\/#-,bMݚ8֮JM:͚٠=jhj$yR2It\۝V1[HqZcDu‡I%Kw9r{yz&9Dqr2UVײN!3ǓUE7DTѰ :c&ˣV,ᰎqҐe 6A<>_D%`߀c>R)(R_"`-l-Ԉ/gS$(.}=]:7MmuTX\:JkU265&U*,:Ih-#j\k[Dݤ̅M\ pӬW67w6eR~,#?;ZESw%0GW#P G\al?_^GuviIhA`t)D<IˍuFUjEʲVM/߱F>tEf"I 1 [#B̈́9+#+DZ !O<Թ}ρa&euTN/Ҷ*8\.R*{&Im5]{[:* 8wh?>"M@vPIOۛY&>_LmK0J߭ssΫK57 ^1'L[ !ʼn,ӑ28 v6o7^bG|y|0Y{=U>h z)>g(v;6D!4sL5Rջ}c^U'&(bf9ş[+ R;{,SJS"SGaa..@* wQ$eq[Oj$0v&YUL:!B!ՃT#$JԸD4؞4 uH6P|W;Y=71ʘF4ךgM wIks(1Lֳ0eDYC^K+P_J.]i׽o76I4NSfm( zQZWFdy to?!3)zURLQ7o2: [e9>=IC) OHx 9@ f@~|J}Y$U ahD# CMQ,k|^P ѽB;UAYh沠t=LQ>ܕ=7^~?2+ᄩ{0ye0eif<_VIZQW,~HݎAȵ#Gh ZIB-b ݮ$NɤSf!8o)Z--^`~A~pW?HKP%9pn= Ļ]h#VY}NucWV#ȊUƔYϰشh^sV425̙D//ShZƼZ?{r|)7kŭNKSY|H2NYe4VNe0Sꈘ7+[0,BTTTJ>[]rBњEk&[U7J>- o(u0>b9)08/#: RlWE/K6PHG!`](w2|44QyvmŭDaأ^WvجvU\J-e0$ab o2gр¼MVr]¢ -'آ:⋧=J P1M5aXfy_zT}Xe'1B1qIq?Ə:g W~u%YQR*ƿ!`0vCz6ovsA}NA=Iǝ\6ҦV: uR'G"].4.˖?E?>ne]M)" zऋ?4`Ab2N>io 5YXP#,q u򩵫O[Naveʍs#m ]lVtﲝaj.zٴkWr8k:}6`>.c#uɇ4wsw Kc#~9YױyR%蘸uω~ybRhcؾ.e:;7Òo/ xM#ՙWMAz8 0i׭~%U"sN_ LS^ M*y ruY#ŴM3Zd_3V%,Z4І6қf?AH(zׂ-ͧ-Ք_MI%pRg>{)caơj$WdX޾SMRsΝk1v:slv}8&ё#VC{ lqJDdͰ(i܅=w24yvtyY<|mςDݫ,祣NSQ%']C/GzNOe vokkUܑ?8C7AW_$4)53ʮόI   ^al$@<r)"kXiM&dFxؗwkL܊)yYWU5DYAɧ6|;)}Nk?L 2ɳ3c%8\~C9wJ G\;bq/_f\ɸY ӗ<Bz2؝^uyz8Ф$O7ǫ)oq;aעSi'J~ǂ@ 3.]s:>nO:"qiþ+KtLt1mr_g![YuC{6G\_RZ=>sʯ9ii7& JU!q;tjQW{P J]G a`EJ ԗ!B&c$<{1[˃N5YڙcScBZ(eT8y/:5_r4uj\BnB}"lAlTڱ/s`}->pӬfeo2{&ՌUmC|BUR;sF7EN~j|-*{ysTxsw^xOY[73dʕshsZ PЖ^GQC۶\B4lX2t#+&֐F$I9=eeS|:܊߯p6$>"U3 $eK fœ] $^<9hbJyò^[7%_|XHB'BP#=}=JK:ѰeOn?-J{hQ̡mܜSy @ )Wrt7;lC-p .7u) TV 3l@KI;4lu]w^x1mz7!be'׭s-v~zW9?mǎlm׀^ ZAYەiy4(?ճ4cl;RJjVF"IkG<!3)U!ʾ"9 []s4N޼} Z9+0`_Vx B`$F|pCK 7n0cS0q5@.9zZr^a}&>#a`hyy/م``h?k4aϬF cioֲzVΞ7SF:, 1r^j:U._I18׃*ZOOĹ<y,%@䠏]WS5Vi}HOzYc'/&ڸ=H?\?ȩ* m\$ּ}c<|H΢g=u;ɮC{F2M dE6V £!ʌmʼ8#CYJKz}Ѵ. m3o/:T&4ԛji3qa/u;~hnCӯpp`* 6mػi о{frTfܒB^=:88 E DF f~^/(qlw3OfW=|~-&=Uj7hM?8ݹbn)'6^P|+I||Lw'ۮl?6FחTlMR-o_^{RL'?e?^`{18vԱ;pb?eYzp'xMGኍ;"yeٻnn%6>o݇X7Gas³r]/gA/ذkw*gOӂI(uCsYoy ww,Ps,ZO\6a=Y}{藉)Q{˪[ I>uT}XeH^/b0B>+3/mE%@uٓ_Ƭޖm7&hk=I* 7JңAϚ+;c(A 󾡓-#23 ~\>a0 jW. |^U& Bq }?MڠM+}.]|a\5˹pS_v2/Ο7K?@41o~.>ۓDPQG~z){02K5Va/4z-dlIVTR9T+t3g& wovs{cof1t7=P,t踃k&ZԪu鸓W0yOlE\`#htw1z]z]Ѕqϝ("![}2e|@[~b׾ )E_ϑ#tQMes^M]Z~Ί .Ase,|~8JuEV3ȈI =}˿ynLk#ɧ֮>-o8uAڕ+7 bץ,ϯ]q,׹S["#۾ߎocq$v~ʣ_gMGޱof Qʲr1)(.?[ b? `op$n5n:|dޏ7=/ t {:89#O=9඘iFfCL{]zTlĠE*'$mѨj-RE]</6olw :kK53kAyU:OA?Ua* ʊeNPik1v:slv}j- HQewav$(V1^&ё#VC~ |̇[Y`3lx;Jwa s^A7u^F("-_s賠})>;c}&yiZ2w:5oL@egƤQR/[q69 RB\B`.g{xK)ȼc+\>s<|J/83x^_zrG `bR9.(*MӚ01:."ݚ:bb ht֘˫VE^cƾ|F+ pDOJ $ϕRܲY#XPXx6vf죤Tk/[UBF?(dn:a$~ |̇ ⛹4uw 0^IK.('*2*q@/y?}d;5Ֆ%2*[CVp̬M5.T>?vIBAɵ1f@KTתάWnA\dfK;aOmڰʳ&FLYVVkzݐ QW &e/ܕvԢL>uyR>#jyדzmQ>uљ [ϧL^iJ5 @g\^͢ =>s*vm9 .00G"%@K!LzbBeenV#nNFkNiJI MyNIOzIK 5vUNދNWp9M8Z{>-^ hځ}|a۹;l z1:UثWhYFv[6Bo{qWW3"WUsY@|?NxxȖ_PL' +gGedt2Ʌ#Y{_QtrtRZQ_Ӥ%s ^\ݪSn ٶrh:%aQ{жmn&+I9=eLYL=+-ܪD\iw?_{[u߭y$&+I 0BkGϧwQT]?wfv7fwNzR BGTzذt >4A}i"""HQz N)dwgdžn rgݳgf{ @,GRf1VS?ѡI$VĔ?YmlчIB_+Vb?? ux&u.{xDt%\!3Q4–8r bJJPiyX NHanΌ2t҂cK "˪SKq3b=` Br5{QV5SE^ح2 | YnM`hyRbn^KIy_Io=_J@~^HťTt7s=rsəJ0ֻc,־n9S)r9O90B 笿r aJw[qK Lyٶ!ޕ`3rŬ1Eũ'a4[QJ'MȀǴӎ]O;^ڒNW &7!kl|~KUTgd^OA7P{ˮj8)Է)#5w6lD@P晏cnd^qxb%Cgdzޕ{㑥e`GmK:iقS 3n#O6X X„EN\BÁ5*;)wѽ:zzx:˃ehҸc/]tڥ&OM! C<=ĸ$=|۠p7 o.~r~p_EiW}7w,zUQY-₯\eҔW:}7k֮X89ikNQt^Z RiN~b׺%r'_sdX*_;Ild?UΑg 1^^*}{ܱ}?C1v#Bi[!G;KRtc80T'?:`B}_6ȞDҌe31!f9 l!̕f PROD|eG^ v-;sx3JR-MڋbR} $*9Qo{3]gu.ьta{a}:0uPzT{o(9SY;4wNUPiмyO:0q,S 3=Хw٦~/W<ίÄoڧie̚W.dzz}Kpd$U`4q{_?]`txk/Ħ稧.?hX> |2]4on<ֳ{9=v_Ye)BF|0i![y#rT:;}6AI^v50>`HЁb Tc9gޞYqo+NVICF;b֩ʔ-4|a)cc--e+T\9x`wnB&7؅}oYyYbp$uǕS+x=>D|ݡHfOOLZ2%w1=ӓRv;7Hj*v]N~GNJ_yj_HϯEbc@dTOɒ\QLu i9瀡'T&=lclM?|}A{\#unܱ~[KuspFw~P_t~uW޻h O5_˞b^Y[zտ7._`x{7C +b .k+o7i5]G/^?qci#?_?^5o49 Y+C R5_6gKi}z0NA֚n*ENCU$79Lfepܧt{FVȘL?RgYiLCO!M:ܽS4W2ۂM{ mtq!!eǜEq}|<}n ǣ: m>OHlL{gު(gw]e;]YC0R=n~3;ً+sSJQ*5i;[/U\OoNSUgeoϹ| 9t"wO}Ϧ6OxZyYW{ i/3K?qbK'Yn-Ic'j%Եkc|Ceg!ExfD:2tF9ί>e_tDJb*έfA>_Ɯ9Z,g/t^.7A%i9E?8$N+8 H:g;˷5X X,M$H$կV6 bKHwzG_W%*J:5%ZN,4~Y9{g 2+j2}k-0qs*}RȗH_[2Yy͇;ubGOzއu%#mM?T#zG\wAc3TS{[&):zWG6>9fUi7Vz~Ʃ t#*n۹ssZ/V8qp"yC>Pe<ԛwiD9XX]{}Ks^v?ρ}X\)"{OSmpg=AW̾Rqw@:fY%@AG>ҙ9ǐgf/zWA|A%ϋ?| >" c"A1q{AiO0GIձ=~ȿN$]ìo;L @ҏ=xGN:Vgx=y<.?Ns\>6-kڒmx?mܶMu#8eo /O`WA6>G5w;|>6% $V"bӬieo(txOj n^]R^K|ղ̝aoq;=TaI5"̲iPvnu*.Bb9>{]!.skИS IDAT&o_Ǣ 4`r 1qDZ?.}ΉU!qjooڶ*+? [Nmp4 J>-aڻ1gC[#+qwkctVrBdo.}%e'O5Y_9dzsVy_K3eriVF5 DSވƩu?4IM eyqnby|:ܙe jXۖ|w%+͊;(4W?ɧ%Q[pݟܐ`W+2?-> o(v_N*ԙD ;~%aѤuFK,lŸ4yM O6m\ VuߩJ;19,S7]~p'!v{YjJgδ3ZR^"S9GL~0:Q;eX١K߮ViN_O/S_X]_|m;_][F lo7%ɔՔi(3+`T.x'w~P𙳆yMiީ'y9LH{#C/+yrݪ<ۆ>Ҕk(p?_Mj~wv(%j.}ӥy983 2DTUݵٰmCIagH%sƕǤ-kzjZqOȿkW ݕ8 ݯGXBW8+-rtT[|ɸJ""l=:o^M. P{x_cjDr[GGGGmjڙzN_gtZ)rvVqez1ۄlr'wn{!0UE[)TmbSԬBiQu_p!+YB ꊂ1-)z8tcN̼رOMY`<^U [K)m~b\rVI}nprkٵ-kΔMx |6G[u}a|IlUĄ8ZZK .u>+dޱhR/e|vF)HE݇3uD9=dyI<n/*>Gb /]Hzc`rָxt&('WG8p*YS1~d+k>t+??լKcӻԋ|&,3܅+8͇w L'Uy|9e'tUĄ' v`)*(Bc&%e/W[MD-JyJq|FNz~-LONJa*{lWz?|7􍲽7psu~͕|!g@wQo3lz<6,['N#r3'[v֣׳+Mz>R8[|jZRcuȃ8Ǟ=^II#k륵,SM[hz w0]Kp̌TD!CwsmU&RO'Zcݡ s=L:JmfԨ cvF _T9s*!B,_ZQZ^wf#NmXcu`\G/0JyiתuGڸ/|T(z61DF. FlPtuS*A{L}YU&ɻ:sP7^l>ׅ iM 8gp$%pyLȌkB,sO_#zHa˘*h#(kgoǐ|>36p 1!h8p" Ԡ 4[:BJ7q<8~֩o]1OQk,*<p"R @*[532_U=z !KPaRPr"xY@@^OlKʊ/eNb{OL-HStRJ劣{Jsg[|Wzˠ҆ūd W>z߃O4O-=%&)~!+%$COޛ[|"ǿ K'Yg@sۼn/܆eHTkŪ3~<"io˩YЦqņW24@oq){ .BZ)†+mʳKO/y2 $o2e_efVJwm+f((N<= CyߊP?iG<%vz:זwZ5Q]XXlBIrbsZz=NQbT,9|Azfz}Er!Vϭi+З0}ŷxs*\힋+KDk}ظqǏ5WBBXV[vϿs(ob!;tR%JGi[\PS)[os}QN~om"cf.-JI+P<skkF b+GgZkҖ“~87R̽+|[ Vsnq3cf QBʎ/ǵyIY-₯\eսY4|o֬]psל, ,N|հD^Ot k{Y[dѩcѹk[ Ύs:brA,y)[:QN0.zҤC>;TSlGqjueY ^SǓτYԳjNՒsލWz^<ѻW'<fB( Õ*;>ήxx['y7Ν]fN*5^VL rف#QkZHN iIW3d&;;8w3GYJ`=dFm/W [!ŋ2P.⁵Dy_5nՆXba%kK5Z bdk}{F[6![1?j*iϗI{M7ڻ~D,@*#j7݂;ҳk Td]CÂ|| gВLY6kĿ^k. #II 斝9_<%@w2k{MPTP V*De#Ԃ"|oչ^{lN¥3џ.[4a˛Pbf-``K1pbտ[O+8yάq=Ub7;y1ↆz`g-)ZHź&t̓'|jKG`V`$eNϧJ~ud"& p1ڲrF{A^ʘ\cL8tAnfbt)?BR ONrbS [dDVk1׸&c=B|,iyqv4๏f6y0Ej򚢜Z}Ł%M:ܥl/喣 #"|zR.=u~ZsyḟyV Īǀ0ɨb ++"lP{$Le9|#mM#HK޸>Wr̨Ak6M8嵿l7.?4gW?y ǎڰ9suίnJ*DcJ}|y6fo9f^ad7Hy_LgM,d7gr@K|2if/M{d[{Jԟ{4Om/t%Cmu3,]tcߎ/~Ҏ_9#"b,߷RZAvZFo@]Go[ n~^✋F&' G2˽A("_veKgΦy&G!@kK7 _Zt ")e2W}:JsJFr&q>Ҳp`&AgwKuelj!̟O/{3}ۥ W ^xe'`{Qj{ gA'<ؼZ i/3A6@er1#H Cϗ".1s yf}EiyPi>/pE&>AA d XH> 푪c@={0H"H!aw=xG]'GoYB0GA|Ay\$7BAa+Kr%C;U%0G{  5Tc  Z[Aiߪ߀s"NH! HG׉D-W(22PA}VFB4q@/ϵIMNPAiDBamcgg0 ';;`4AA%AAPAAGAC oA)?`:)(  !ʛM>J> HKKJKK+@Bv .9a ! 0 CTTV Dԛ% HVXJ2̌!ǘJ aQj~C7Q'd2/M8w MEQQqQ& 8_!DP( 77cǎڨryU1>> HkgjZ.#-uG875Y>P HB:BhaGTfddp#~7alAZRA[ -0zm5!b*˲fcP?,&ѣ#"%!~`@[]ޯ-+Nr(Nr>)NO̸x"Hldo'_pбXˀp; _^* ) ~%`8SڬO'K|E*MVܕ|\ H2=>xuW*%^WŧTkKr5}{ڲ|iVl d=tO\ٹTaAլCG9+5eH::Y_gzO~yWH;%K>Y4K,w, S EPglGTUܸt7C-ZC(X-VPmjl:lPd_AEjWٯkd23@0Y^u;>9`WKPPqEVa{;wۅeͤRKK &+5]psic[w̽l:{Is>MwA;CedUҴbhh׺w2*7/79j| T(`ǘӆ=5QwX/-)R@/77*]{(xczx:үm_{ _ۘ7̛;" xK7; o%s J*R}ߔl.AfBIQ^Wvb'xVuA!ofgQ}uњ44/-R 6jC!'({*(u\BbAPĽ }*LN72 Kw%1}vK)vqw$gTzyrGۡZ9 FJ(J*Ux `q)9KwNQ}Ġ#<,y;RfD\T*YcMk ֒|b!hNAY^jra7(֔bwX'$fPxG E]|0 m 9H_i)a6@ P&Q{"%SYa+~+J>v)i~Abl)@Ws?ReȜa7߻9{=oC3="QH[)~kg+uDQت9%TeE@Pd 9 Zo:sw%SU썜AeupZFM+lU썬`%N#g߾ nQE%8wx@J4R)3:TgTrf2GZ 9QǞ;QPR @|L_(q9A/tc˜Ox+͕;StjIJk}ZNW.' @>K- #.Mp\ B˺rPiڍk)ebHθvJEf2fBтPz#vST/WY[jSbcAQmYQ\Bir .ƍ5 *]Nܭr^_eiP7g2sVA[^sv> ~A*f_wےBgT˽=ĸb-pWgވ%ɂsHPƦv2 )Sd>lĭ|[[:x>PM8Gs5'BEi~V8ur7K?sBG{̭-2/X3S'ufDgT%)ףbZ[4j!_YW!aSRR\\Fk \>5s=rK n(#w )0go=RfJ!=Is&)c>lK N\сHj! Du6PrRcybfbmS9NbܜescZ%0]!FGmPq;pk\;DOI+°U7NǔbsDM"c.':1rN7gچxX E}3E+Uxءa&x=[=({ب^ցiQ{o-ձR;Ϯ/>ԍ&Pes{]{yb5YWR2BOaYavA z=Oە!vIDATr,@^ZŠŬ 7&+pTWLCݪ z-^(8Tuxb^e|4n%&z{ytJXD*M^UZ]q?S\wP*z]uF&F$DVwuezZȯa U-x^˂PeY9Ty^0H,a91}u>jBXtnpuPU|Rz7~@gUy]LWru|#=1Q CymvKmP+*0v :m@_^X]~DQAG*[(x=G`,:޸Fo}hpA_DPDQX: = xmjPAZ=a%ĺ󨩡5 Hk0 f巠ޓy=q4aΈ63 -\R\X4Q0FT>BbaH B[+)*1 BNT=aCCB> AZN$QK-,$ !aR ҃X(P@yRZT\TZ7@Ci%lT*B_.)y^nL[`T y=0>a{+++''^=#Ri#f`AiŜ1 1F{P>iff>> ҆:I"oѾpAAڹ`?  Xa4A"f԰|T}AiI>!,0z`A}! j= oAAڭ0۲H(* @@)}On} @k4~h1j}eBi_ E/i~_ҘO!-Ofƪn!-} 6-)i`Q [{@y?D"bY!/yؓiiG}#jO~ e:m.!ۤmT{5O1TBC#0@Pw!@ oCFi6&CIMͼrAãFH!0)-+-Xt4-iwK'k_yF]є\3,2.d969CF%҇jReYb2p<[bidp1-52o7}hըA }i @){~u)m#Lg%h~M /$jzI~ U}N7>-'ݝ6i4dMI3Ok^C]͸I+ !lT_İʒDçmB% k"bۢ ?/Fj =OPC͔ͮIENDB`timekpr-next/resource/appstream/000775 001750 001750 00000000000 13745331025 021023 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/appstream/org.timekpr.timekpr-next.metainfo.xml000664 001750 001750 00000003523 13745331025 030240 0ustar00bezvfedubezvfedu000000 000000 org.timekpr.timekpr_next Timekpr-nExT Control Panel Track and control computer usage of user accounts CC-BY-SA-4.0 GPL-3.0-or-later timekpr-next

Timekpr-nExT is a program that tracks and controls the computer usage of your user accounts. You can limit their daily usage based on a timed access duration and configure periods of day when they can or cannot log in.

This may be used for parental control to limit the amount of screen time a child spends in front of the computer.

Please report any bugs to Timekpr-nExT’s bug tracker on Launchpad at: https://bugs.launchpad.net/timekpr-next

https://git.launchpad.net/timekpr-next/plain/resource/screenshots/timekpr-next-screenshot-admin.png https://git.launchpad.net/timekpr-next/plain/resource/screenshots/timekpr-next-screenshot-client.png https://launchpad.net/timekpr-next https://bugs.launchpad.net/timekpr-next https://translations.launchpad.net/timekpr-next https://tinyurl.com/yc9x85v2 timekpr-admin-su.desktop edzis@inbox.lv
timekpr-next/resource/icons/000775 001750 001750 00000000000 14017261747 020150 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/icons/timekpr-logo.svg000664 001750 001750 00000147572 13573525204 023317 0ustar00bezvfedubezvfedu000000 000000 padlock-clock icon lock security secure padlock signs_and_symbols Savvas Radevic image/svg+xml en timekpr-next/resource/icons/timekpr-client-logo.svg000664 001750 001750 00000033742 13573525204 024564 0ustar00bezvfedubezvfedu000000 000000 image/svg+xml timekpr-next/resource/icons/timekpr.svg000664 001750 001750 00000150265 13476006650 022353 0ustar00bezvfedubezvfedu000000 000000 padlock-clock icon lock security secure padlock signs_and_symbols Savvas Radevic image/svg+xml en timekpr-next/resource/icons/timekpr-client-128.png000664 001750 001750 00000030723 13716566163 024127 0ustar00bezvfedubezvfedu000000 000000 PNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<XtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/ IDATxy|ՕVuk,ɛdy 66 aI$$,o/}&2C>$›1cdayȒZղZ Ͽϧ>jUߺUw=sϠ@\,`1jJ9rg!q 49iG(}#c Ĺ@_0+J`"D3JW)m; 6KxxF8ڟ{r0߂ HxvHh!C:J0f,F3D54kjB&#H{V+wؖ= V ^Q4nE'R8z455~e#|t8e)P <-7 ac|q^`TK() «pAM C.)"d08u 8S[˙8r%kO%P+XE vEgܹ r++-$0iYJMB)eY&2L'`%-{iXSN eP ^{ Wxnq]ϧ:w.SdtL'#!쟸gErNJڬ4#ģBBsiذSFͳ vۛ?X7*xPV~RSr G[Ζ )jk"?ڞJq# #G\"t(f9h&$䅟N0_Sh99Tt#nGr i"RRԤ}H}NjDh? Hyw_u\wW0x‡4[BYL%wv>J)hBRM8vSnWOHuz)!Ӧ1)+K6TXF˰%h~: tH@4? ]C)E^i>_0܀; L~+,roi28%gN"|̓sԆ =×HI7xj9BreSC0  ܏B YaW_ `R!hedNiZ 44=i:7}#A&O,BA3-LSbiҴaify%'?q!#-!%5Gs`rh\**FR`0 x%B*+я?|gcy4]4]?<_MZjOi&~Ӵ [ai&ҰL&15Id8ˇRQܶfʦNea='T+s`:{_XqxVq.w@3UL t4߱ Rp.BjLL2%Ҵf ,YGّ XYS͵Wj %t_  !11݆e(MiDGF5z \nJ{ WJW^3 uА@C&RJL*|WxDETي"d>D׃ 4^^ KACսƘ"jޞ3ME4MU\J ';52o']u05]C3%Қ0_>29Yp-l"Q_O#W\Zn G+R*W.d([%4͘#;,w q`!4 Ou5E!3df O`Wp,kT꥗` p3V@f ~ 6s#h1-7-`}O dj It lKbw: ]m*L=H :)%{ ƛJ'XpwSOowQ 0wCeszP|Os: tm@;0F* fh.-0 3ab&fpfH {ۿ=ۼ9z;X΄@uҺ$3GqϞٳqOi3Kg  8g9@}il۶!BpCؽ4-eb|G ,a@ѣ X _h^_{>#`Ȕ)T/X ?T=s]Ẃ$pI4:78z( p8Lqq1yyy^w?:Y)DR'T=(Eau5V,F ɹx7u[_)c2fb-Qjگ~@O##N źS^^>(uGHt3uK+ %t hS3g} 6=~aBqz4Urf-hW]``M~:Ou³~ki7g:.Ez`[5_OnY 0uٽ"D7܀% KhzznO!  D{J~q5D+Fi*YL߂@ݓ?pٳ);~M̂[%%>&|?|ASS---aRP__atYPP@e]!n:VXk)((`Ȑ!VXytiR At(rCĢ蹹 GT!db &J/BQTS9s];ph{-: _w͝BB32Ȁvw`5,4`a!ʲ0 ]yoJ7f z:^XXo{T@ HK2q^/|ۿͣ8s',TN6VY A Kĉ:YKOu{]4Yo_>+GRu;m:d7CIń ݡV~ZJZ#@&ј$6:U5O/)t3gtx7nԨQL:O4cհD^M×ZkW5]?+B؎iSZN~JIIiiiqκWBx~f*f8S{h55蹹܌X W gȘ1),'nx¬Bwh0qQvu3f`ȑv߳*! M, WvXff*3#R)5~k*Bn` 뽥&S޷vKbkFB ATVVinQl7Mc&G6ɛ{{~;:::۟غu+ǏwkbqYMs YXD"`Hukf%I/|ܵBe]f{؍oeդXW^yʘ5kրAHoi ot%9QN{ȑnp- >_ZGêƌG$H}`:4MbPh@W_rŋ5C: f& M2iqa2*m)Ej+aI("qUi˴7^@$~@v ٴiS׍;׃>-&I̸ʓ_G(`_Lc8 lO:!%Ȫ[h&RUVuېRx>0 vɮ]޲ K椆5~VA4+.F .])V@vF vW& S(e1TgpEAAAV!mmmg 8}݇]y},N$?K.SRSSO`!EeeްqNko;Ή܅΂SAsGHs_&E|YY}i8lYuΆ_~H$u-]/~ &N5drBHMep'7p:($NcǽaoyGYhs{(**">/cOf֭^7ydƏU*3gΪY񣤤K.n|@VH$6lؐU.\q`j̛7ӧ/2vnwKxJU^Fp()a[ihY1/((h˹y:Mg0w{݈#>}zw'N={vVbPQQc=֭[{K2}T:Lƹˑu!lUP9fJӟtDɓyꩧIlDN]mmmVq0X,#<¤IXlYz@{ww}{W3dQiX ʲ*դL hѢ^رcu]̛7͛7w &L:ONMM 2e _{h"~m~Q4'?([*-;)#\s"ibW $Pb {^'dx7={6'9qDV]A)E]]]:v 7?z 0qDyVZ_ܫ2Hj|:쿭l2H@:ӄ2o }{:կf˲̈́ xGzАO>|/:ȄT9) <4 8#B(*)g'N/ /"SLUG0{7G!:W{<|⪫_'`ذa*#;8rr-oҤP xi`yy).ROψn۷(ILx7Xd ?MMM]^F9v,~M,_'x"e~'bٲelܸٳgd;{d'D.H Mw^!vj_݇ gCNaoA {v.oӟNj?,k׮峟,g:]N=x<Ά X~}#?7^[Ŏq= fxdOy@RNZ@XB+"aO07H 7&%-Zn}©|n{[m۶q}e57ƍ=̙J)jkky4|-1cg-狽mNA_XUG$q8CNjW{'( kطsg̘ʟ笆F3|_K_N?¿yx$|C}x_POt^tIFN+ݹ쟦A+.3.-Ry>Ν;Yt)*c˖-|3瞣Çg\sMp{뾸`~63{<㮾+"/|N|L3R))qփ%p1 ))!}yw}}=_y'@ =÷f r70st8Xx>ݻNZ-ib)uF@%)`~!n՞ UUU<}{lٲe}m.{ -YRD,A"[*F=z! 4+-\!ے(%¹Jʐ e>|kҤI Gm{~`0ȃ>;>ȵ;2s}p4͖1A)vdm@=ܩ0˷{ eeeg?cڵL6͛u {n~~w  ; FiDh ph (NN!Ԥ s󩭭#G0eʔ^:Opw5W>+M=Eq'тeIDAT~-71)&a)2E*̙r3ŖzrC8sn,owrl0p= _ᗓg |m' uc8BКP NoM]204B+\譆D"vO@ݍe:X[LLˑ@܏HA7q{jo -[oxiL;=yݩ7AR0@,1gNep*SJ˧=M0 UO/)bV~@G=qu!K-8f9r3O9Mj9~~7O-hW,hhkjFpƤ 8wˠrZt1mΊg[ xFhX$4rvnCb73M,t>_({QKg$ݾiģQL2fg 5CHunf$`뿀t>ı#荧FRX𤿜, *儉弽+` ,:杻oHQTyoMCII8Q_ Ȕ-)3 b簾absq;e`s8kBb8޿NF; a7֥0eqaxxPH{fu6M h(Bhrs(e%nC PK aKmԙO+0߳d߲iDhnvnN02FG ޿߶@z)pxe4L97GM~goH-k~4 ܊jmI`o*nP {⧣Sܡ ‰@þ}i _;W$Ho poxJf7i4C{߻*K,U'NnnFh= BSПpMpHfqMDQuoiqW-tf2 8^[ nYֻtT0a\ך$01J7EHsIz!jס۬` J$-{4(]#~/|33XS"3$$L l aҎm݊sXm2> jt gM#1wmw*YS Na,yoI{MIOɻiTWwl! WwW9ceo7R*n`/ XOF $pM%ِuByX*.)%iu/=)^R7`7x?#E NJe *^[I0@ʕDZZ\޳GU? p=B$B!,àtX4@ok!T5Ee}o ˴Z߉M@?oAӾ}k|rY'): vd$LxXu2e)t>R${sC˴XOO??cfg@֧ A] 6BJZкunf sqv姠.-Br 55䔔fo)wҡv!|?sI{{_5^g+q_;cM)45ܴojl_{J)D==G4;)ط+$xD<7HGjJLHKxP^D>{.0g;Acbnb'-Q@"a3FE]-e~|}`VOF)س|9P Fxu5!iK wÌǑR2|f4,O~?0& L|'O`h(L`Ov` iZڏ/"MM7a^ޢ_;ዠV)կhغՎ#H-&R C| 6QʎIvb`/lj`̮7) Mߦ xJM~سгlY`JZi%h9p ZNÏ'7Ωѓrnn!ݵ4Lai&R!pOʴX]c9![ T4l r8L(;Y>W/`/4]  R_Aqrff'?IAUeMLW O%4#c3)3Pq}CMƍuQ7X +JF0p^Z WoyV"ԦMLN (h e#i tD̀ X{{n})"{/>IY7DLsuWAi)5C $}ivJÇ+:o!Ǧ|Q]Ǹ[oEcDI*;i,y0/%R]"nykp7vs`Z&ho/[R}73k l+àag$4M^+ 3 ~R_6ȌUp\ӹeeLN]q8b Isa9#9} RinӷO C)$Y֩iV pR Su:VU)mo 2M;vp¿n58Y+Zݿ+i~e%.kzr8SPFKq9F0/ȴ?Es 32d%7SLa,R-[8stsshypy区ϙC AGNyE 1L}r|LM-tXpEv_"ʩ7/vVɛb- p)I]3>gCNM `79t+"rTSS|P ,XHhvt+uҌ9m'7li./O_\Kvq^_l<*g̠K2e zH @.q=H\ZSjY4Ќe'8D#NKpF$B4nF֭( }SR'; hpuO 4}r!%S:i%]DqZ'#:Ze>m _mo~b*5_<{{{p}z ?p?{@? :}[}[-/uw,YVXJ(x wۅxB{썟`]@3ϣ{=ÖK6_+Er~|V=g߫1cELk~?g<^9nw߾都VCO/xl/Z6;t3/G`۟??yΙ2{/[.f~)d? dwC`~|.{8wb1.7\vo8+ܓb>S|:7)>^/M8"LnUΊ1?%VbbJ)Z9Sιd\/ĒJ.Jƚjjo00J9QXw^~GyQG}>34,6+,`bUV]m RλX;ēN>Nϫ?S\5^}J9$ xh/9mHE&YNÅq;廿<ۓo#܃oR汛>ߵ?vyp΁=+iYx8#m<ר{hTԒړ:KۧruBkgKxr|/pXb@EάK;ť1^s!s7Ijn[xlk yHi1NC?yITCˋ {ݫ}}s%pv3\uҞ|uxC#Fh#^^w;+\u&ti5f{AOC`Kb=Lg0f++<0⬳ $n_C׬ upiz\OaX ߽\{nx\5YpQl6m{&0ye:GOܠǞ̄}'P)pUV:i#2` Zj$_X')cczn,,,dZ){܋*/L\Q)M/(Lq2nc:PLSl~׳"ZY-O({ϓip<  q@`KIĔeLS$ߪG/(C9zsOϐ>gE%QZ?KVL99VR̒vmz-|HXs̰Ts/ϹM[ʹ\$B<$>l|{"32d)ZAIkIX@\ulHypu+jt9(6'!;'&AoOē*хv88 Ӆ`X!zV$0uOB.a>s_0^&$j VVA9AnNF,LrA` +Zʺ*@q; ެcZJu_~ c8.'S9*P*g/c=Xa1)4!edALɔ\l?nJh OE^MNAJЋKfCZc}ddn߿]gtYNUX̑c쐥LPMWS/e( ~pg8_RH)AWo'tXgث,83AZv/z kbCj4ĤHqI9pDPؠ1EXA|/ZA&8"QMx<_8-c|{^]vi087>8%ge^VT).B"bK(l<2 C8 e5%!I-h΀CrޏN$%4P,=>khLem%qX-  JrPolj~0}r?|_|C@Xũ6z/O5 Y ׸x4;UabNVъ XkxouhLۗQ"%tx(Sկ 棘uX 8^zbrՌ~KSRs*DIZ~C@F8-9tΒ]SD$^C]tJHtTiˤBR!6Se\K*ZC]5wB)`ԊfL./ZPbgHrXLs95Ԇ:,S™,%Ex81;s @^(&3ld> "E_ REra}#vW琌'tƣd1dѩs%Ym C!N_6eZ6@pal@2zEX&^D֠:J8E<,h75J7yG Q}C넽HET泏}f͹$0}੩ß"DLv߆ԧ 9W;G%lgƉ r@`Rk1+(&L{7t@R!3GCqu]g6]JuLHㆦ$qRCIFب0\y{jz%Idw Ta|HT7<5oq>Լ&t#'ƽʇёR/7'5 S=pOM #GwQ- '$2TYYƩ#|~fx1 ~sS9 (G"ǯr`Y]joNxmV^Na2'8>T̨ܭV2nSVdkfz [D})mU$ͩYV#  \ӘK%pn]jB@*pLi+X&*sWZ0c\NE8ߡh*[hsmqC4u"mː @Lum"Uvf%2E^|2 P%9~NUӫ|m. Z2ό; b߫UB@oH)@NI݄:9uR#p6ڑdU5,Fm(B?JnnB}XxB (=QBmMf[RSۧ8 QulG-nEq,4{FH}bT5#)$8oHH " _ /ŬRNTxԋ:YmvEIPs3ڱ\WTt?umZZjٌ*k1zj;,2(lQn⃘/ƴ aߌ,*f5eqBjcW~r~_~2$e;HqZ$ t q0w]-Qڞ %6{(})7Jzfn+fMލc$qH!D }<H RvEYʴ.]P(|YhTY57~h1,zJN>B~RQ,o8zZ%ԛD&Juѱ8f(H003WN=v%}\0(`s; k?- I2@Ae/~FJiq›JX6GR3⽵κtQ2^%}C}N--v{VsomScZ|Yum-! cUy5i NtMbnn6.mLK~)߮y[B lYmÕ HT$fl[RM?R,z'ZgVpW"@Em'JynGרm bT#@5-?_:zET#iNX65ަWЋK˗lm8}~E9ڲ GDW_Y5j#t4Jlw$ Օΰtx7~@_5ʁo Do44 j(Hu1o]Q<zw WkD+ ϣe3v9zz#_a9=(HBsmgFSˮDc%@3m QF5݅ևJ5@2 . ABF5BU~fڄ!<N6P[;.@ ;;^feL|!hB0 8 CI#yQ3Z *Ur5W-r}DEuʟAPuRӆnx'A#W7v?  mSɈGj/Eش2ФE׾b@r}oKՠXkZz⿍BI6t>i˦xiwʑMx( 4ն '0 10BU)V+YV1=TI\ ͤ!0CWɝKN [KkCBxZp}ىdX2{ hJ!`vtD9jSq$r x Qa8vjmX J Cʏb+Ǝgj5_|f-]0,Cys.9fo}yj*ˣKҝ/80MmWZCS-bv=y"΂!pZ[>LwR$$?w j0f !})YgA\ R|/Z rU ӈ >}NE6RGW+`۶n@#4:ZK]7R$@(,6xwGwgZZ $o[v^\`˥k:?s4ڦ*mc7޳sAK-Qظ'oCKjS9TTBl{L JH/6䎆 X Gޙ6-/C^"2C+"ӆ֩#ylTAp#@ڪY TH17SR 嬡?XoHPjS`^U)ԠU`=]XWuI>>5?l'vR!=/MPC@ .xMK-1v9Pݜz~ m+,v1R${ צ/8Zԡrs@j/ @e3\,Ƹ:bDCڡ?TZ/Y7ym{}h})m%3Ǡ*聦EMw2rmrP`;4-H5LdG! oԽ_!$ם ]׶ƕdqHUߵ4R`DZ7̄@7`u5v >5cdEȼQ݂u5{轖R߶Qފ*kpiY@7-k%7j0;¼(j6M}mHʔi~LصȱE-޺̊lli`v}Ծxz\:lw nE?]qؤNWxBr9hV ĭa":jN :5g7?Q ^\5ұII, ^q5{DN!Wu]44m"Š n6:X"PQEQ̪k8̅ ﵖqݞ/{wnK˭YSLj PF{CH m:x_Kap56tXwWk[.Y@N{Ud\cA: { ڭ' ^#5ِA"mHÌ{c|vqߴ&扉NC*eF"^9D: oN×ݴ=ۍڮ}AqLk>!'H]fB*RB`>bj&Q'G(Q8'9eKɅWN&2KJJ_`A '@n5O R=CzQSj欕a5س?!I "wBG_xߦCm>hc(EkH=w]-Oy LFnEC9ѮFdI|m>!FM+r>9ޱC4ySj+K]e c=F)iƎJmӳ(&oSX}ЫIAj:0hw0oO\GFE`*R($깨)pq[ZnlqMsr%Z~%"nY+ вpD$3E!ıKR,9H$%b6n2Iρ:;OBnMpE? `n1y%$s PtUSQUEUxAJ'<븸>#Q%zxmۺS|)l KJ.pMLDKF3PRjZ(i@Ͳ96)Az'}7ű5d=B~W+mիIܾN D~b}WWO+Ko▔"&&& Z$ =eBќ3\2nhhjhhi(Ga9T(P%;t2h34?کp5( 3~2JL!_Li|af*( B9&pZT!UHIK-1Óh/.@/܊;èQNO3ݫ@Pud"}jy^㳰oqI Φ(e¾gGdxJ$b1\qRKl=ϣ{bfӵԢi%YD(; +daS3gVU1p^ l߷¨zDQz{QF^ld7cY|yت #eQJIEQ4͚S_0cp_RY]Mry4ٙ RtttpȑL]  8SIb*Ѳ.!."]'~!2 # ds1/dti4]MEA("s^B< G QJK1"Fj0O8 chhh%/';H#] ETs%%%KKK5B]R]gf6uܴ>˲<#$6ly' N3m&Nn%&!r3PPnnann.%s1BAt6NgޓZhiv6CՆum筇 H+LcT g S(.oz{{ywƏϔ)SN=34Nɡ`XjxfeaϞdtq-@NNN*EQ91z뭴XB… GTA)%GMBAk.#7;!Ĺ ܜUT";U];m-**ʘܩÇgϞٳgSYYygYd p twwQK4]Ǚ2 !%YEEH)bqV~>^vhfhgمB K3"^{-ýΙ3g߷rꫯfxTΠUWp˫=F+PVU URm$wޡ9㻂 =޽;#ȹ+PUV1i$~_esϋVLEA(Ajꈫ_Nuu5=XZiZFgYXl86mJ+.. .Hc,+3կeiY='o8T!PTUHt TU _:ݻw}L65k֤"<4-]M}xZߢER۷oZ2~%%%^uQVV:EYUU ma `"`iHO"+PToȺ٠Kh"mۆ"-zٺukZ_uu5&Mȑ#?g æŏ< \L*(D+xٹ蚆)b*ny%@VZgo6555G?P(4bА'/c?HnV'"Rjo(W\YVq~EQinn7?8<'4ߙM7IJeˆ3f_gժUs9TA#( r4 P YX ԶթVyƌ/~ Yx'? /fӦMض& {n֭[/Kmۖ1V$O?/QoɢhB.شr=OÂP5c W޾(֬Y] 6bŊ,˗3g.*++ioo'HٵkuuuÊ:C=ĝwѣ~8Mr"p]5#KI\ˡDӅm0.Y9sr=dX͛7yfnF*++ikkW^Ctu3f}Gz{xWIueSҷ9:!wr&6+VF\O*577+V`ɓ8>'i;gs@_$!0d +5 דڢFh! =gI&NO<֭[7o)=:ؾ};W]uiUc9k!oDO7*:tAz}lQMM ׯ^䄿{ٿ?wu ^gZZ1O|:<َ:x1)]IpK?f`͛yG7ng<[J!O4ٶ"%ng^n8,0D,Z>*.a# .2CbnQW˶?qykOf̘qR~u]YI +aOkjDh|b[c͸̄|z"~K$6!|!m)3Rv< :•ab,^8|섷 f41I&nW7ﬧu.zvહg]볪(6c*"c%p)@U3>ȼ[S }o#ġ @[ja'H)ۺu PM(IbH3~lkCg<́栉Q]̖E<)[kNXEp}-T8=K$b 8f>Gkoe;xޅk<{`nO>W3uI898n9؆M nz*N鹞gCeZ [k?@-}:&['ֶW^yС\D?TbKpa"?kj ɀI JX8i7Fl+5A_HyG-HiZ/nÁݻ`ϞKIsRAwQ%RqWf[cJpmNjHE5Ӯ͹A3T 9=nG֭^-_{ ģZ$R:fR̜RTB_^ y88>J8bWT3y2Yc*)ASU@vovw?t&LGk2٤/i0W,SbasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitlepadlock-clock *tEXtAuthorSavvas RadevicC3ێXtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/ IDATxy_}{ԯ6T%Pi9 A,0&vvI2>IOv:L9ę8NL{=c'Ml Ih_V^--UBdCUΫ{{/C!޸ z 7n\z39 X望Bu`8 BZ?wމBÿ:ضm[5wwK)XbŕXk`vve?_*X~=Z(CCCcv1e1_ -[iP{{=7onڴk˗S*Zcg޽e2J)8j-܂k-f)9s ѣg^zGiӦZb˖-n&zzz@k)%Bc8}4CCC8B<k-9q4>}cǎ{n>|r^ nrS7|ݍR T"cH!=J}+UVRZ[|Nȑ#gs4.#x]!@Gt뭷Q,<1(erb6Ip΁s$`H%8 ŢK)Ρ@ ~SJIP.SbYo/jR#IZ駟_'OO@Z}|Y Ih48wsHub8qB,N) <kQp.Ek))5~PB(P^+ D)8>,Od~ۿ2.{ظq+W++wAZ-;c fgI,ԉf1:0ӚD*OJX!hCuJʀcf5(c{>^ $۴>|/$I8t׾ѣRe7ov_6m*p8^8rb0!i% 30Yo2<;ѩ)&1zkmln:k5:+U|!Q֢x6ܲeD 5\uݵtvv1az!o^xǏ?>3p"ƍo۱c}vW*z{9z 1>Ayp:&ggfޠn\ $BcA48PJUs+1=)[UqUԿZOw[;k5*e$f@G;.]U>y>?qÇ.^%o+OQMx4z`s2ۘe SfBб?=43 oڴiR鞫*_Zk~U"+ڣF\ 0J1zu!(]vgg{n 1g?(-ܲ;z{{[A?8ǎ>M{6h4N53LwOܿw;28xh||Bz 0::<98ӧ?{\)X,SJVt@LF!(˖Q*PJ{yٲe_l mVݸq㣿[j͚5xW,C l"a6NoLJO<g~58JXъ#42S%Y6 R,[ ޽{?c{5pY!5\{nݺ1q{ijMLZLXcO}nM#_Y5>>x ]VthUױBclf#33"mmmDQt 9Kn?[QJaehhcoף$33tE1㣣g?;50ַCC?k.76$|!j8˗/R\.熪wa%w3_u־-!8gϢÐs瘩9lLm5w~YppC};g aJf<@8xm^?<::w)Ǿ;?ܱcJ&''CFzѩ)Z3֝>d%G/~c[U9$Bv?338raƢ( ßx|߾ǖz3Ox%)m R]|gffg[-՘+e`o߶mMyyLOO>k9 ;s0dԘ_۽wr̯7O5";Fua룳7RwI9~;A1xkvdxq1Ð$gK9Kk(e߁4M3;;1 |td߿og__mmm' `ttza2 l R} ?Bk駟hqk+?K,Z,!>@Ec 3gx;p K5<7<###ųZ-$<kw.8 R6l(¹r,ٳ'cJ?Yqpι:t1l2==MEA@ww7]w]mݺ_1. XkZf ]]]". C9p& H<[2Kk l69vqN֮]KGG@-{pKXjEv$a'N?7r_tCZ0cĉZ-(Zyttt~z(X-:n ʌ#E{|5޽|^ B#yrBP.)J^ Pzq l-s@֚R;*9.?CH!}MS:b’Q!_%GxRr ?Rꍉ?".\&d1r`}K\?R"eC~K~77,\&a J2o4/v-&\6y9zxSFE,H泾74 XjTp?K@FEV/&, npjEG7wwY-@T1Qj$"kٴI_`Ypٿ!@Z&LQQeGdg DbZuD @( )&IHT[@b┒̟Fm)BprX]i|rQ*h5[q$" GO4]\p;RJo*+@8gŵ.y3e!3'WMB)Ǐ ;},%|z*!B H =Z̛%{^ۨ =Kt |Bς cJ`bƐ:M %ֆՐ*ZAVJe;<p=6vl1<Ʊ [ұjʷN].UR8kIfgIMZ4ϝ~ =LhPްS{6!A1ymL$f@Xedn`@\ )@J-[P]]8cI&1CC4#&&`GD,s'&xafyj_};vg*W\$B)P*"; *ka"KYO9&yb_#?Bm;qQ"\bQ C#l؄0V yxW/C'xKYZJ~sBk[R{] ka [lbM0 HΞ4`-fwa],2{loy Wuի1BR/(׈:2RpB2k,"lRԘ5ٳ~{UP[.HRAH)ҿUkmk_y%Y)#+h cN<4R8~~#}f)y3v^D?k2Y4YKsϝ52J~ F` Z]+PVH%J!e&90Az8R`:1LD(ma;o~~`2*/ҩR'j.5k]]X|W8m5ƍ##fgr{N-8!2[dRyDHj|91H)Rޙ̜8IkWhJfj݌vu}ўFyE?'>q Y; &1$ qĊLNM^>U±/ÇڰU DTFuvJAFqd>1!H VR [M$Ȭv2B*:BspJcBhQ fU*X ͑X}ݬ|ۈKέǮXW(>Ѿ2$ SR 1֠>V/,֤`20qB%qB%NFR>[~x˿йf kD" Jy)2e?JlH "Rtcaja#!pB D![k1֤;LcŚ';I13g@ںLa ^9T K^^)x3DBΓsؐ q1Q<"cұҶz5Ǿ0b٦M(U UIՓ/|&({R Ši ӥdlMysXgSaИbcp!6( E$QD1ϡzڼwj}!T)@gH}0kD^4k\Fl_?sϱ7cLrZ\N"pI{O8]'y)S:%B !9 T)i%BIDS yNT*lW05WRUGj{\+Tl@cʵ Zj#7݁[M J+Ɵ}a XH!Ps*"*2viR)>O<ӂ~;*ZYp$(3,3yA%mlbq&:H@f$??(e\,f!"8&2 .[)/aLFdl ':˺(ӣVRߟtqT% h)ڙvLw~'i0~ p18cɮ[qBĄQD+Z,E>(Q!p$fQ.dgo}'.Jlmvz#C^o>H)LZ&lgC.᪻fݴ0X LMegRW:Ĥ\< (ˊBNDP (qOMoɛ[S,~9;χ(C\fŊs8p'InV.˘.X71z*di$X˽ٗ 6A.]p $)s6ud$ 6Ipa{f©i@>=[0GW_CP)Ppl6yf&7k.fg/_]^ٺ5O~)@^MsÇ ȡ , Ijʨ^`w#Ik06 ͬdj+V[v2^/@h d8x ǎ;ڝw> CT7$X~c2$I(j ֩勬.so$ABuDB^/_R*yތa>ZK7pwnᒿ#G\/P}}7ѱr%S> [@MIR&:\K=dHZJxZsF[(U*(!L31:(reE$dkKčǎQ[ 4n#C]HyOWzwmݺu~`zz{w^z{{{{^]6oŖ*Ժyq("c(d$ I83i!aqf$#I0QI׍ Q*5[ЕJ{9 uSSSh%ַEεZ_`?l6qO}Y,5:6_G\q(63ɢMc".?pQAi|vvQo-.h;0lBy4)~ii|//hηwuu]rj>yn d]vqM7? wT*Q.F*d6~v|Eݩ;D yO;^+Xx-`^CB͏8&i7Mj ( ["x{)eǎ|#[nZk/s>ONjvmӧO|oݻ/i__拯Blg AP?r\v0' ~&, yYӤA.71& ''z>we7¸^ 8p<~8so{xT-|bjÇ9uyyfO~lڴ/| J)>яr~~{R\*lw@a S cy<=^ }Ok*Fd?`kSlEjU})k/*=p /"cccoOZvu{V^֭[җĦM'>qQUrΝ޽|3,_JaCIDATphgL-u)kdJ󳐰E왟Ӈsz%M@ʗev c gظq#yO:uhժUܹ韾2[~|;MozKQHTDv+P@82RyF!$',4,8G*!la$/ҖRc_aZ/~?y #Gs?svmjcǎO>Ƀ>x6G??bڵ܏"ƦjO\>hPBd& BhSpB{sE ?hXg!1f:.IpZ{C{_kyׄ|C{Sp#?=}/###?~%nlsM7y8)E9 HЖGivOB!D1fR#ajÝT;?_s5|_c{=E{|({[[t4#lai]Tv&c YnI9\ԾGyCg1J9 Zs<]L)dN}jy<ɟ>=?}ɋJK:DT%ΒDDviZ<8QhFYRq!a"lj"S\d$qW*jlXrӟ4> 7x#֭WW9x x;^gs"t{;IEEB$!1 0u.hdqoఙ Ri8 x ITČbj4x o'/.`,#1zr8Ia8+(%8I`I*HMU>Lb-jdoDaHʕh@HwO{xJ8=| C$!jZ-0~ŭVjU."cԑi=M{1qv qgTI338!h[ЄH .ICmn EX@J %.N)ϪqL]]:EQDaLFDh1 V:aFFؙ3Y aHc"G($I؅\pER~&M}~)$W13C}j"օ\#Zq?1ꓓtmTT 2^ Rm@ '%Ši*::ХRfuEdTT:tcq'OMh3Zpɫk Q3G38H >L+)wv=%h jiy_j1&l% q;σj5 ?׬>13?-FH !a#\:/a#$lFa۾{?SNјkT%47 I?c>&pὁQ+8cP&JRP*J]qCYtcfO?u|[@Q%JP^X`UojQ#D{ Cg?V#3 8.dDKQtsPYU0[\$W̪9YԊ /<Wwt0{HR/HS"l$CC(}f!`1Esc2Bi ..JL@sj_^*Neb,ngF']Voќmj"J:g;o|!&z:prgg8u;n"]?aR9eY҅IlRĤNl$ Yl3'/^yuz*T)>Ϡ:sgH٪7 ,{;#5ia I70IbM-iQ,Np!aQDiJËeicKw^a,5V*,/W {/q1&6ELbRzpN#?mӹf!y]` BZ J6,.,^w.¡RiЌē5aBtlۆ [}2ש[O 7 . EZ1DʹBZHX| l0Aު%zynbSl阙`x.lu^.~~ÈkHyb;2?~9th&8[d 7qMV#2kR58)d"k!"s,>|vKBL4#@8Mku3.'Yo-&V!VсN/ mZ!h֛I|C~9Po9|e# ?8|K8!nJ]]EK4 );W4IOV%u^*6Ibs)y7Auip1pɵ<[5rL#s=qvz~;3r_#]bÍ72YbَyB(@J%7/;Xk-Z u YĎ`]qFz'=wMoق )$`E{c59ГOrfvpUWrſymchF S # )@ t#pR 3m^QV`GT%IIysHrse E/T?sx,٭8ġ/}_"˯e]NJM(*+W"]Hw7ȓC\.r޲DYs\g'tvYnB:YdbP~)ې I_{g*EQdSd>mD֡t~8> ˮ9<6lhSJ9+Jvllj]GGݽ{% o.[rٲe$Id[[j*(EdyzYF"QZZIB=h18'4fCh"cCӤDy²dy(Fk]=z=t*POI|𕦤NeQPg`.Ke\$D yԩt-m"%I-Lb˨C !\&C8O|4$ H]947h0^ogܦJezy9yDG%Ҹ]$R 5Mj+W42~q(Ϊ8Zk(RJT*yI$I4(R<眴jkZkB(kv)̐HXkR !sNλSB]G1y>j0oĨ5pJ)]7e !Xk¾o!1$$I"Y\86B+9[ks.Ru։yIQATJͦ)˦݌ sxY$Tؾ}/ΗժXZkET$LD/8ZkN$gJJ0J)9IEJ)VBluPJk-sYCW "~1p.N!_zqN !L:G+4B-֚{ιZkZk$Is.6$Q8RxgN)e[+w)Μ9$9R$I"rdV#$JEc8A Z+s}aιZ~=f cK|QJ q'v 4I@$I2_&;=VJi(J)٢:R /̌Z[{.&o.SLIgYD "C j5'̿nS"_\J3z/~}1O濖2u۵Z-7RJWوy ߹B;SJjjܼE=}~i*tIENDB`timekpr-next/resource/icons/timekpr-client-48.png000664 001750 001750 00000036534 13716566163 024056 0ustar00bezvfedubezvfedu000000 000000 PNG  IHDR00W+zTXtRaw profile type exifxڭY$7eZa9Ez>W݃$^U41y;(?_ >riZ=G|a_/}׿}ȷҟl˟s~ߟ?Ls ~|?|RGou} }>k7rcNF)ƛBo }N6 ):4byV&$|:|ɏ9A(<6ſwDg\(s^dV[ٟ,/0BdU 90 >b76>Ƹc∛Ub'X:u,]Nй 4.~qmMQb\Qq0rW }׭.%~i;8\bgl%[ ?)\; 0Eܻ0X_C*bl!0< cNFb7ӂ6X 6%Ur+X r'fI%Rji2ʬZj fK-jkfO=ko#eFcFkM^?Ί+ʪƚy]w}=O<vg.Hq-vw>b_yxUmǪ]%hX+޴tԚrZ9(A;A+byᏵsusG9-s,V維' 5>}b"yϸs׷w~u\8ZHqӊ=FnoYZRke"riiCn}™DFoNro|nX$hs^\!bk\"<#ɸ s+Q6_K^1&@ t+įϽo/5!HnխF"Di )?k(% (1ǹv.-̀MF(/U3aQ 4rq?<A;x ܔ`0Ci\YK^y.W^Q#$X^a)@60 r</@W;x."5]\"a `3}|:zDaUF!o l4%:Fc$ /Hߙi,TJ R&H. K^͙#C&ZW&k3@qk>ry v¥H_J4kq!( K 32N`L;2-paZ ?eƩ#?I3mtg^K02{Eҩ7 PkO9matͣӉktem ]BKA(t|VwBF9jEJYk@,N\&VVW/ bvB0y?IB9*-M F1|6%֢9S=S ?6O3Bow1m#6lbAo$+"a9s9‡4TMX&'pc( m/_ˉ ݑeF"*ҋ4&7ZXτ dC֤OP&;ȐMFԐ#+,0A˰'TT,0!nj*&tf%&AI $-ӔM&f ьX:BdgO/X0jf-i:|$/QMd^vRR^Ac,.-d@}S kDrsL d~/cʭzf5%[h'P$@^SWE"|:_$|'4=3ջjC\0">9!P$ $R[+)1fV'KQ&i01H#/%>&^.S֗S_.BU@p(8Ifц䇝?ځtk<Y*2$baA1# hIĠIf<)幺؞ߏxާ?#*w E/"}V^ 8+]@,lFb`VΈz2 2$AI_5g&D* 8;IRu9hT ED==Ur%1` 'K t$p~[3J[z-oj"Zބ=Hrp!{*>!P@'J-1t"<|&H:2ZG @4NBH:)hpl"pL ljLpJBaHAB@54'@u%( "Y7HɈ$Fld @-tG̀{ʈ{\uH} <G AK#5iG( >Lr6|Ԇ}ݬ'y hD4d` G+9k9@9dLd$ ;bZ>icFL7P  4[l)w$&7̜3 f#`-$Co & b}hԣJDnw> _;ȂbD(z٘'d8KzV(CGYǯ%f08dTp LN?fJkȍ-,'wehD@tp9c$e3i`99.z_ L9 ^k}xSKMRɇK#b__N]IiōxyT"\TLO>X+`$RXIDbFV ζ'f݀4.[  #KBM'},YjRk}vH;c1U0|/H Av ,e SHy|`KKבpPU/AtD  HcAyxU #0 @X d#C=K*5a[ Po"Bp "3 3aU$_h S,Dn'RE:3nY'J2P=D]5U~|6oo=?chF1!a?OT'*dC3>r,}ȭw01兎Nf(QB>; td9Sk=?x$ fX*?nP1ma;I}#5Qu(}YtTѪ=RX!>  q׏_g#tU7/"aVR%̜!i$4ab>D! :Ïx"eBQ\ >(8>^@^É!҂@ҪfEn\9z y>2ՕsPʋ⣡: T~չ ZQN0fiS$E9X[L-kT_D["g1spL22{k67!Gܪ76GĂJp67b{/Nv 8UQ 9FVeLiβ 㰩 -9Ƴ#Ma M˷= @z55DtĥF Dǜk:r86x \11:^p_$DۍmL`dBQ# ~).Xj5l%l nT]'H/N)>'p=0݋dU2]ɬ]DR͒ }wW:ĸp&G4^s31iɸ-Teŝ|U"V?gSzqL5h;{ t_Ezr#ԡ6셤>9>,{cۗ>\"JTG]meDVPg e3M^x^=T Έ=Sq %yb ( U9:UK@duy}30fKx&ݫmY%W_<5l;j5B8I9U#7'1A7f ҌCzq=8$AE-c]1>m=d@kG<ΤzIaE1<Ğ2Kئ9Wų21=hG!$Z/"m.2[]Xd oN8TҖ߬ 33VlUTXp8U5 >Bㆪth AlV )lTj"mRl&'JΩM'1Zne:p9P~S=!l ho=!2@UDzAET«hÝ 1vJS-bJnWCҿ,qVY`ǿ.5_'Dgo!ID 2cu)NU,q/qG F.uLxԠս)u]{7ۈMgK@,B%8hU 5Wӭ] 2 R`n7Qň{C~D!#TIJNí=4T҆ʲ$ee6T|~xdoURj`1qD |h >!9X:p҈5ҭ'ψ"d "gC&b]VdO B0ox@Ĵ6]YA9SWgm͠$2H%t 5ZAS<3dF@I)PDΡm\/8G_D7A1;-3 <=zč%'&mTW`M"6*`EfW%u3s+E a5迀qnԾ*s*γ 02р˸JP D(=T#j3\Ap: _HYk~%3^C'MMj@a aBS.mu z읉VetF֞\?V4'gX,QD]IPT] [;?^E0q6{ (FLթUM <ֻᑒɭ1Οpa`k/ن43]iV]UH< x0BYz..n"I>CƐ YвD[v<DϤ2HDEt_7!\m@Dw'<Ǽ6($ Y2e| J aZaP l!Ŏ`*X>Ԟ@BW"Ep}̠Ba1!!q8_R{@ L#p)W!ItU4^Xmu;c91L3Xm o 8ckֆ2 H_pgVwf*aȖ, cu frc1d+^LvpSYVCLksr MMB ̤d^:2]M2 w^8p`>vujmy(nJĿ+q7erLh )@Lv:Ro:ҠVVtK*.?eio,4C]Zd1`bUvV*sL'q_;/D ʢsT}wP *&z,L{S20.<~9' ޾j^(&54<ۉkð뫔6NjyŗdiT=i%gEkA1/Sld!FY, 5OG!9*yஶ&I4;ZLRC jDѓw mvzBTo/br1wwcLlEX)B%E_e ckr.J>vλ_:辟hU($(K.@ZmYh:3mãڄqϻ{-ԩxqYIKm #M\ثL{ܗȽҏZyݔĈ+D>3A;t4 ,9 KZVKAEj*~jz/SGX,0yWcTnH[eJ?| Oj±ym辊x]M_ Ԁ-;)3"Fos. 壺'|re%DSp j0"ܘ<_MM$iVWpWi:iK5K;FlT [-(sٹTCn-.@hjQ]rEK:u7CC]{=)A0 0D :KΛ8y178>ݫV6Ym b|uPxUxJ(ՃֿT"6~SѡO?mK1='q,,UWhnV,2k!d[938t7OffNMS$U 9mgw]BݟD[hp:ؼ&gQ$T)xtc?1WjǍ:FW7)H6Z؟)p ,WMAzPA] KIGMj H@ EfOә/gԸYD%xVa/XY!}/:ʲ1ոH5aflRhY}+4}ysoO`,ĥcG kytu7ުu s>da#vN?< UG_; _'GEp^]:xI'mMЬYstjCl5N6Z>5vrr|ab!چv_D@83jjfb.ɳ=Tޮz\ts$q_?9K>x7Xx?^_h|" 68v ;?R38\/HrfX*:iuQ6eqWpONU4z_x=;ZhWe&nn-WhBi$`BY.Q #-ߎNP+>jF'd.NT-.YGP߈iU;l[\TLAtANAFp"K-j\ @lnQf9]U}!:Hˮw?L'ľmRbuQu|mzdB0E-bt\_ ZΫǭU'ȴɨցUqdZY:#|/$u/EDТCG/ 4z_li9%I!K#PO~.r2kM-֞Pe:j:G,.{6pϵӾ?WU/I4lJ_]oQViS৩Ez鰄W_29ռ?lԭJXsdFwDsBd ߋ㽞|0*2w ݌bs{..?VXOw6:1*Mof;hrAz x]ŀ"+jzvv oDl4f֪k 0@~tvJ) qM~h$$v1$<&uۛX?VMov Sv%R_8vF#Ztƥ6zT] kFvq__VńQD Np,:n byX&Fzў]z:E8}U>o[RtWG'cX.! U=3v6U*f?EMu"*M}ӞǍNVԹR7Tz'蟜Szu`JJbMq0:p]Nf0IʘٷԈ jU ^Eϩb30K:QE&!KwIҩCPZ ݧ:Zef]R}c{<ѻ1`T1ɩ]"FU e`IpzOpngb禨>znqeo:%]GGB39}[f(fgQ=?*5X^7!:PwwYy`o)Aa\1 T_jH]X^K2ټtݹ^HU ~ q 4JfgZh$%Ϭuaa1 vT'W 偗U.0U]HY{KoiSDɘ"̨cJګ~zgx׊#iCCPICC profilex}=H@_["U;8dh;Yq*BZu0 4$).kŪ "%/)=Ff8jN&lnU" L}NS_.γ9@}ӂqDU%t5Ҏ!1>)N?ar'O6nܑ1 !4|~کSp*k'8$4R(m5Z)Db;9~}hǡMO6s?JS° 8#l kcsf|_3 g\ee0$RJܼe[H@0T"B#:KWعС;BW+_nT\>jbs VOD"&fĴL 0 t?w@!0D!8@ɾDZu L8.Ӽ7/ʗ݌!D"v61MiJ7 .DנA 9nf*C]G+W_]0G-0:^sh*N,ŎGc6V´FEo/ M4a9>vű#8QB\d}(bg?[uc{J恙˖'x$8vFrTɄ~ȑC4s &FJl 4Dta3"JA+t. {~'6B/&O/C WΘE*A"A*b;:WgW'Fu7:R/R@ z'#{zVkxe{iO͹VŨsJROJ`BgMRJq N&JL&[& C!0L3b&8c"^[(n<)Ӱje8T$ʶbppl6ay@!F Tkۜ@^g\iq67-&N%;1TxE:k2|L&CP```K'NqF>̖-[pYTX*N<'ib/f3NVMϫidQ4Ͳ8C6d֯_m!HRDёi+ēQ8G*ȡT-7X"J,Ê|hX,)%axoB\eʕ,h*F4ż&@./͙6؉8DH,2Ԍ{n"|'Q;Ngϥa&asBƚYax2;!1LC_uuuaǣR}dZ3f͛73JCb"DcĤIP;kV5pG`i*p;o>vLz`4$mFk}A㥗^Bbwחv:~86l`Ϟ=E<Q»vI7+LXj Rtz,KFTTTM)8B)@:fܹ#>d2?dr-|䭷B"&2`LtE k4`Vd` ZbF, HM6QH$ʷg0<˗B۩例ðMӶ"&jg U &,5* xf}}}^O}SL8GySNP[[[>( CFha``^x۶<R޽ロEͣkr2iҤL4 9E^bJ) `TL)0,cT~azzzRi&/^L"iH?x 7K b1)1 1J3vX~xmg?YϟOgg'RRp]755O0vX֭[W6 &p]wêUFCbaPgHuڀ0Y`$NӰpB|I6mTVm$_d< RimmEb=mV5wu7n?; m!D&bU[!kkӼ(Dtt9W,n,=7FȲeXj߿vήf„ lذ+H$R#p}vF7{VZS3˛v(s>̆ Xt)l޼y|s; 'l7r vš4&2SA@)fhSg;7:Rq}v}뭷j@Fh0׭[[ZZ{!uw{~zu0c@۶Gj=s9^) VQ~O~R L^wwjpDjq h! 4*S~Yf O6MMM,Y׳e޵i 0hGv-zբMĉ%.\ /}KTTT0f7iՉֻm $M'<4>}t~@(_xE@FJ! K>4 x縸^H E+tY8o[Ђ ^-xoNok[ Ϣ5rY1;=+܂[x897`;BC(xFK{b&wIkn3&mO`>KN^`ln+2%u@fQ ,˺`oEaΓΓFz쉎 xE_>ZuiP{AE*69L3ا2GsL]8[6q];43pnoPޡֶ/2ҵ8bF+D1ϿXMhͿ=Le]ʺK_ 牴s{ɼ 8ۚe4O.h)<;8qP`P/ʱݬh=q _>'7'эNQ9=v ͲbT#^ooz`m ed6 Dwm|@bB[pq Y\@7onoay@ TO#GG!j<=c'ɶޅw(<+88y7i;y;/Q8({k*#5BVA! b& v>f1qƤr"CܼK!ɓ6#{q^e/,^mC`v1߯`={PS< ;F!$] <𝀭Ϧ~8ܼ/I&O![ ):~N':m每v֛ό^~n6p[d_]3i?c']UO!UeaAwߩ>*k+0m *TCUF3\6Љqg.܎*o4~\Tҥ!-eV~+IMR֓le5~,6%BCoA)CBPT)ڳWRT*cۣe}7T5]um)1c*D<0*@岄}!2 >4g %Ob*g:93WP똆iv٨;]XNCh OuG 25ˀ^B!E yUVIENDB`timekpr-next/resource/icons/timekpr-padlock-limited-red.svg000664 001750 001750 00000117777 13573525204 026175 0ustar00bezvfedubezvfedu000000 000000 padlock icon lock security secure padlock signs_and_symbols AJ Ashton AJ Ashton AJ Ashton image/svg+xml en timekpr-next/resource/icons/timekpr-64.png000664 001750 001750 00000031427 13716566163 022574 0ustar00bezvfedubezvfedu000000 000000 PNG  IHDR@@iqQzTXtRaw profile type exifxڭivdc ,9^~_HRRIU-Vdfd;/Rrm'd۟yy}x)=~zg} s_7zr"y=J\?Rgx%߯e~w?*VڙNۻ?򷏉9b~1O/z-F7|?=8~(zm;_F{ݍThD݆ '&Wվ:_'N>|/ !ka%/Cc;6|q.oOޞKf7/wlӾmźespe3OPM\&3768bf#9r]B&ٙc?5=vl8h@nLS]r(A/M8"Bn5J)?55bhSι䚛=K*R@nXS^:ZlVZm6z ̽[}kpfiYfm9ʫk&vu8⤓O9ϸڍ7|˭~Ƿ>^x-t]Zn'Y>c!y<^:gO)yN>{z )r`Yqc0߾o.o<swk{EP6}" >~dszŨ˾};Sܰdb;ݳ]j~0yQx9˝_zͫ4k>m~ӟwN$۪'&3y9p]yctw}p=k={`ֵ:F]hYyukF,g>η{f+zlPm(J ɎZv}WZM<{==N=]lmy '2!h8|*M1zS8s?\{> 7ƙ7}3S *+)~Xǭ{vZn3Yȓ/-XP) zɶ,"(9V/qsIOqI;! taySwe{[#Xzx s }g=Yͷ2]{0֎,R-ޟ!ҀFдwGB@HfazwHm2N&5ypaXYS1cNLxa@D^#4j*qm=㜽)b.ZF6ki NJoR^ {gqorcg0Vo>]\{L7~h{zOHcc9f^ɒ[xyh1A~46S01XggQ.$W䦻3I4$%at\Mbx]YnB/ӂR !txfE# L{~=\i}>7jQZǹqE4v$BJbpDMNFuG\I;'?kK+d*v5{[8*HLB0ϖ MԋY %{ѺDPH)w HS>zB-:y ֐zzht.8a[_2^{{E3: 0&)ٵJ<^H2~~E l&wH㕄p%ɽzJ@@>2!Ą;qj,O 7s) r@",F2Y#aQP}+2Y@;7d=o}&&GF䂆0Hlޝ;E5WH?}2YiD9$I%יEֶ)8r~㷸2-?[j!đjNF!Z&&UV5OpTNJGZ z ߼Q=ju-%I2 f dg<3(r-GR]S{> 79zT?,<s6j WbEӶ|Hye-Y$2H^CFIzbzGx:R)I{{i][h=&C=VPdHe6?KLAgӕ :~ElƅcOIhMıߝ@pnj]KS SM@? %(xvdO~)Zf&Glmv5 |{^RD ؑת\G.-ሾy7ouu)2Tĝ5dAΒY o5`npQw 5r2&+L$9\W6-A7Ioqb~U}|DYZՀN5t?hx{D_:p9 Ԗ0tN`C4*( N:eUvÑHêD֗$¬l)qgѽY঺jFϷoo bU_mjdbdӷ#'L(n,G"#E9} )j v<+`o~P t4VKTs'+$MBNߥ޲X3bӿzi!DXRSڊKIlkMlQY3:R>^UJ4ymеM"Ólj*% 6Dq\fx>yW6q42VL4Sm LLq\C)ݡ5z-:zKӖRD67*`m2 m4vbj $ޫ;5>pZm8iZI7 V 95[^VVC\gK)_p&NL <ŬV[Ҩj:]GSu L} (R!ZL:RTJ$BپlmM\w)}T7gE`@ 11c@lʫHCYVK[BEYFL608!Mmgci0Bʌ 0Y!>&jr]5tyDVt]FX4YVxe3zϯ›}xؑ$>ڬ7cWUVy"`腭YDMap0KQF2x~ILݏ(#Iy,:%(yð>Dv)ȩN@Ex&cӉw`u@*bw wB @4iz#Pٟ: bhru* a4!CdTuG+/-*"cOqE1iɱv5m׿`MiܴmFih h܇ 5U-ƦR+ͫ`F8Z!@M*= !,SG8T:)ЎmiBB~- Z#Top}dv+QG.j8))e$cy~Y^#r|_zV`z`s@OQM-V ?j0uGS:ׂQp4P(" U AK]P6I#5L\R+SXt%نTs_+iГ & 6o'%eDήW/57oȯP3E$e0m`{(։@N #\aojHn-' ZZ/}ZqCF'dQ;׺Rڋ$@P;hj i"Oz󧒠 QgJ%+)7m2[O IkTՅ("m:WG<"a1YQp!N%#@\QgL9<:)90v~d^pQ 5R!qs X2'y jԪGNE, >ٮI&-1jwh:(mD'M3k1\ڟ$S!R[?y9ToO%#H$uYդ?:*QBT.T&oZSZ叞*J=gtt]c!Dz@Ȉ[z> r~d;a{/s#]' Uٿ,N=reŅQ8{"k|nʹ@TItH a4PH%I}邮iHyԸZ:am yhT P m쀜 9aIU$)X2=A>Rڋ|!_G)qfp\۫`vx<>BFeW_c92tACDvֽiA<("mIT {Z`VfeA:Ӄ/}876QCњM `SA3H5zí!hޤ8Ts\r,Ɖ3Q¨ǿ}Ovl@yTR_>C[L[bFogQC=U*;X%Qj-(5Ma ]xЩ Ο\ߴTd]$04EFzW":0;VcK2~d ɚOC_hU6NQL"6f6)ɃϫC?ꭋ{Tڃ^ ,EB:Q-uT4:1юB񤛿{| G}Ppb(8:pᘐ,rb}41ul}I{6kWIbD#غ΍GW8k9rƾWw?!uQ772q|}uX=wChZم^sCņyp:$LxҋQءO8!ĥžmTsx'8Uk` ^a4e)pEݴiLs(`cd5UK*iCCPICC profilex}=H@_["U;8dh;Yq*BZu0 4$).kŪ "%/)=Ff8jN&lnU" L}NS_.γ9@Pimm=|Ͻ{{7?vwwv<ȑ# dҥ]5r!ܽ{|Ϳ=tPο[&`Z2;;(Q! ɰrJ( (HӔǏcǎgyÇ?200`~5\g??߸q}hnǏ396F2Gj R@Z ̄4/[Uh]k-f۶m/?w``,===,Yzst~f1ĵ*qd9%X) ZKI[&C1%h.bhioRd/+j9|x`'?kr8vCsLU8491y=zZ8-@ k,>bۖ\Ԍ9Çitr777oWJ`O}SdYz-dTeZoxtddľs|Mn[Х'#px8ټgϞݻ:|3ys皛>hy豏?S.8q K^IUٓTbEbŊlRadd{SSS/|W^-O:ŋO?};ߘ山{8|(o8nTfժUhx]Pxp 9/`;:W/+o1“(KC)ֆR9yӿl6}Soouxe_?oտr/?287wk#Ǐ1B/<l>+c 333811q8+:w/f3&''!Ľk׮m9vuu}8~͚5AX$cKb׃۷)JW^y%RʭW\I.\.o<d 133n0|bR9N< sW!^6Ƥ(Xb֭[z^(y$IBEyr4I455j*W (Ac iL6fimmh:H)C)%BgyH) b"y R )%|eR ¼9^HBξf*F.Ԑ+oB}VXk/gw8Cb8nk~P h)i+5].s Ӱ᜝tpXp8pZ f %$B4U"Ay(Vtq@v֋oåKܽkMC78̫/F LfAǼbΒV*D跎x>~GP)fj =>XFnrV"B1/@y % ^VJ1H;~釋b^v^'9qx^ґY\L R$'NtꁏJ-RgQZ%18~:#|Hd"ur9®.2_Dsbr"Z\㘠pTK3Dr9#C 1Rf7%Zy)%?vgucC(^^K0OccdEL`J]]xK⵷!K%%Q{50zq< / IS ,"1IaY.ߣb%C=y'ظq#;w$A6HߏriJH| d=xΡe+sY_ 6ˣ>Joo/7Zg8fٲeڵkR(xGٱcV`1ָ4mP2V~p,BSZڐJR(|rݻwK&K_7oG?j(axxo~w}DQWU{esO.̋!vfzT%W.v.p4):#=kj_l:|rAu ~l#<׿u/n:>sN w͗e⊅5G8ο|7iXZ< ud-ƏkCGNDF糏|]xfX}k}|+_ᩧtwwe˖"șrENoE!Z81ր]dÐ@I<6BN`;c۶ml۶UVo}ݻwuw ^qI5D&4EJbq5<A=cUf1md 5wwLPz81X7ĥ)5EՀ8M$H!$7|z5W(M)ZN6l\ӱ19l$$ L5R&+?'ċsH9GRC=J<4HS)h \qcd Ed-hQjj9BZZRdu!M5 %9lultABX11֡!|GOg"T!yl\[\<}#B!"|8K[Gtv>VxzH:$z5VȍSif}CJ`+F:Ł164F#t'h!\48Ųk7:K0ԂeQq;XcIW)' N< dZ8!n8#'5Zto㑭g-9̼3l4D`+(&3n܈߲JK6H jfaNūz b$R!|o pR"[6mT*r,FYN1"¸3Z!K%D!6*F8cBJɐkipU_ɱRHR Rrf!GMwwwg<ϳ9;00` ^$IPV 4M0 <Hc^'c1zB3$DIBSbIFHW,ֺۮ xJ(Ez>Yϣd(fW.τ4!Yp:%њ)$IRʤ7 icon lock security secure padlock signs_and_symbols AJ Ashton AJ Ashton AJ Ashton image/svg+xml en timekpr-next/resource/icons/timekpr-padlock-limited-yellow.svg000664 001750 001750 00000117772 13573525204 026731 0ustar00bezvfedubezvfedu000000 000000 padlock icon lock security secure padlock signs_and_symbols AJ Ashton AJ Ashton AJ Ashton image/svg+xml en timekpr-next/resource/icons/timekpr-48.png000664 001750 001750 00000034536 13716566163 022602 0ustar00bezvfedubezvfedu000000 000000 PNG  IHDR00W(zTXtRaw profile type exifxڭir丒sqsg6]%cpdVm61[ΖbwݿOx_|Que_o|?n>7 d7"~{orR»YVyĂV⃂;`YAxWۅu64xWk臑?ߙ߭oy͖ .û"W|||V=g?OcƢkl L2 %/OON\촃?51.;n߯MOj(c [ ~tO^Kfw/79S&r~يuy5ː7Ww^kϟ[(T#̕v<p.I!gzob\6\vx_ÎuVɍ\J~HC_>wgM8"LnUΊ1?%VbbJ)I-r)\@PbI%RjiPcM5Rkm7ZnZt>s ?ˆ#<ʨ> gyYg}0*vf;.!N8O9ӿz kzJו/SSNp3:-Wj:}Fͧv28`ZuO"g9t_*a[z#\}D 83\CRI;66K>C^iG\/3S~ι)֙]-o —Gu瞹nrt{fb.{ki rF؋8 ]f mݡ0^neVy,SR/\jsO/,gqSƊNr?vʚNǦ{b789qChgsrj\<AHǶXupkB'uQᵥՆhR wXz={n=^  +7+P䆔LҘXT% 1Db;/,tjX۝I0*#1QIY#Zt^#T\ l,,<A\ zvh'ɕ5rFB-;E|3s#Ʃ]\ ;`ǹ3p< rn~MyyR2$CM n)H".6\al.`#6Fcp3:?ɓn9E'5dvBv;oP'*RV a#ov#0PS6w|yX,#5jVk0A((Tz5dZ=o?q l*qq??*\%J| Ú(8.me'uDL $FM %b Ȱ) A`,d)K ub7KSȔ.HpWvI!cc 7%"T0>jS*VΛI2 [uRtr8@ pS€@ԉ Q3u;"XSR%[/Z7WNy0d| _&1] Ť0YG¯ nɀB>|.1;;>0V8Tƅ(dwC(dn9%7D'P/oawp [] " ~pw:5P VDuO ]tVʈ#!S0&lYPFj2&1#<Z/n<.5'\"aP A 0I =H8IA&H2D6G⳥'1NQpTM$DgM0^?fI_Bc^oj*rR'^d!1x)IWp0 0ú]4V%gR[R3k1READjPuvڢQe6gEϯ(Kh.N:ضo\@^Y7*DXxihi *Jii 5 ɧ"V  b?~ 'L h0Qoz)V%٬ɣŐ&<Gb ʹFG #i,*WFFd5Tɔ1% D,%< ulV]?pV ]`p@.鱠%=~Ug hBޑD.KH."ds"AdIz/!=f0J%*)$TDa]_wȁpjD}) }E4d{; M{FRK'݄&*)(]fS7&Fɾp  T[(fvII+xYjMEi! 67e ,XeHM!s>jQnt g;8HIԓk̳ŊʻRpk7]Y^!U )!6AuXP2RI2p "2< >p̃;jF|86o!oo?MRUǞȡIAJ"Q:Kc]XdzAAX*J.V࢐AI—IuWD(d?Ow::M 1T=v['^Z$mnJy_7JЕ8HB(u#_I-/x*bt Ț|6-uYjf uڣ>-#aA]3>&2O! -*1VP#S .R0(P(lG-iԔbDMTe*4E})*%S(&\?8gRK݃{=Ou`d MY<]ȣ{L`Xe9x1rfLW=6K] Z`<)} T@>P2ϐIJͽ' =|CvOnlW7XPa<Ty 1LY?}"Oٜg޶7j`m~z#7T f%^)y|6HE{.x^C=4%3/7O3oVr#6 ;$CX @R'"t`}p|(u$vYa؍jR7$vwѕ#cz5^p4g,Fwߠl(?ށ5S0W"b"RIvX.H/k̾V`~?~ubn[wwwGvC>߮9$ѣq_2yvw(Ys,RTޣ}ًIk^vt=̉+˽>]i7\5}_[TxU1<󘙗/_x&5}]S}P]Xx)| ^`^!. j}esfB.BnG!6 dЂ% jEi->DQwǓ[pA/74uH ")Ud i{ yk5;xyB= 56 ZRb"nufd 1*{QGwCs7R-0(c!QœɵQEìɹd@0Xed#e1APV5ѹ8T* C JO(7XU,=5RfgŠD 2}ťs#akHۦ*X֕y"H8PF?sRX.(~P#Pfc},yy-dAVs䠇ڡg2FG8ţ5TXtUd{7P(чχ!gy$$-wB߷zqK" VLg#75T RhQip܋Pa򬓫QIB ̧_T Ͳ,?H wnaeg+w$3#ҜCZ aM#“ގ$g"uZOkTڡJ8!yŎ)x#wI.(]TQ'Q0ցD2lH,.%nnNr}HTg|!Wi[&vͼZȏA,hp ("WvSDꁟFI-O .CfR<<@gc? 40+ QHr+L$QdN"2!t64DWKWNr.jV\AzAp2Ċ?7WyMص#&[, 8% XD;MJiKd1qIJzU;ՃgX}yM*%9rO% rgb-~kHfC̱lŠGjCa-eW{I[MeY"+kxO[qFr8HjMuHE$hE$} πZ3إ4`jQ-#C^luQ6;t+THWVT67rxړ2Yب6 Hk}bn\4pvӸՎvA6[屮QQT Ik@okD_ZFIEA(Z4 ;A}g%g T.;D[{X:3̿o?fQ-eۉ% ځJ4+f@5ʝ4%= G\4bv  E!f(S뎑_ ^ 2^oMڠHdIrBu*tY32<5ڲ%5ŃC,jxY/,T6@/`r>tneJ^Q9\VK&4QT& `yxb -ٹ٨cb98ys\aR>)9%'6 9%I`YJ2@N?(8EsUm[b%O6Φ,dfJS\ >0XUՀuHO^4?^Ҷհݐ_L\K`DL͢2v1\/r]W4'T{,i|r _s}1;TQ𵃟0,G.m7Qa:59 }2όZT FcJMrjCa0#V[%ץR o TF>A/&Tݼ$QEB36Ig1iE`Ak(U0A; v5JJH5W[6q%{GILTg'j`'0x" KU݃[gOSAgp.H1BXx4P*(A~9!afi,lhI #ir8 ZT2Վ׼#O~7Js=`$9$ڟD|_TCe}H`Rd]ͨ#'}AR]-8r.(Oz ֆ'(_Y;24C]q*ڀ b56!fvP?k$x,$Lm\Qgd#!Xg5%h~R5EtŖ#`(sіY(it$בCJB:HW@Lq9N[b/*5Ϥb3ՏV| M&ءx7aAGzJ aj].:2=j$ えe> ِڤ64ڵ=?(\ڈdy'\d ڒO $RO8G.)Z`+N.ehwB¾ l5vyD_!CGI} [uxoC`8h$\+ H %7Zƙ" dS-)fک6pqyt͘kW׆%J]ixX Z+:OY<ߍ}-_+0[!{Tq$3qch\#7:s¾f*@bSݑDS-̋0sY&"D.NV v!ɦoI\e%E,fj`K[jX vCB-DW9x *B!O< .u"!y*Pp֜y[O^u@4 m8ꭹK{/I;Fuͧ={b'W~KRAh>Fzu5@p{l9\Ǭ0;^c'L4=cWHR0Nj4(L` ,ـ@J:-_T_[5„ RH;V*|,QqhK;A,31aNFKf/+;&}Ke. %'X !Zތ)B'r0Hm^f "D]+ީ95f|OCi56w*G 4PnkhBca4j66sn5[d(ildmC 4ֺ`lGV:9h&e?HūXϤ!NHW0ச a!أ "cD1XܣB&#x:$8t 5C#{uRbᐊ>C; rԂ"^'ȡ$[6:vQ:³BðYPp$lE<4o f̀,t nU {$3w-=W"@k"*{ b.)"t Ol;q&jP𪥍V/F6ۢSg&ze=iY&qyH\,FmQM?_[ M@RzEBJ}w36? q(QiumV#]UNAWrBeg0&VNQ!dAe*#REq1Bly9hfV ލZM'F^)؍ ];*gӬXrƬ 'u`~ǯYs|Xy v5G zS!&ꈊ{ס"CdznOpݡ%.nC`@XUs;(2ڇz1qȑu&1!S @=?r[X"luM2$G|NpΈQvkbS&I.lhM[J?q_7ĿׄQH٪!;R񮧇u#1B{:W F>q/Xw$G<ùGPpŹ V]ڇONN; RG&~+S"E R :+ZP5̹]~ m;4TzpbY4M= B1j*=a%&7\@YM]g ͳ4 *VJW4_#'cwȡ隀jVɑ; (~/GN(Gw$Je]5He*m'o;9~@oH{̍{-pm]"8@HԖ /Fwlhx{`Ǫ?}Zn+lEo!/SVTrfmtM;ЖEL1Ρ^FIbMjT^'2|"tֻY,othȏxx [0iaښj}SW>M;QS|.+>/77s&$cY}64m$USϖ+N*yK]zJGVDtAl_&xҤl܎uD0~̿%Kk@-?RWU#㘝 0]^r -EpKTk9c!wGVд?CE5^1aH`+YV[UZ8%:u\*M^eT!WV(7֠8ZĪC{) By4sGv;3!6bXuu {q!Mm@?$5,C:E#t, `& ^+$XjpZ(nT#+ni(5FW!Վzf5VxloxSE,PGl`A&kg_N~oJ"2O5MD&9+ 5Tpa~NC"59/4lVp ܥ.Ld|t .9 r|C׵v˜ۨÇ73$Gz J*Y-= puM 9$P(\m7C7% ( _%G\Zgq۪JT^K9v9:¤'0L A9h$`8H.|*jmw&ytzDHMt60HQCu~d>JN)5mDNut+~H;Ư~* 'l8>Sj:/ZjK% q''uawi{{R`u.JP3_]d<V7tql&) KceUtz._u0ĺc!+GSABT; Ґj:ԱV^T"*:yğ8JI˺S*N*ΐ MV>޴i.>@#x`V:6n$][鷟!&aj3e4y~$4)b+K(iRG`$/+ϸz:ju'g8jp]N XLhVt{y "q8[6gWNFCFdUm4 VTxt/v)j.Wlһd*ٟ D>5y'G1"*"؄g֙rs^s"Hy0CRo ?| S5ʱ͌#6L9g%H|~'Md*cx(0{^]ա&YU&as s -tyNyBz.BC@ ee%jE~{lⶦdzU_[WIU$GCiUŧנV#A[&Rgcv/9Ey#ApADiCCPICC profilex}=H@_["U;8dh;Yq*BZu0 4$).kŪ "%/)=Ff8jN&lnU" L}NS_.γ9@%%]'OrQ JaIZdǐsQݻW^ymΝ;?Yk-7n7kbW:;޵v'E3n$ɤqFoo}=Ov|^x)v?ﺏ}*<)(../wtr: x1sY,ܾ}9s000 _2?Hplk{GFF?=ٶ J,S'uU:}T`BmƘ뻨ȋ=yXf K,'gۦʹu;,<*J3g.Hqpc6{+;]?l߾I&3fdL}v5|yӦJ@gdr;Z˿TWǮL̢i}}}gʹ33sZZ}vŊ#uuu, _X`˖-cҥ655Q*xunu{q~Sek^mݿRQ9GSS7x.֡/ "lْ]jgP::<ܒrbϞC{{_l{k.اV֭!srA`(F X)JNTAiLנY( "8D>Xc|NRi=H*3c&V*`-[=4Dr0GnG1ʃL½$Vb5e|Nv2slJDXs#g5 E*Ɵ5kpQh%nm80.R !%^u󰎋pd>LpRr2xi$|?iR1aLyzCֲU,IA.N yP 0!L3֒TBJ~z4LD*'iamMhQJ}O:PU\ҿ>ABUcYP} pqy@JQ7( S}/ӆ_OX Lvvv\I]c|kw` N`̄'FE$qDT§[(LE: ~rT*!fr7o-wbEXBN @pބF6IpmEq75 8%fY|gppCUAE<~r͕PWSF$1Z{1^a3.yx(kq%_ٳHeP(fQJaW_E8|C;;VH$DaH(Ð\&,-iww7u]ɽwAT66n{GZI8T*F[KX%)fbcfqPA$"FADl&h^²/ʕ+)Jlذ 6裏fz)/^ڵkWJ:$7~q ??uD9H!AhB` &УeDWs~DMeYoswe;3?ٮXz ޵F> N#µFUB \*g.8oܹ|[bݺu-0F !-c ҂U@%JHT,1rض FqCpUUո5nXP9ywУ蠂cD$zbR)"F"PM-71;@´3H/XcQJ|< *!~&Л{`d<KqwĩB)\b>&1$8dM-)D cIYSʴL2m۶I!XPSTc e0v ©Rlhd) D۱ LzdfJJrBz.|hEG:7\w\~پ};b߾}}:iBZj.!$vpa8!DRJ}"IZkW)3*d<ȑ{{\!'uֱe`5HcLX0At%@$ˉ$[!ظ:ZT+Յ 1ecL8 padlock icon lock security secure padlock signs_and_symbols AJ Ashton AJ Ashton AJ Ashton image/svg+xml en timekpr-next/resource/icons/timekpr-client.svg000664 001750 001750 00000033674 13573525204 023632 0ustar00bezvfedubezvfedu000000 000000 image/svg+xml timekpr-next/resource/icons/timekpr-padlock-limited-uacc.svg000664 001750 001750 00000127670 14017261747 026332 0ustar00bezvfedubezvfedu000000 000000 padlock icon lock security secure padlock signs_and_symbols AJ Ashton AJ Ashton AJ Ashton image/svg+xml en timekpr-next/resource/client/000775 001750 001750 00000000000 13476006650 020311 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/client/forms/000775 001750 001750 00000000000 14017261747 021441 5ustar00bezvfedubezvfedu000000 000000 timekpr-next/resource/client/forms/about.glade000664 001750 001750 00000007410 14017261747 023553 0ustar00bezvfedubezvfedu000000 000000 False About Timekpr-nExT False center-always True timekpr dialog False Timekpr-nExT 0.0.1 Copyright (c) 2018-2021 Eduards Bezverhijs Keep control of computer usage https://launchpad.net/timekpr-next Timekpr-nExT This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. In Debian, see file /usr/share/common-licenses/GPL-3 Eduards Bezverhijs <edzis@inbox.lv> Eduards Bezverhijs <edzis@inbox.lv> (Translations fine-tuning by JP Lord <jplord@gmail.com>) (English fine-tuning by Phil Hudson <phil.hudson@iname.com>) True custom False vertical 2 False start False False 0 True True 1 timekpr-next/resource/client/forms/admin.glade000664 001750 001750 00000777305 14017261747 023552 0ustar00bezvfedubezvfedu000000 000000 True False 3 gtk-new True False 3 gtk-new True False 3 gtk-new True False 5 gtk-add True False 5 gtk-apply True False 5 gtk-apply True False 5 gtk-justify-fill True False 5 gtk-remove 30 600 60 10 30 24 1 4 24 1 4 24 1 4 60 1 15 60 1 15 60 1 15 1 3 1 1 1 31 1 7 23 1 4 60 1 15 3 30 1 3 True False Remove excluded session type 3 gtk-delete True False 3 gtk-delete True False 3 gtk-delete 10 60 30 1 10 5 30 15 1 5 23 1 5 60 1 5 23 1 5 60 1 5 True False gtk-new True False gtk-delete True False gtk-refresh True False gtk-remove True False gtk-add True False gtk-add 24 1 4 24 1 4 True False gtk-remove True False gtk-new True False gtk-delete True False gtk-apply True False gtk-apply True False 5 gtk-revert-to-saved True False gtk-add True False gtk-remove 7 1 5 23 1 5 60 1 5 23 1 3 23 23 1 3 5 30 10 1 5 False Timekpr-nExT administration False timekpr-client True False vertical True False 5 True False Icon, isn't it? True False Icon, isn't it? start 30 30 20 20 128 timekpr-client 6 False True 0 True False Notes, read carefully ;) 10 10 This is the configuration app for Timekpr-nExT. It allows you to set time limits for your individual users as well as general Timekpr-nExT options. To use this application, you either have to execute it as superuser or have to be part of the timekpr group. Please note that the "Timekpr-nExT Configuration" is available in superuser (administrator) mode only! Please configure carefully: do not lock yourself out! True 75 False True 1 False True 10 0 True True True False Users related configuration vertical True False True False 10 Username: False True 10 0 False True 0 True False True False False List of usernames registered on the system 5 10 TimekprUserSelectionLS False True 1 0 False List of usernames registered on the system 15 False True 10 0 Restore True False True True Restore configuration from saved state 5 5 10 TimekprUserSelectionRefreshBTImage False True 1 False True 1 True True True False center center 5 5 5 5 True False start start 5 5 5 vertical 5 True False 5 5 Information about time left / spent True 35 False True 0 True False 5 5 True False Continuous time left. May span more than the current day (realtime, available when user is logged in) end Time left (actual): 0 0 True False Format: <days : hours : minutes : seconds> start 5 00:00:00:00 end 1 0 True False How long the user was inactive since last login (realtime, available when user is logged in) end Time inactive (actual): 0 1 True False Format: <days : hours : minutes : seconds> start 5 00:00:00:00 end 1 1 True False Time available today (saved stated, not real-time) end Time left (today): 0 2 True False Format: <days : hours : minutes : seconds> start 5 00:00:00:00 end 1 2 True False 5 5 5 0 3 True False Time spent today (saved stated, not real-time) end Time spent (today): 0 4 True False Format: <days : hours : minutes : seconds> start 5 00:00:00:00 end 1 4 True False Time spent this week (saved stated, not real-time) end Time spent (week): 0 5 True False Format: <days : hours : minutes : seconds> start 5 00:00:00:00 1 5 True False Time spent this month (saved stated, not real-time) end Time spent (month): end 0 6 True False Format: <days : hours : minutes : seconds> start 5 00:00:00:00 1 6 True False 5 5 5 1 3 False True 1 False True 0 True False 20 20 15 15 vertical False True 1 True False start 5 5 5 vertical 5 True False Allowance adjustments False True 0 True False vertical True False center 10 today's time True True False Choose this to adjust user's time allowance for today True True False True 0 PlayTime True True False Choose this to adjust user's PlayTime allowance for today True True TimekprUserConfTodaySettingsChoiceTimeRB False True 1 False True 0 True False 3 True True False hr 0 0 True True The number of minutes to be adjusted for today's limit 2 TimekprTodayMinAdjustment True if-valid 1 1 True True The number of hours to be adjusted for today's limit 2 TimekprTodayHrAdjustment True if-valid 0 1 True False min 1 0 False True 2 True False 3 3 True True False True True Add specified time (reward) TimekprApplyImageAddTime False True 0 True False True True Subtract specified time (penalty) TimekprApplyImageSubtractTimeImage False True 1 True False True True Set this specific time limit TimekprApplyImageSetTimeImage False True 2 False True 3 False True end 1 False True 2 True False 20 20 15 15 vertical False True 3 True False start start 5 5 5 vertical 5 True False 5 5 Information about PlayTime True 30 False True 0 True False 5 5 5 True False center 5 5 True False Actual PlayTime available today (realtime, available when user is logged in) end PlayTime left (actual): 0 0 True False Format: <hours : minutes : seconds> start 5 00:00:00 end 1 0 True False PlayTime available today (saved stated, not real-time) end PlayTime left (today): 0 2 True False Format: <hours : minutes : seconds> start 5 00:00:00 end 1 2 True False Active PlayTime activity count (realtime, available when user is logged in) end Running activities (actual): 0 1 True False Active PlayTime activity count (realtime, available when user is logged in) start 5 0 end 1 1 True False 5 5 5 0 3 True False 5 5 5 1 3 True False PlayTime spent today (saved stated, not real-time) end PlayTime spent (today): 0 4 True False Format: <hours : minutes : seconds> start 5 00:00:00 end 1 4 0 0 False True 1 False True 4 True False Brief information about time spent and everything related to time management for this day Info & Today False True False center 5 5 5 vertical True False 5 5 True False 5 True False 5 vertical True False 10 True False This lets you configure time limits. 5 Week day limits True 35 False True 0 True False end h True True False Choose hours to be adjusted for selected days. True True False True 0 m True True False Choose minutes to be adjusted for selected days. True TimekprUserTimeLimitsHrRB False True 1 True False True True True True Increase daily time allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment! TimekprUserTimeLimitsAddButtonImage False True 0 True True True Decrease daily time allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment! TimekprUserTimeLimitsRemoveButtonImage False True 1 False True 2 False True end 1 False True 0 True True True True in 265 105 True True Lists day of the week and additional information about the day's limit. Please enable / disable days for the user. TimekprWeekDaysLS multiple False True 1 False True 0 False True 0 True False 15 15 15 15 False True 1 True False True False 5 True False 3 True True True True in 175 105 True True Hour intervals for selected day available to the user. Option "∞" indicates that time spent during this interval will not be accounted towards the daily limit, it will be accounted as idle instead. Please note that if the day's limit ends at 24:00 and the next day's limit starts at 00:00, then the user can work continuously past midnight. Please note that multiple intervals cannot be configured within the same hour. An interval can start or end or contain a specific hour, but not more than once. This is by design, not a bug. TimekprHourIntervalsLS 0 0 1 True False 10 True False Hour intervals True 20 False True 0 True False True True True Create a new time interval that will be available to the user. After creating the interval, please edit its start and end times directly in interval list. TimekprUserConfDaySettingsSetDaysIntervalsAddButtonImage False True 0 True True True Delete the selected time interval from the available list of intervals. TimekprUserConfDaySettingsSetDaysIntervalsRemoveButtonImage False True 1 False True end 1 0 0 False True 0 True False end 10 vertical 5 True False center vertical 3 True False True False gtk-go-back 3 False True 0 True False center enter hour intervals center True word-char 10 10 False True 1 False True 0 True False 15 15 10 10 False True 2 False True 0 True False center vertical 5 verify True True True Verify configured time intervals. This is a mandatory step to ensure that intervals are correct. Intervals which have problems will be highlighted. TimekprUserConfDaySettingsSetDaysIntervalsVerifyButtonImage False True 2 False True 1 False True 1 False True 0 False True 2 True False 15 15 15 15 vertical False True 3 True False 5 5 5 vertical True False 5 vertical True False start Weekly and monthly limits True False True 0 True False end 5 10 True False d True True False Choose days to be adjusted for selected period. True True False True 0 h True True False Choose hours to be adjusted for selected period. True TimekprUserConfWkMonLimitsAdjustmentDayRB False True 1 m True True False Choose minutes to be adjusted for selected period. True TimekprUserConfWkMonLimitsAdjustmentDayRB False True 2 False True 1 True False True True True True Increase weekly or monthly time allowance by selected time unit (days or hours or minutes) for the selected period. TimekprUserConfWkMonLimitsAdjustmentsIncreaseButtonImage 0 0 True True True Decrease weekly or monthly time allowance by selected time unit (days or hours or minutes) for the selected period. TimekprUserConfWkMonLimitsAdjustmentsDecreaseButtonImage 1 0 False True end 2 False True 1 False True 0 True False 5 vertical True True True in 210 75 True True Weekly and monthly limits for the user. These limits are applied to user together with the rest of limit configuration. TimekprUserConfWkMonLimitsLS 0 False True 0 False True 1 False True 4 False True 0 Apply daily limits True False True True Apply limit all changes made in this page 5 5 TimekprApplyImageDailyImage False True 1 1 True False Daily limit configuration for all week days Limit configuration 1 False True False center 5 5 5 5 vertical True False Settings for PlayTime activities 5 5 10 True False 5 5 10 5 vertical 5 True False start center PlayTime options False True 0 True False 5 True 5 5 True False Enable PlayTime for selected user end Enable PlayTime: right True 30 0 0 True False Enable PlayTime override for selected user. This setting overrides time accounting in a way that time is accounted only when at least one of the applications on the PlayTime activity list are running! This affects only time accounting, intervals are still fully enforced! If no processes are running, time is accounted as idle thus effectively it's free time for user! end Enable PlayTime override: right True 30 0 1 True True False Enable PlayTime for selected user True 1 0 True True False Enable PlayTime override for selected user. This setting overrides time accounting in a way that time is accounted only when at least one of the applications on the PlayTime activity list are running! This affects only time accounting, intervals are still fully enforced! If no processes are running, time is accounted as idle thus effectively it's free time for user! True 1 1 True False Allow PlayTime activities during unaccounted ("∞") time intervals for selected user. This setting allows the user to use applications configured in his PlayTime activity list during time intervals which are marked as unaccounted ("∞"). If this setting is enabled, the use of activities will not be accounted towards PlayTime limits, otherwise applications in PlayTime activity list will be terminated as soon as they are started during unaccounted ("∞") time intervals. end Allowed during "∞" intervals: right True 30 0 2 True True False Allow PlayTime activities during unaccounted ("∞") time intervals for selected user. This setting allows the user to use applications configured in his PlayTime activity list during time intervals which are marked as unaccounted ("∞"). If this setting is enabled, the use of activities will not be accounted towards PlayTime limits, otherwise applications in PlayTime activity list will be terminated as soon as they are started during unaccounted ("∞") time intervals. True 1 2 False True 1 False True 0 True False 5 5 5 vertical True False 10 True False This lets you configure PlayTime limits. start PlayTime limits False True 0 True False end h True True False Choose hours to be adjusted for selected days. True True False True 0 m True True False Choose minutes to be adjusted for selected days. True TimekprUserPlayTimeLimitsHrRB False True 1 True False True True True True Increase daily PlayTime allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment! TimekprUserPlayTimeLimitsAddButtonImage False True 0 True True True Decrease daily PlayTime allowance by selected time unit (hours or minutes) for selected days. Please note, that you may select more than one day for the adjustment! TimekprUserPlayTimeLimitsRemoveButtonImage False True 1 False True 2 False True end 1 False True 0 True False True True True True in 265 115 True True Lists day of the week and additional information about the day's PlayTime limit. Please enable / disable days for the user and set time allowance for PlayTime activities. TimekprUserPlayTimeLimitsLS multiple 0 0 False True 1 False True 1 True False 5 5 5 vertical True False 10 True False start PlayTime activities False True 0 True False center True True True True Add new PlayTime activity. Please specify activity mask and user friendly description in the activity list directly. TimekprUserPlayTimeProcessesAdjustmentAddButtonImage False False 0 True True True Remove selected entry from PlayTime activities. TimekprUserPlayTimeProcessesAdjustmentRemoveButtonImage False True 1 False False end 1 False True 0 True False True True True True True in 310 90 True True Please specify a list of full process (executable) names without path as case sensitive strings to be monitored in the system. It's possible to specify RegExp masks for processes too, but please be very careful about them as misusing this setting may lead to killing unwanted processes for the user! NOTE: RegExp is an expert setting! TimekprUserPlayTimeProcessesLS 0 0 False True 1 False True 2 False True 0 Apply PlayTime configuration True True True Apply PlayTime limits and configuration changes on this page TimekprUserPlayTimeProcessesApplyImage False True 1 2 True False PlayTime configuration 2 False True False center center 10 10 5 5 vertical True False start 5 5 Additional configuration options False True 0 True False 5 5 10 True False start start 5 5 20 5 5 5 True False Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments. end Track inactive sessions: right True end 35 0 0 True True False Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments. start 0 True 1 0 True False Select whether to show Timekpr-next's padlock icon and notifications to the user. Please note that unchecking this will disable showing all information and notifications to the user! end Hide icon and notifications: right True end 35 0 1 True True False Select whether to show Timekpr-next's padlock icon and notifications to the user. Please note that unchecking this will disable showing all information and notifications to the user! start 0 True 1 1 False True 0 True False 15 15 15 15 vertical False True 1 True False start center 5 5 5 5 5 True False Select a restriction / lockout type for the user. NOTE: please be very careful, think ahead and read every options description when changing this setting from default value! end Restriction / lockout type: right True end 35 0 0 True False False vertical terminate sessions True True False When time ends, user sessions will be terminated. This option is a restriction! This is the default option and most likely is the one you need! start True True False True 0 shutdown computer True True False When time ends, computer will be shut down. This option is a restriction! Please evaluate whether you need this type of restriction! start True True TimekprUserConfAddOptsLockoutTypeTerminate False True 1 suspend computer True True False When time ends, computer will be suspended (put to sleep). This option is not a restriction and is more suited for self control purposes. When woken up when there is still no time left, computer screen will be locked and put to sleep again after some time. start True TimekprUserConfAddOptsLockoutTypeTerminate False True 2 suspend / wakeup computer True True False When time ends, computer will be suspended (put to sleep) and will be woken up at start of next available time interval for the user. This option is not a restriction and is more suited for self control purposes. When woken up when there is still no time left, computer screen will be locked and put to sleep again after some time. start True TimekprUserConfAddOptsLockoutTypeTerminate False True 3 lock screen True True False When time ends, computer screen will be locked. This option is not a restriction and is more suited for self control purposes. start True TimekprUserConfAddOptsLockoutTypeTerminate False True 4 1 0 True False end 5 5 vertical False Select a time interval when computer can be woken up automatically. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI! end Wakeup hour interval: end False True 0 True Enter start hour for the automatic wakeup function. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI! 2 2 TimekprWakeUpHourFromAdjustment True if-valid False True 1 True Enter end hour for the automatic wakeup function. Please note that this option is only effective if wake up by RealTime Clock is supported and enabled in BIOS / UEFI! 2 2 TimekprWakeUpHourToAdjustment True if-valid False True 2 2 0 False True 2 False True 1 Apply configuration True True True Apply additional configuration changes on this page TimekprUserPlayTimeProcessesApplyImage1 False True 2 3 True False Additional configuration Additional options 3 False False True 2 True False Users related configuration User Configuration False True False Timekpr-nExT related configuration center center 10 10 5 5 vertical 5 True False True False 5 5 vertical 5 True False 5 5 Control Timekpr-nExT Settings True 30 False True 0 True False 5 5 5 5 True False True Timekpr-nExT log level. Please do not change this unless you have to. You likely won't find anything pretty in the log files. Values are: 1 - standard, 2 - debug, 3 - extra debug 1 TimekprLoglevelAdjustment True if-valid 1 5 True False Session polling time granularity which specifies how often user sessions and activity are checked and accounted. 3 - 5 seconds are optimal, don't change this if unsure. end Poll interval 0 3 True False True Specify the time in seconds when Timekpr-nExT starts continuous real-time countdown before enforcing a restriction / lockout to user's sessions. 2 TimekprWarningAdjustment True if-valid 1 2 True False This specifies the rate in seconds at which actual user state is saved to disk. To improve performance and still have great accuracy, Timekpr-nExT accounts time in memory at "Poll interval" frequency, this setting defines a frequency at which user state is saved to disk for permanent storage. end Save time 0 4 True False True Session polling time granularity which specifies how often user sessions and activity are checked and accounted. 3 - 5 seconds are optimal, don't change this if unsure. 2 TimekprPollingAdjustment True if-valid 1 3 True False Number of seconds left for user before enforcing a configured restriction / lockout to his sessions. After this is reached and user is still active, the user's sessions will be handled according to specified restriction / lockout, and almost nothing can be done to prevent it. end Termination time 0 1 True False True This specifies the rate in seconds at which actual user state is saved to disk. To improve performance and still have great accuracy, Timekpr-nExT accounts time in memory at "Poll interval" frequency, this setting defines a frequency at which user state is saved to disk for permanent storage. 2 TimekprSaveAdjustment True if-valid 1 4 True False True Number of seconds left for user before enforcing a configured restriction / lockout to his sessions. After this is reached and user is still active, the user's sessions will be handled according to specified restriction / lockout, and almost nothing can be done to prevent it. 2 TimekprTerminationAdjustment True if-valid 1 1 True False Specify the time in seconds when Timekpr-nExT starts continuous real-time countdown before enforcing a restriction / lockout to user's sessions. end Countdown time 0 2 True False Timekpr-nExT log level. Please do not change this unless you have to. You likely won't find anything pretty in the log files. Values are: 1 - standard, 2 - debug, 3 - extra debug end Log level 0 5 True False Number of seconds left for user's available time before sending a final critical notification that time is about to run out. NOTE: the rest of the notification times are configurable per user by user in client application! end Final notification 0 0 True False True Number of seconds left for user's available time before sending a final critical notification that time is about to run out. NOTE: the rest of the notification times are configurable per user by user in client application! 3 TimekprConfigurationFinalNotificationAdjustment True if-valid 60 1 0 False True 1 False True 0 True False 5 5 vertical True False 5 5 Control Timekpr-nExT tracking items end 60 False True 0 True False 5 5 5 5 True True False vertical 5 True False start Tracked Sessions True 17 False True 0 True False end True True True Add tracked session type to the list TimekprAddTrackedSessionsImage False True 0 True True True Remove tracked session type from the list TimekprRemoveTrackedSessionsImage False True 1 False True 1 True True in 130 100 True False True List of session types to be tracked. Please, do not change or experiment with this unless you actually (not wishfully) know what you are doing. True TimekprTrackingSessionsLS False True 2 False True 0 True False vertical 5 True False Excluded Sessions True 17 False True 0 True False end True True True Add an excluded session type to the list TimekprAddExcludedSessionsImage False True 0 True True True Remove an excluded session type from the list TimekprRemoveExcludedSessionsImage False True 1 False True 1 True True in 130 100 True False True List of sessions to be excluded from tracking. Please, do not change or experiment with this unless you actually (not wishfully) know what you are doing. True TimekprExcludedSessionsLS False True 2 False True 1 True False vertical 5 True False Excluded Users True 17 False True 0 True False end True True True Add a user to the exclusion list TimekprAddExcludedUsersImage False True 0 True True True Remove a user from the exclusion list TimekprRemoveExcludedUsersImage False True 1 False True 1 True True in 130 100 True False True List of users excluded from tracking. Please specify actual usernames, not real names here. For example, "jsmith", not "John Smith". True TimekprExcludedUsersLS False True 2 False True 2 False True 1 False True 1 True False 5 vertical True False start 5 5 Additional options 25 False True 0 True False 5 5 10 5 5 5 True False This setting controls whether PlayTime functionality is enabled. This is a PlayTime master switch, if it's turned off, it's turned off for everyone regardless of individual settings! end PlayTime enabled: right True 20 0 0 True True False This setting controls whether PlayTime functionality is enabled. This is a PlayTime master switch, if it's turned off, it's turned off for everyone regardless of individual settings! True 1 0 True False This setting controls whether PlayTime activity monitor will use process command line, including arguments, for monitoring processes (by default only uses the process name). When this setting is enabled Timekpr-nExT will perform a match against full command line up to 512 characters enabling enhanced process monitoring capabilities. Please be careful and double check your RegExp patterns in each individual user's PlayTime activity masks! end Enhanced activity monitor: right True 20 0 1 True True False This setting controls whether PlayTime functionality is enabled. This is a PlayTime master switch, if it's turned off, it's turned off for everyone regardless of individual settings! True 1 1 False True 1 False True 2 False True 0 Apply Timekpr-nExT settings True False True True Apply all Timekpr-nExT settings at once 5 TimekprApplyImageAdminSettingsImage False True 1 1 True False Timekpr-nExT Administration Configuration Timekpr-nExT Configuration 1 False False True 1 True False 150 True False Status of Timekpr-nExT admin client 10 10 5 5 vertical False True 0 True False Status of Timekpr-nExT admin client 10 10 5 5 vertical False True 1 False True 2 timekpr-next/resource/client/forms/client.glade000664 001750 001750 00000365375 14017261747 023740 0ustar00bezvfedubezvfedu000000 000000 True False 3 gtk-new True False 3 gtk-new low Information warning Warning important Severe critical Critical True False 3 gtk-delete True False 3 gtk-delete 1 3 1 1 1 30 1 10 30 1 10 False True Timekpr-nExT client False center True timekpr-client normal False True 5 5 5 5 vertical False True expand True False start True False False Status of Timekpr-nExT client start 10 10 vertical True True 0 True True 0 True False end True gtk-apply True False True True Save all changes True True True 1 gtk-close 100 True True True Close the window True True True 2 True True 1 True True 1 True False True False vertical True False True False start 0 True False Icon, isn't it? start 30 20 64 timekpr-client 6 True True 0 True False 5 5 5 5 True False center end 15 5 True False Current effective username Username: start True True 0 True False Current effective username end True True 1 True True 1 False True 0 True False True True True False center 5 5 5 5 True False start 10 vertical 5 True False start Current statistics False True 0 True False start 5 5 7 5 True False Time spent this session or after Timekpr-nExT has been restarted end Time spent (session): True 30 0 0 True False Format: <days : hours : minutes : seconds> start 00:00:00:00 start 1 0 True False Format: <days : hours : minutes : seconds> start 00:00:00:00 1 3 True False Time inactive this session or after Timekpr-nExT has been restarted end Time inactive: True 30 0 1 True False Format: <days : hours : minutes : seconds> start 00:00:00:00 1 1 True False Continuous time left to you. May span more than the current day. end Continuous time left: True 30 0 3 True False Total time available left today in a row, up to the end of the day end Time left today: True 30 0 2 True False Format: <days : hours : minutes : seconds> start 00:00:00:00 1 2 False True 1 0 0 True False True True False True 5 True False True True in 170 True True These are the days and limits that are available to you timekprAllowedDaysDaysLS False False 0 False horizontal 0 1 True False start Days & Limits 0 0 False True 0 True False True 5 True False True True in 115 True True This shows the time intervals that are available for use. Option "∞" indicates that time spent during this interval will not be accounted towards the daily limit, it will be accounted as idle instead. timekprAllowedDaysIntervalsLS False False 0 False horizontal 0 1 True False start Intervals 0 0 False True 1 1 0 True False Daily limits False True False center 5 5 5 5 15 True False vertical 5 True False start Additional statistics False True 0 True False 5 5 7 5 True False Time spent this week end Time spent (week): 0 0 True False Format: <days : hours : minutes : seconds> start 00:00:00:00 start 1 0 True False Time spent this month end Time spent (month): 0 1 True False Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments. end Track inactive: 0 2 True False True False Select whether inactive session time is counted. If this is unchecked, time spent in console (not terminal emulator) login sessions and while the screen is locked is NOT taken into account. This varies among desktop environments. 0 True 1 2 True False Format: <days : hours : minutes : seconds> start 00:00:00:00 start 1 1 False True 1 0 0 True False vertical 5 True False start Additional limits False True 0 True False 5 5 7 5 True False Time limit for this week available to you end Time limit (week): 0 0 True False Format: <days : hours : minutes : seconds> start 5 00:00:00:00 start 1 0 True False Time limit for this month available to you end Time limit (month): 0 1 True False Format: <days : hours : minutes : seconds> start 5 00:00:00:00 start 1 1 False True 1 1 0 1 True False Additional limits 1 False True False center 5 5 5 5 True False start 15 vertical 5 True False start Current PlayTime statistics False True 0 True False 5 5 7 5 True False Total PlayTime available left today end Time left today: 0 3 True False Format: <days : hours : minutes : seconds> start 00:00:00:00 1 3 True False Total PlayTime spent today end Time spent today: 0 2 True False Format: <days : hours : minutes : seconds> start 00:00:00:00 start 1 2 True False True False This option overrides the default time accounting. If it's checked, the time is accounted only when activities in "Activity / application list" are running, the rest of the time is considered idle. 0 True 1 0 True False This option overrides the default time accounting. If it's checked, the time is accounted only when activities in "Activity / application list" are running, the rest of the time is considered idle. end Time limit override: fill True 20 0 0 True False Number of currently active PlayTime activities end Running activities: 0 4 True False Number of currently active PlayTime activities start 0 1 4 True False Allow activities during unaccounted ("∞") time intervals. This setting allows to use applications listed in "Activity / application list" during time intervals which are marked as unaccounted ("∞"), if the setting is not enabled, none of activities are allowed to run! end Allowed during "∞": fill True 25 0 1 True False True False Allow activities during unaccounted ("∞") time intervals. This setting allows to use applications listed in "Activity / application list" during time intervals which are marked as unaccounted ("∞"), if the setting is not enabled, none of activities are allowed to run! 0 True 1 1 False True 1 0 0 True False 5 True False True True in 170 True True These are days and limits that available to you as part of PlayTime activity restrictions timekprPTAllowedDaysLimitsDaysLS False False 0 False horizontal 0 1 True False start Days & Limits 0 0 1 0 True False 5 True False True True in 215 True True This shows activities / applications which are part of PlayTime restrictions timekprPTAllowedDaysLimitsActsLS False False 0 False horizontal 0 1 True False start Activity / application list 0 0 2 0 2 True False PlayTime limits 2 False True False center 10 10 5 5 5 5 True True False 10 True True True True in 250 90 True True Configuration for personalized notifications about available time. Please configure notifications as you see fit. However, please keep in mind that there will be two types of notifications that cannot be personalized: a final warning some time before time ends and a countdown notifications when time is about to end. The configuration "Time" value indicates a value of time left when notification will be shown, the "Importance" option governs an icon colour and notification properties as follows. Information - a green icon and an informational notification will be shown Warning - a yellow icon and an informational notification will be shown Severe - a red icon and important notification will be shown Critical - a red icon and critical notification will be shown, this notification usually is shown over all open applications and stays open until dismissed, however this behaviour highly depends on Desktop Environment in use TimekprUserNotificationConfigLS 0 0 1 True False 5 True False Notification configuration True 25 False True 0 True False True True True Add new notification threshold to the list TimekprAddTrackedSessionsImage False True 0 True True True Remove notification threshold from the list TimekprRemoveTrackedSessionsImage False True 1 False True end 1 0 0 0 0 True False 10 True True True True in 250 90 True True Configuration for personalized notifications about available PlayTime. Please configure notifications as you see fit. The configuration "Time" value indicates a value of PlayTime left when notification will be shown, the "Importance" option governs an icon colour and notification properties as follows. Information - a green icon and an informational notification will be shown Warning - a yellow icon and an informational notification will be shown Severe - a red icon and important notification will be shown Critical - a red icon and critical notification will be shown, this notification usually is shown over all open applications and stays open until dismissed, however this behaviour highly depends on Desktop Environment in use TimekprUserPlayTimeNotificationConfigLS 0 0 1 True False 5 True False PlayTime notification configuration True 30 False True 0 True False True True True Add new PlayTime notification threshold to the list TimekprAddTrackedSessionsImage1 False True 0 True True True Remove PlayTime notification threshold from the list TimekprRemoveTrackedSessionsImage1 False True 1 False True end 1 0 0 1 0 True False 0 1 True False 1 1 3 True False Notifications 3 False True False center center 5 5 5 5 20 True True False Select whether to use speech notifications, if available. You may be able to make speech notifications available by installing package "python3-espeak". 0 True True False Use speech notifications True 35 0 3 True False True True This sets the logging level. Please do not change this unless you know what you're doing. 2 2 timekprLogLevelLimitsADJ 1 True True 1 False True 0 True False This sets the logging level. Please do not change this unless you know what you're doing. 5 Logging level fill True 30 False True 1 1 3 True True False Specify whether to show a notification when limit configurations or allowance changes 0 True True False Show limit changes True 35 0 2 True True False Specify whether to show all notifications. If unchecked, then only important ones are shown. 0 True True False Show all notifications True 35 0 1 True True False Specify whether to show seconds in notification area. Some desktop environments, like KDE5, do not support text besides notification icons. 0 True True False Show seconds in notification area True 35 0 0 True False True True This sets how long a notification is shown for regular notifications about time left and configuration changes. The value is specified in seconds. A value of 0 means show until dismissed (not recommended for regular notifications). Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification. 2 2 timekprNotificationTimeoutADJ 1 True True False True 0 True False This sets how long a notification is shown for regular notifications about time left and configuration changes. The value is specified in seconds. A value of 0 means show until dismissed (not recommended for regular notifications). Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification. 5 Notification timeout (sec) fill True 30 False True 1 1 1 True False True True This sets how long a notification is shown for "Critical" notifications about time left (when the icon turns red). The value is specified in seconds. A value of 0 means show until dismissed. Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification. 2 2 timekprNotificationTimeoutCriticalADJ 1 True True 1 False True 0 True False This sets how long a notification is shown for "Critical" notifications about time left (when the icon turns red). The value is specified in seconds. A value of 0 means show until dismissed. Please note that the desktop environment you use may override this timeout, in which case this setting will not have any effect on notification. 5 Critical notification timeout (sec) fill True 30 False True 1 1 2 True True False Select whether to use sound "bell" (short notification sound) to announce a new notification from Timekpr-nExT. This works only for enabled notifications. If this setting is not editable, your environment does not advertise sound notification support. 0 True True False Use sound "bell" for notifications True 45 1 0 4 True False Configuration 4 False True True 1 0 0 False True 1